文档详情

高级语言程序设计方法学第05章-10.pdf

发布:2017-09-24约2.32万字共15页下载文档
文本预览下载声明
第5章 第5章 束定 在程序中我们靠各种名字操纵程序对象,以此编制有声有色的程序。上一章因名、值分 离我们引出存储对象概念,但只有当名字和存储对象结合在一起才构成程序对象,所以,名 字不等于程序对象,它只有通过束定(Binding,我国有译绑定,定连,联编的)才能成为程 序对象。例如,一个变量声明了未分配存储,此时该变量名没有束定,只有在运行时分配存 储才成为定义的程序对象。 发明名字是高级程序语言重大的进步,名字能为程序员提供可见可识的语义。但机器只 把名字看成符号串,它没有识别名字表达的语义的能力,它只知道束定,把sin(x)与它的函 数体束定起来sin(x)才能实施它的语义“对x求正弦”。这样人们希望的语义才成为现实。 本章学习束定和各种束定机制,声明、声明的种类和作用域等有关基本概念。本章还讨 论由于嵌套块结构语言带来较为深入的几个问题;不同束定机制对语言释义的差异;名字的 作用域与程序对象生命期匹配问题;束定机制与语言翻译器的关系。 5.1 名字与束定 如果一个名字只指称一个程序对象,这本来是没有什么值得讨论的问题,多数程序设计 语言动态创建程序对象时一个名字可以在不同时候代表不同的程序对象。如嵌套程序外块、 内块可以有相同的名字。一个程序对象可以有好几个名字,如引用变量名,指针名。极端情 况下程序对象可以没有名字(无名类型),名字可以没有对象(悬挂指针)。所以块结构、参数 传递、递归、指针、引用、别名等机制使名字空间大为复杂化了。它打破了“一个程序对象 对应一个名字”的简单概念。 把名字和存储对象联系起来叫束定,更概括一些,束定是将名字(标识符)和可束定体联 系起来。所谓可束定体(bindable)是能反映(操作)语义的存储块,如常量、变量的存储体、 函数体、过程体、类型、异常。 指明束定一般由程序员在程序正文的声明中作出,如: int a, *p; 标识符a,p束定为int类型的变量、指针。然而真正束定是编译器或解释器完成的:它给a, p分配了存储对象并填上名字—地址对照表,某个地址上的存储对象就“是”该名字的对应 物。反过来说也行。 可以把束定看作是完成名字指向存储对象指针的过程,但它和指针不同,首先它是编译 (或解释)器做的。为每一个名字分配其语法要求的存储,也可以跨越时间,编译时占个位置, 运行时再分配(实现束定)。再者,翻译器可以自动递引用束定而不能自动递引用指针。它是 跨越程序世界和机器世界的概念。 在一个程序的生命期期间,一旦束定不再改变叫静态束定,反之,一个名字束定多个存 储对象(不同时间)叫动态束定。还有一种介乎动静之间叫块结构束定。静态束定一般在运行 之前完成(编译时做一部分,连接时做一部分,装载后确立(elaboration)时再做完),也叫 早束定。程序运行时动态完成叫晚束定 一个程序设计语言采用什么类型机制和程序运行机 制决定了它以早束定还是以晚束定实现。我们现在分析已有语言的束定机制。 5.2 各种束定机制 除无类型语言而外,一般常见语言(Algol,FORTRAN,COBOL,C,Pascal,Ada)都是类 型语言,每个程序对象均与类型相关,类型在声明(或缺省声明)中给出。 第1页 第5章 5.2.1 静态束定 较老的非结构化语言一般采用静态束定。在编译时建立一个符号表,最简单的情况,该 表用三个域:类型,名字,地址束定即可实现,见图5-1用虚箭头表示束定。 符号表 运行时内存 类型 名字 地址 存储对象 real length (首地址) array[1..4] of integer age (首地址) 图5-1 符号表和束定 编译根据类型为名字分配适合大小的存储对象,按相对地址算出被束定对象的首地址, 填入表,然而,运行时只有存储对象,
显示全部
相似文档