文档介绍:第5章束定Binding
名字操纵程序对象。名字和存储对象联系起来才成为程序对象。
把声明名字(地址)和存储对象或语义实体连接起来叫束定。
束定绑定定连连编(编译中连接模块)
名字与束定
一名可束定到多个对象。
一对象可以束定到多个名字。
在一个程序的声明期内一旦束定不再改变叫静态(早)束定
运行中一个名字束定到(多个)对象叫动态(晚)束定
静态束定
编译按数据类型为名字分配合适大小的存储对象, 该对象首地址填入符号表即为静态束定, 编译后变量表销毁, 故静态束定不能变。
符号表运行时内存
类型名字束定存储对象
real length (地址)
array[1..4] of integer age (地址)
多重束定 FORTRAN等价语句, 以内部引用实现。
Real P2, P3
Dimension P1(3)
Equivalence (P1,P2),(P1(2),P3)
P1 P2 P3
其它语言多重束定是:
COBOL REDEFINES
Pascal 变体记录
C 联合
动态束定
运行时将名(字)束定于其体(得其语义操作)
解释型语言一般保留名字表运行中束定。
FORTH语言动态束定它是编译─解释型
每当生成word出一字项, 有两片代码一为初始化和该名应执行的代码(编译完成)。
新字体中用到旧字,则运行中束定。
解释执行另一片代码时,动态束定编译块。
FORGET命令可以撤销当前字定义。
名字域(字)
链接域
类型域
参数域(体)
.
.
.
WORD
WORD
项
项
项
指前一字指针
执行堆栈
例 FORTH 的动态束定
0 : 2by3array (':'表示编译开始, 后为类型声明符)
1 create (编译动作: 将类型声明符装入字典项)
2 2,3 (在字典项中存入 2×3维数)
3 12 allot (为六个短整数分配12个字节)
4 does> (运行时动作指令, 取下标)
5 rangecheck (函数调用, 检查下标)
6 if (如果不越界)
7 linearsub (函数调用, 计算线性下标值)
8 then (给出数组基地址和位移)
9 ; (';'切换成解释执行, 数据类型定义毕)
10
11 2by3array box (声明并分配名为box的数组变量)
12 10 1 2 box (给box(1,2)赋值10)
无类型语言束定
名字束定
length
age
符号表运行时内存存储对象:类型标签
scalar number
array of 4 number
不同时刻可以将一名字束定到不同存储对象上。
APL语言可显式操纵束定:束定符号‘←’
APL是无类型解释执行语言,以下是计算税金的程序:
TAXCALC
[1] 'ENTER GROSS PAY'
[2] GROSS ←□//输入什么值GROSS就是什么类型,□表示终端输入。
[3] →LESS × GROSS < 18000 //条件表达式为真转
LESS标号句
[4] TAX ←.25 ×GROSS //表达式结果值束定到TAX
[5] →DISPLAY //转到标号DISPLAY句
[6] LESS : TAX ←.22 × GROSS
[7] DISPLAY: 'THE TAX IS $',Ф TAX
[8]
声明declaration
声明指明本程序用到的所有程序对象给出所有束定集合
声明给翻译必要信息
声明的确立产生事实上的束定
声明有显式的和隐式的
例: Ada的显式声明:
基本声明::=对象|数|类型|子类型|包
|子程序|任务|类属|异常|类属设例
|换名|延迟
Ada的隐式声明:
块名字,循环名字,语句标号,循环控制变量,预定义运算符
声明种类
定义
—为对象名提供完整的束定信息。声明可多次定义只次。—定义是从已有信息定义新信息, Ada称之为rename。
—函数式语言, 无类型语言只有值定义, 没有变量声明。
val even = fn(n:int) => ( n mod 2 = 0 )
函数型构函数体
《束定》
函数定义
值定义
fun even (n: int) = ( n mod 2 =0)
函数抽象体
顺序声明的Ada例子
package MANAGER is --声明程序包规格说明
type PASSWORD is private; --声明私有类型未定义
NULL_PASSWORD:coustant PASSWORD;--立即用私有类型声明变量
function