欢迎来到天天文库
浏览记录
ID:52398790
大小:2.59 MB
页数:126页
时间:2020-04-05
《运行时的存储组织.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第8章运行时的存储组织SchoolofSoftwareHarbinInstituteofTechnology重点:符号表的内容、组织,过程调用实现,静态存储分配、动态存储分配的基本方法。难点:参数传递,过程说明语句代码结构,过程调用语句的代码结构,过程调用语句的语法制导定义,栈式存储分配。9/8/20212第8章运行时的存储组织8.1与存储组织有关的源语言概念与特征8.2存储组织8.3静态存储分配8.4栈式存储分配8.5栈中非局部数据的访问8.6堆管理8.7本章小结9/8/202138.1与存储组织有关的源语言概念与特征编译程序必须准确地实现包含在源程序中的各种抽象概念,
2、如名字、作用域、数据类型、操作符、过程、参数和控制流结构等,这些概念反映了源语言所具有的一些特征,对它们的支持往往会影响运行时的存储组织和分配策略给定一个源程序,编译程序必须根据源语言的特征(规定)为源程序中的许多问题做出决策,包括何时、怎样为名字分配内存地址。静态策略:在编译时即可做出决定的策略动态策略:直到程序执行时才能做出决定的策略9/8/202148.1.1名字及其绑定“名字”、“变量”和“标识符”的区别与联系名字和变量分别表示编译时的名字和运行时该名字所代表的内存位置。标识符则是一个字符串,用于指示数据对象、过程、类或对象的入口。所有标识符都是名字,但并不是所有的
3、名字都是标识符,名字还可以是表达式。例如,名字x.y可能表示x所代表结构的域y。同一标识符可以被声明多次,但每个声明都引入一个新的变量。即使每个标识符只被声明一次,局部于某个递归过程的标识符在不同的运行时刻也将指向不同的内存位置。9/8/20215名字的绑定从名字到值的两步映射环境把名字映射到左值,而状态把左值映射到右值赋值改变状态,但不改变环境。如果环境将名字x映射到存储单元s,我们就说x被绑定到s名字内存位置(变量)状态值环境9/8/202168.1.2声明的作用域x的声明的作用域是程序中的这样一段区域,在该区域中,x的引用均指向x的这一声明。对于某种程序设计语言,如果
4、只通过考察其程序就可以确定某个声明的作用域,则称该语言使用静态作用域;否则称该语言使用动态作用域。C++、Java和C#等还提供了对作用域的显式控制,其方法是使用public、private和protected这样的关键字。声明的作用域是通过符号表进行管理的,详见8.4节的讨论。9/8/202171.静态作用域在具有程序块结构的语言中,变量声明的静态作用域规则如下:如果名字x的声明D属于程序块B,则D的作用域是B的所有语句,只有满足如下条件的程序块B‘除外:B’嵌套在B中(可以是任意的嵌套深度),且B‘中具有同一名字x的一个新的声明。令B1,B2,…,Bk是包围x的本次引用
5、的所有程序块,Bk-1是Bk的直接外层程序块,Bk-2是Bk-1的直接外层程序块,如此类推。找到使x的某个声明属于Bi的最大i,则x的本次引用指向Bi中的这个声明。换句话说,x的本次引用处在Bi中的这个声明的作用域中。9/8/202181.静态作用域表8.1图8.10所示程序中声明的作用域9/8/202192.显式访问控制类和结构为其成员引入了一种新的作用域如果p是某个带有域(成员)x的类的对象,则p.x中x的引用将指向该类定义中的域x。与程序块结构类似的是,类D中成员x的声明的作用域将会扩展到D的任何子类D',除非D'中具有同一名字x的一个局部声明。9/8/2021102
6、.显式访问控制通过使用像public、private和protected这样的关键字,C++或Java类的面向对象语言提供了一种对超类中成员名字的显式访问控制。这些关键字通过限制访问来支持封装。因此,私有名的作用域只包含与该类及其友类相关联的方法声明和定义,保护名只对其子类是可访问的,而公用名从类的外部也是可以访问的。9/8/2021113.动态作用域动态作用域规则相对于时间而静态作用域规则相对于空间静态作用域规则要求我们找出某个引用所指向的声明,条件是该声明处在包围该引用的“空间上最近的”单元(程序块)中。动态作用域也是要求我们找出某个引用所指向的声明,但条件是该声明处在
7、包围该引用的“时间上最近的”单元(过程活动)中。9/8/2021123.动态作用域“动态作用域”通常是指下面的策略名字x的引用指向带有x声明的最近被调用的过程中x的这个声明。例如,过程被当做参数进行传递时9/8/2021138.1.3过程及其活动将“过程、函数和方法”统称为“过程”过程定义是一个声明,它的最简单形式是把一个标识符和一个语句联系起来。该标识符是过程名,而这个语句是过程体。当过程名出现在可执行语句中时,称相应的过程在该点被调用。过程调用就是执行被调用过程的过程体。注意,过程调用也可以出现在表达式中。9/
此文档下载收益归作者所有