名字、绑定和作用域 1程序设计语言——实践之路 Michael L. Scott, Programming Languages Pragmatics Morgan Kaufmann, 2000, 2005) 中文版由裘宗燕译电子工业出版社出版,2005 2编译原理及实践 Kenneth c. louden机械工业出版社.1997
名字、绑定和作用域 1.程序设计语言——实践之路 Michael L. Scott, Programming Languages Pragmatics, Morgan Kaufmann, 2000, 2005) 中文版由裘宗燕译.电子工业出版社出版,2005 2.编译原理及实践.Kenneth C.Louden.机械工业出版社.1997
本节要点 ■名字、绑定、静态绑定、动态绑定 ■对象的生存期 ■典型的存储分配方式 ■作用域
本节要点 ◼ 名字、绑定、静态绑定、动态绑定 ◼ 对象的生存期 ◼ 典型的存储分配方式 ◼ 作用域
名字和绑定 名字 口助记符,如:标识符,符号(+) 口是程序语言里最基本的抽象机制 口用来指称程序中出现的各种“东西”:变量、常量、过程/函数 结构/记录的成分、类型等等。 绑定( binding)是两个东西之间的关联,如一个名字和 它所指的东西。 注:不是所有的数据都有名字,例:C、Ada95和 Fortran9O用指针 来引用动态存储;类似的,Java和C#用引用来间接访问
名字和绑定 ◼ 名字 助记符,如:标识符,符号(+) 是程序语言里最基本的抽象机制 用来指称程序中出现的各种“东西”:变量、常量、过程/函数、 结构/记录的成分、类型等等。 ◼ 绑定(binding)是两个东西之间的关联,如一个名字和 它所指的东西。 ◼ 注:不是所有的数据都有名字,例:C、Ada 95和Fortran 90用指针 来引用动态存储;类似的,Java和C#用引用来间接访问
声明和定义 名字与事物(包括程序对象)之间的约束关系由定义 或声明建立。 个定义或声明引进一个名字,被定义/声明的事物及 相关属性就是该名字的意义。这个声明/定义建立了名字 与相关事物和属性之间的约束关系。 例:C声明 const doub|ex=3.876; 将名字X约束于一个 double类型的变量, const和值 3.876为其属性 例:C声明 dint fun(int, double); 使名字fun约束于函数类型int× double→int。这 函数的定义应该具有这种类型,它的使用必须符合这一类 型
声明和定义 名字与事物(包括程序对象)之间的约束关系由定义 或声明建立。 一个定义或声明引进一个名字,被定义/声明的事物及 相关属性就是该名字的意义。这个声明/定义建立了名字 与相关事物和属性之间的约束关系。 例:C 声明const double x = 3.876; 将名字x 约束于一个double 类型的变量,const 和值 3.876 为其属性 例:C 声明int fun (int, double); 使名字fun 约束于函数类型int×double →int。这个 函数的定义应该具有这种类型,它的使用必须符合这一类 型
绑定时间(约束时间) ■绑定时间指一个绑定的活跃时间 ■与高级语言和程序有关的重要时间概念: 口语言设计时。如:程序结构、类型。 口语言实现时。如:ⅣO,算术溢出,类型等价 口编程时。如:算法和名字 口编译时。数据对象的布局,从程序中高级结构到机器代码的映射。 □连接时。整个程序在内存的布局,如:静态数据对象分配,跨模 块对象约束,库对象约束 口装载时。物理地址的选择,完成虚地址到实地址的映射 口运行时。变量的值绑定,运行时的其他事项
绑定时间(约束时间) ◼ 绑定时间指一个绑定的活跃时间。 ◼ 与高级语言和程序有关的重要时间概念: 语言设计时。如:程序结构、类型。 语言实现时。如:I/O,算术溢出,类型等价 编程时。如:算法和名字 编译时。数据对象的布局,从程序中高级结构到机器代码的映射。 连接时。整个程序在内存的布局,如:静态数据对象分配,跨模 块对象约束,库对象约束 装载时。物理地址的选择,完成虚地址到实地址的映射 运行时。变量的值绑定,运行时的其他事项
静态绑定和动态绑定 ■静态绑定:在程序运行前建立的约束 ■动态绑定:在程序执行过程中建立的约東 哪些特征能静态绑定,或者必须动态绑定,不同 语言之间差别很大 口一般而言,静态绑定效率高、意义清晰,动态绑定更 灵活 口静态绑定的语言一般是编译执行 口动态绑定的语言一般是解释执行 面重点讨论变量的绑定,以下用对象表示任何 有名字的东西
静态绑定和动态绑定 ◼ 静态绑定:在程序运行前建立的约束 ◼ 动态绑定:在程序执行过程中建立的约束 ◼ 哪些特征能静态绑定,或者必须动态绑定,不同 语言之间差别很大 一般而言,静态绑定效率高、意义清晰,动态绑定更 灵活 静态绑定的语言一般是编译执行 动态绑定的语言一般是解释执行 ◼ 下面重点讨论变量的绑定,以下用对象表示任何 有名字的东西
生存期和作用域 ■绑定的生存期是一个绑定从创建到销毁的时间。 口创建和销毁可能伴有特定的动作(例:常量创建时需 要给定值) ■绑定的作用域是一个绑定在程序中活跃的文本区 域 作用域本身指程序中没有绑定被销毁的一段最大 的程序区域。(后面再讨论) 常见作业域 口子程序(函数和过程) 口模块 口模块类型 类块
生存期和作用域 ◼ 绑定的生存期是一个绑定从创建到销毁的时间。 创建和销毁可能伴有特定的动作(例:常量创建时需 要给定值) ◼ 绑定的作用域是一个绑定在程序中活跃的文本区 域。 ◼ 作用域本身指程序中没有绑定被销毁的一段最大 的程序区域。(后面再讨论) ◼ 常见作业域 子程序(函数和过程) 模块 模块类型 类 块
子程序 ■在大多数带子程序的语言中,子程序入口 打开一个新的作用域。 □在子程序入口,为局部变量创建绑定,使被重 复声明的全局变量的绑定无效,然后建立到局 部变量的索引。 □在子程序出口,销毁局部变量的绑定,激活那 些被变无效的非局部变量的绑定
子程序 ◼ 在大多数带子程序的语言中,子程序入口 打开一个新的作用域。 在子程序入口,为局部变量创建绑定,使被重 复声明的全局变量的绑定无效,然后建立到局 部变量的索引。 在子程序出口,销毁局部变量的绑定,激活那 些被变无效的非局部变量的绑定
对象的创建和销毁 ■对象的创建( creation)可能是 口静态创建,包括编译时完成,连接时完成,或者装载时完 成 口动态创建,运行中创建 ■对象的销毁可能在 口运行中完成 口程序终止时完成 ■生存期跨越程序运行期的对象称为永久( persistent 对象
对象的创建和销毁 ◼ 对象的创建(creation)可能是 静态创建,包括编译时完成,连接时完成,或者装载时完 成 动态创建,运行中创建 ◼ 对象的销毁可能在 运行中完成 程序终止时完成 ◼ 生存期跨越程序运行期的对象称为永久(persistent) 对象
静态对象和非静态对象 静态对象:静态创建,程序终止时销毁 非静态对象:程序运行中创建和销毁。 Fortran中的所有变量都是静态对象。 c中的外部变量(用 exteri声明)和局部 static变量是静态对象,自 动变量(用auto声明或默认)是非静态对象。 ■创建和初始化动作完全可能不同时做。例如C++的局部 static变量是 静态创建的,但在执行首次进入变量所在函数时进行初始化。 生存的对象通常有一个固定标识,最常见的就是用对象的存储位 置表示。对象总占据着一块存储空间,在其中保存自己的“值”。 因此,对象创建有时也称为分配( allocation) 存储位置 值
静态对象和非静态对象 ◼ 静态对象:静态创建,程序终止时销毁。 ◼ 非静态对象:程序运行中创建和销毁。 ◼ Fortran 中的所有变量都是静态对象。 ◼ C 中的外部变量(用extern声明)和局部static 变量是静态对象,自 动变量(用auto声明或默认)是非静态对象。 ◼ 创建和初始化动作完全可能不同时做。例如C++ 的局部static 变量是 静态创建的,但在执行首次进入变量所在函数时进行初始化。 生存的对象通常有一个固定标识,最常见的就是用对象的存储位 置表示。对象总占据着一块存储空间,在其中保存自己的“值”。 因此,对象创建有时也称为分配(allocation) 存储位置 值