可见性( visibility) 个标识符的某关联称为在某子程序中是可见的,如果它 是该子程序引用环境的一部分, 个关联存在,但不是当前执行子程序的引用环境的一部 分,则称为对该子程序是隐藏的。通常隐藏是由于标识符 的重定义而产生 动态作用域 每个关联有一个动态作用域,该域是程序执行的一部分, 该关联存在于其引用环境中。某关联的动态作用域由它在 其中可见的子程序激活所构成。 引用操作 基调为: ref-op: id X referencing-environment >data-object or subprogram 局部、非局部和全局引用 分别对应局部环境、非局部环境或全局环境
•可见性(visibility) 一个标识符的某关联称为在某子程序中是可见的,如果它 是该子程序引用环境的一部分。 一个关联存在,但不是当前执行子程序的引用环境的一部 分,则称为对该子程序是隐藏的。通常隐藏是由于标识符 的重定义而产生。 •动态作用域 每个关联有一个动态作用域,该域是程序执行的一部分, 该关联存在于其引用环境中。某关联的动态作用域由它在 其中可见的子程序激活所构成。 •引用操作 基调为: ref-op: id×referencing-environment →data-object or subprogram •局部、非局部和全局引用 分别对应局部环境、非局部环境或全局环境
数据对象的别名 在生命期中,数据对象可有多个名字,即可能有几个关 联存在于不同的引用环境,每个为数据对象提供不同的 名字。如: 数据对象“按引用传递”—有形参名和原来名 数据对象可变成另一对象的元素—具有复合名。 当某数据对象在某单个引用环境中可通过多个名字可见 每个名字称为数据对象的别名 个数据对象有多个名字,但在每个引用环境中是唯 的,则不会有什么问题。 然而,在同一引用环境中用不同名字引用同一对象可能 对用户和语言实现者均产生严重问题
•数据对象的别名 在生命期中,数据对象可有多个名字,即可能有几个关 联存在于不同的引用环境,每个为数据对象提供不同的 名字。如: 数据对象“按引用传递”——有形参名和原来名 数据对象可变成另一对象的元素——具有复合名。 当某数据对象在某单个引用环境中可通过多个名字可见, 每个名字称为数据对象的别名。 一个数据对象有多个名字,但在每个引用环境中是唯一 的,则不会有什么问题。 然而,在同一引用环境中用不同名字引用同一对象可能 对用户和语言实现者均产生严重问题
图74有两个 Pasca程序 其中某整数变量有两个名I,J(在执行中不同点) 在第一个例子中,没有别名发生,因为没有Ⅰ、J同时用在同 子程序中的情形。第二例子中,在subl中,Ⅰ、J是同一对 象的别名,Ⅰ是按引用传递。 别名带来的问题之一是理解困难 如:X:=A+B Y: =C+D Ⅹ、Y的赋值是独立的,顺序可以互换。如Ⅹ不在以后引 用,则第一个赋值还可被删去 但如X和C是别名,则两个赋值实质上互相依赖,重排序 或删去均有麻烦 别名给实现者带来的问题是类似的,因为为了优化目的 而进行的步骤重排序和删去不需要步骤均是困难的
图7-4有两个Pascal程序。 其中某整数变量有两个名I,J(在执行中不同点)。 在第一个例子中,没有别名发生,因为没有I、J同时用在同 一子程序中的情形。第二例子中,在sub1中,I、J是同一对 象的别名,I是按引用传递。 别名带来的问题之一是理解困难。 如:X:=A+B Y:=C+D X、Y的赋值是独立的,顺序可以互换。如X不在以后引 用,则第一个赋值还可被删去。 但如X和C是别名,则两个赋值实质上互相依赖,重排序 或删去均有麻烦。 别名给实现者带来的问题是类似的,因为为了优化目的 而进行的步骤重排序和删去不需要步骤均是困难的
PASCAL中的别名 program main(output) program main(output) procedure Sub1(var J: integer) var I: integer; begin procedure Sub1(var J: integer) /*J is visible, I is not begin end / I and J refer to same"/ procedure Sub2 end:/ data object here/ var I: integer; procedure Sub2 begin var I: -integer: begin Sub1(0; /'I is visible, J is not"/ Sub1(); /'I is visible, J is not end: begin end begin sub2/ Neither is visible’ Sub2/*I is visible, J is not/ end end (a)No aliasing (b)I and J are aliased in Sub1
PASCAL中的别名
静态和动态作用域 如前所述,某标识符关联的动态作用域是在执行中关联可见 的子程序激活的集合。 动态作用域总是包含这样的子程序激活,在其中关联被创建 作为局部环境的一部分。它也可能作为非局部关联在其他程 序激活中可见 动态作用域规则—根据程序的执行,定义每个关联的动态 作用域。 例如,一个典型的动态作用域规则陈述:在子程序P的激活 中创建的某关联的作用域不仅包含该激活,还包含被P调用 的、或传递调用的子程序的激活,除非后面的激活定乂新的 局部关联隐藏了以前的原始关联 根据这个规则,关联的动态作用域和子程序激活的动态链有 关系
静态和动态作用域 如前所述,某标识符关联的动态作用域是在执行中关联可见 的子程序激活的集合。 动态作用域总是包含这样的子程序激活,在其中关联被创建 作为局部环境的一部分。它也可能作为非局部关联在其他程 序激活中可见。 动态作用域规则——根据程序的执行,定义每个关联的动态 作用域。 例如,一个典型的动态作用域规则陈述:在子程序P的激活 中创建的某关联的作用域不仅包含该激活,还包含被P调用 的、或传递调用的子程序的激活,除非后面的激活定义新的 局部关联隐藏了以前的原始关联。 根据这个规则,关联的动态作用域和子程序激活的动态链有 关系