编译原理 第20讲(第十节).pptVIP

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十章 目标程序运行时的组织 例子:解决措施 例子:带有过程swap的PASCAL程序 例子(Pascal) 例子(Pascal) 嵌套过程作为参数传递 过程调用的四元式序列 例子(Pascal) 总结 习题 10.5 堆式动态存储分配 需求: 一个程序语言允许用户自由地申请数据空间和退还数据空间,或者不仅有过程而且有进程(process)的程序结构, 操作: 堆提供两个操作,分配操作和释放操作 情况: 经一段运行时间之后,这个大空间就必定被分划成许多块块,有些占用,有些无用(空闲)--碎片问题 各种程序语言的动态分配 程序语言允许用户自由地申请数据空间和退还数据空间 Pascal语言中,标准过程new能够动态建立存储空间并相应地置上指针。标准过程dispose是释放空间.new与dispose不断改变着堆存储器的使用情况。 C语言中有这些操作的若干个版本,但最基本的是malloc和free,它们都是标准库(stdlib)的一部分 C++语言中new操作符施加在一个类型标识符上(包括类名) 面向对象的语言的动态存储 实现对象 实现对象的一个简单机制是,初始化代码将所有当前的继承特征(属性和方法)直接地复制到记录结构中(将方法当作代码指针)。但这样做极浪费空间。 另外一种方法是在执行时将类结构的一个完整的描述保存在每个类的存储中,并由超类指针维护继承性(有时这也称作继承图(inheritance graph))。每个对象保持一个指向其定义类的指针,作为一个附加的域和它的实例变量放在一起,通过这个类就可找到所有(局部和继承的)的方法。此时,只记录一次方法指针(在类结构中),而且对于每个对象并不将其复制到存储器中。由于是通过类继承的搜索方法的,所以该机制还实现继承性与动态联编。其缺点在于:虽然实例变量具有可预测的偏移量(正如在标准环境中的局部变量一样),方法却没有,而且它们必须由带有查询功能的符号表结构中的名字维护。这是对于诸如Smalltalk的高度动态语言的合理的结构,因为类结构可以在执行中改变。 折衷方法 将整个类结构保存在存储中,计算出每个类的可用方法的代码指针列表(称为方法索引表, 如:C++的virtual function table)。它的优点在于:可做出安排以使每个方法都有一个可预测的偏移量,而且也不再需要用一系列表查询遍历类的层次结构。现在每个对象不仅包括实例变量还包括了一个相应的方法索引表的指针而不是类结构的指针(当然,这个指针的位置必须也有可预测的偏移量)。 某个单继承O-O语言的对象存储示意 某个O-O语言的程序例子 它的运行时存储组织 * * 10.1 概述 10.2 数据表示 10.3 目标程序运行时的栈式存储组织 10.4 参数传递 10.5 堆式存储概述 10.3.3分程序结构的存储分配方案 处理分程序结构存储分配方案的一种简单办法是,把分程序看成 “无名无参过程”,它在哪里定义就在哪里被调用。因此,可以把处理过程的存储办法应用到处理分程序中,但这种做法是极为低效的。 一则,每逢进入一个分程序,就照样建立连接数据和DISPLAY表,这是不必要的。 二则,当从内层分程序向外层转移时,可能同时要结束若干个分程序。 按照过程处理办法,意味着必须一层一层地通过“返回” 来恢复所要到达的那个分程序的数据区,但不能直接到达。 Procedure A(m,n); integer m,n; B1:begin real z; array B[m:n]; B2:begin real d, e; L3: 2 end; B4:begin array C[1:m]; 1 B5:begin real e; L6: 5 4 end; end; L8:end; 例子:分程序结构 例如:如果有一个从第5层分程序转出到达第1层分程序的标号L,虽然在第5层

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档