总结:编译原理--第七章 运行时刻环境

第七章  运行时刻环境

编译器必须准确地实现源程序语言中包含的各个抽象概念。这些抽象概念通常包括我们前面内容曾经讨论过的那些概念,如名字、作用域、绑定、数据类型、运算符、过程、参数以及控制流构造。编译器还必须和操作系统以及其他系统软件协作,在目标机上支持这些抽象概念。

为了做到这一点,编译器创建并管理一个运行时刻环境,它编译得到的目标程序就运行在这个环境中。这个环境处理很多事务,包括为在源程序中命名的对象分配和安排存储位置,确定目标程序访问变量时使用的机制。过程间的连接,参数传递机制,以及与操作系统、输入输出设备及其他程序的接口。

  • 运行时刻组织。为了实现源语言中的抽象概念,编译器与操作系统及目标机器协同,创建并管理了一个运行时刻环境。
  • 控制栈。过程调用和返回通常由称为控制栈的运行时刻栈管理。
  • 栈分配。对于那些允许或要求局部变量在它们的过程结束之后就不可访问的语言而言,局部变量的存储空间可以在运行时刻栈中分配。
  • 访问栈中的非局部数据。像 C 这样的语言不支持嵌套的过程声明,因此一个变量的位置要么是全局的,要么可以在运行时刻栈顶的活动记录中找到。
  • 堆管理。堆是用来存放生命周期不确定的,或者可以生存到被明确删除时刻的数据的存储区域。
  • 利用局部性。通过更好地利用存储的层次结构,存储管理器可以影响程序的运行时间。
  • 减少碎片。随着程序分配和回收存储,堆区可能会变得破碎,或者说被分割成大量细小且不连续的空闲空间。
  • 人工回收。人工存储管理有两个常见问题:没有删除那些不可能再被引用的数据,这称为内存泄漏错误;引用已经被删除的数据,这称为悬空指针引用错误。
  • 可达性。垃圾就是不能被引用或者说到达的数据。
  • 引用计数回收器维护了指向一个对象的引用的计数。当这个计数变为 0 时,该对象就变成不可达的。
  • 基于跟踪的垃圾回收器从根集出发,迭代地检查或跟踪所有的引用,找出所有可达对象。
  • 标记-清扫式回收器在一开始的跟踪阶段访问并标记所有可达对象,然后清扫堆区,回收不可达对象。
  • 标记并压缩回收器改进了标记并清扫算法。
  • 拷贝回收器将跟踪过程和发现空闲空间过程之间的依赖关系打破。
  • 增量式回收器。简单的基于跟踪的回收器在垃圾回收期间会停止用户程序的执行。
  • 部分回收器同样可以减少停顿时间。它们每次只回收一部分垃圾。

希望我的总结可以帮助大家,感谢阅读我的博客!

猜你喜欢

转载自blog.csdn.net/weixin_42558631/article/details/81265659