每个声明或标识符的其他定义有一定作用域,称为静态作用 域。例如:图7.3中 在C:=C+B语句中,B、C的引用是和特定的C、B声明 (作为变量或形参)相连系的,但到底采用哪个声明? 个声明的静态作用域是程序文本的一部分,这里标识符的 使用是对该标识符的特定声明的引用。 静态作用域规则——决定声明的静态作用域 如 Pascal中的规则:P中X的引用指定X在P中头部的声明, 如不在这里表明,则指向子程序Q(Q的声明包含P的声 明)中头部的X声明,如此继续 静态规则将程序文本中的引用和名字声明相连系。 动态规则将程序执行中的引用和名字关联相连系
每个声明或标识符的其他定义有一定作用域,称为静态作用 域。例如:图7.3中 在C:=C+B语句中,B、C的引用是和特定的C、B声明 (作为变量或形参)相连系的,但到底采用哪个声明? 一个声明的静态作用域是程序文本的一部分,这里标识符的 使用是对该标识符的特定声明的引用。 静态作用域规则——决定声明的静态作用域 如Pascal中的规则:P中X的引用指定X在P中头部的声明, 如不在这里表明,则指向子程序Q( Q的声明包含P的声 明)中头部的X声明,如此继续。 静态规则将程序文本中的引用和名字声明相连系。 动态规则将程序执行中的引用和名字关联相连系
PASCAL程序中的引用环境 program main var A, B, C: real procedure Sub1(A: real var D: real procedure Sub2(C: real); var D: real begin Referencing environment for Sub2 Statements Local C. D C: =C+B: Nonlocal A, Sub2 in Sub1 Statements B, Sub1 in main end: begin Referencing environment for Sub1 Statements Local A, D, Sub2 Sub2 (B) Nonlocal B, C, Sub1 in main Statements end: begin Statements Referencing environment for main Sub1(A); Local: A, B. C. Sub1 Statements end
PASCAL程序中的引用环境
二者关系是什么?作用域规则则必须一致 例如: Pascall的静态规则将C:=C+B中变量B的引用和主程 序中B的声明相连系,则动态规则也必须将B的引用和主 程序中命名为B的数据对象相连系。 在文本中可有多个B的声明,在执行中的子程序激活中, 也可有多个命名B的数据对象 维护静态和动态规则间的一致性是重要的。 静态作用域的重要性 假定语言不使用静态作用域规则,考虑子程序中语句 X=X+Max 没有静态作用域规则,则在翻译时对ⅹ和Max不可能确定 什么
二者关系是什么?作用域规则则必须一致。 例如:Pascal的静态规则将C:=C+B中变量B的引用和主程 序中B的声明相连系,则动态规则也必须将B的引用和主 程序中命名为B的数据对象相连系。 在文本中可有多个B的声明,在执行中的子程序激活中, 也可有多个命名B的数据对象。 维护静态和动态规则间的一致性是重要的。 •静态作用域的重要性 假定语言不使用静态作用域规则,考虑子程序中语句 X:=X+Max 没有静态作用域规则,则在翻译时对X和Max不可能确定 什么
在执行时,引用操作需首先发现X和Max的相关关联,然 后确定类型和其他属性。 对每个标识符是否存在关联? Max是子程序名、变量名、语句标号、类型名或形参 名? 如果X是变量名,是否是可以和Max相加的类型? 这些问题的回答需在执行中试图引用X和Max时才可作出。 而且,每次执行该语句,上述完整的过程需重复一次, 因为Ⅹ、Max的关联可能在语句的两次执行间改变 ISP、 SNOBOL4、APL几乎没有静态规则,这样对名字 的引用需要复杂而且代价很高的解释过程,首先找到相 关关联,然后确定类型和属性
在执行时,引用操作需首先发现X和Max的相关关联,然 后确定类型和其他属性。 对每个标识符是否存在关联? Max是子程序名、变量名、语句标号、类型名或形参 名? 如果X是变量名,是否是可以和Max相加的类型? 这些问题的回答需在执行中试图引用X和Max时才可作出。 而且,每次执行该语句,上述完整的过程需重复一次, 因为X、Max的关联可能在语句的两次执行间改变。 LISP、SNOBOL4、APL几乎没有静态规则,这样对名字 的引用需要复杂而且代价很高的解释过程,首先找到相 关关联,然后确定类型和属性
静态作用域规则允许这个过程的大多数工作在程序翻译 时一次完成,而不需要重复进行 例:X:=X+Max是 Pascal中语句 Max是常量, const max=30 从而编译器可以确定Max的值总为30,语句翻译为30 加到X上,从而没有对Max的引用操作。 对X,如有声明:ⅹ:real,编译器将进行静态检査, 确定当语句被执行时, ①存在一个X到数据对象的关联 ②数据对象为实数类型 ③其值是可以完成加法操作的类型。 编译器不能确定Ⅹ引用的数据对象的位置,也不能确 定其值。但静态检査使程序的执行更快、更可靠
静态作用域规则允许这个过程的大多数工作在程序翻译 时一次完成,而不需要重复进行。 例:X:=X+Max 是 Pascal中语句 Max是常量,const Max=30 从而编译器可以确定Max的值总为30,语句翻译为30 加到X上,从而没有对Max的引用操作。 对X,如有声明:X: real,编译器将进行静态检查, 确定当语句被执行时, ①存在一个X到数据对象的关联 ②数据对象为实数类型 ③其值是可以完成加法操作的类型。 编译器不能确定X引用的数据对象的位置,也不能确 定其值。但静态检查使程序的执行更快、更可靠