【编译原理复习】第九章 运行时存储空间组织

第九章 运行时存储空间组织

本章重点:
一、运行时存储器的划分策略:

  1. 静态存储分配
  2. 栈式存储分配
  3. 堆式动态存储

二、活动记录表
1.简单栈式存储分配
2.嵌套过程语言的栈式

目标程序运行时的活动

过程:过程定义是一个说明,其最简单的形式是一个标识符和 一段语句相关,标识符是过程名,语句是过程体。
调用:当过程名出现在可执行语句里的时候,称该过程在这一 点被调用。过程调用导致过程体的执行。
过程的活动:一个过程的活动指的是该过程的一次执行,也就 是说,每次执行一个活动。
活动的生存期:指的是从执行该过程体第一步操作到最后一步 操作之间的操作序,包括执行该过程时调用其它过程花费的 时间。 活动的生存期或者是嵌套的,或者是不重叠的。
过程的递归:如果一个过程在没有退出当前的活动时,又开始 其新的活动,则这个过程是递归的。(递归有直接递归和间 接递归)

1. 静态存储分配

在编译时对所有的数据对象分配固定的存 储单元,并且在运行时始终保持不变。
在编译时就能够确定一个程序在运行时所需要的存储空间的 大小,则在编译时就能够安排好目标程序运行时的全部数据空 间,并能够确定每个数据项的单元地址。
语言要求:

  1. 数组的上下界必须是常数
  2. 过程调用不允许递归
  3. 不允许用户动态地建立数据实体

2. 栈式存储分配

在运行时把存储器作为一个栈进行管 理,运行时,每当调用一个过程,它所需要的存储空间 就动态地分配于栈顶,一旦退出,它所占的空间就予以 释放。
基于控制栈的原理: 存储空间被组织成栈,活动记录的 推入和弹出分别对应于活动的开始和结束。 与静态分配不同的是,在每次活动中把局部名字和新的 存储单元绑定,在活动结束时,活动记录从栈中弹出,因 而局部名字的存储空间也随之消失。
语言要求:
过程不允许嵌套,但允许过程递归调用,如C语言。
嵌套过程语言的栈式实现的语言要求:过程不仅允许递归调用,还允许过程进行嵌 套定义。

3. 堆式动态存储

在运行时把存储器组织成堆结构,以便用户可以对存储空间进行申请与归还。
堆式分配的基本思想是,为运行的程序划出适 当大的空间(称为堆Heap),每当程序申请空间 时,就从堆的空闲区找出一块空间分配给程序, 每当释放时则回收。
语言要求:
对于允许程序为变量在运行时动态申请和释放 存储空间的语言,采用堆式分配是最有效的解 决方案。

4.活动记录表

1.简单栈式存储分配

C语言的活动记录
在这里插入图片描述
2.嵌套过程语言的栈式

言非局部名字访问的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译时多态和运行时多态是面向对象编程中的两种多态性。编译时多态是指在编译时根据实际参数的数据类型、个数和次序来确定执行重载方法。例如,在Java中,当对象引用本类实例时,调用toString()方法是编译时多态。\[1\]而运行时多态是指在运行时根据对象的实际类型来确定执行的方法。在运行时多态中,通过将基类的函数声明为虚接口(虚函数),子类可以重写这些虚接口以实现子类特有的具体功能。\[3\] 编译时多态的优点是在编译时就能确定执行的方法,提高了程序的效率。而运行时多态的优点是可以根据对象的实际类型来动态确定执行的方法,增加了程序的灵活性和可扩展性。\[1\]\[3\] 然而,编译时多态的缺点是在编译时就确定了执行的方法,无法根据对象的实际类型来动态确定执行的方法。而运行时多态的缺点是需要在运行时进行类型检查和动态绑定,增加了一定的开销。\[1\]\[3\] 总结来说,编译时多态和运行时多态都有各自的优点和缺点,根据实际需求选择合适的多态性来设计和实现程序。 #### 引用[.reference_title] - *1* [编译时多态和运行时多态](https://blog.csdn.net/twx31420/article/details/108981026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C++编译时多态和运行时多态](https://blog.csdn.net/TABE_/article/details/116865956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值