粗粒度
作用域:划分程序正文中出现的对象,控制划分之间的可见性。全集——划分成各个不相交集合(互不可见),或划分出一块子集(嵌套)
作用域是对象起作用的正文区域,但对象的语义可能提前结束了,
所以作用域是对象语义的不精确划分
更多的是将对象分组(区别开不同使用范围的对象,而非对单个对象划出精确的使用范围)
从集合的角度来说,作用域是一组变量语义范围的并集,然后将每个对象的语义范围都映射到这一并集上。
细粒度的内存控制
回收(只有堆?):(提升语义精度)高效使用空间。引用计数(语句副作用),或删除不可达(反向索引)。
利用作用域打包回收?:java
划分(权限控制)
另一方面,作用域可以成批考虑对象(按作用域区分对象)
不同作用域之间的相互访问控制(权限):导入(访问别的作用域)导出(提供给别的作用域访问)
#只需考虑嵌套关系下的互访问
特例:跨作用域
同一变量,需要跨作用域保持语义(细粒度:单个变量。粗粒度:作用域:一块代码中出现的变量)
1.同一函数,调用之间保持:static静态
2.堆作为中转,独立于各个调用,全局保持(替代方案:作为参数传递(代价);使用全局变量(生存期过长)?)
声明——定义;定义类型——实例化对象
声明(指定作用域)与定义(编译所需信息)
调用顺序的不确定性(以及分支与循环)用状态转移图解释?
为什么栈不使用大小可变的对象?
1.效率
2.语义精简,与堆分工明确
块,流程控制块,类,函数的作用域(细粒度的权限控制)
通过引入相应的作用域,完成屏蔽与内存管理、权限管理
并各自实现细粒度的权限控制
1.块引入了嵌套的作用域
2.流程控制作为一个整个块还是嵌套块?
2.类与函数使用块的方式引入各自的作用域(为什么python没有类作用域)
流程控制:引入非线性地执行,用块替换一对goto包围语句块
函数:流程控制+局部变量(用完就丢)完成功能
形参:允许定制化流程控制
返回参数+形式参数:代码块的最小暴露
职能:修改参数(副作用)/返回值(调用表达式)
栈作用域:同时存在多个实例,用线性结构与线性访问相邻单元
结构体:相关变量打包,提供一致入口(限定符)
类:结构体(成员集合)+成员修改+成员访问控制
类型的实例:
作用域:实例化声明所在作用域。自定义类型——内置类型的实例保持语义一致
类型对象:
作用域:类声明所在作用域。
引用环境的约束
作用域规则确定了 语句的引用环境(变量字典)——作用域作为变量字典
何时填入字典