(教妹学编译原理)(十五)运行存储分配策略

静态:编译时刻

动态:运行时刻

(教妹学编译原理)(十五)运行存储分配策略_第1张图片

活动记录

(教妹学编译原理)(十五)运行存储分配策略_第2张图片
(教妹学编译原理)(十五)运行存储分配策略_第3张图片

静态存储分配

(教妹学编译原理)(十五)运行存储分配策略_第4张图片

限制条件

(教妹学编译原理)(十五)运行存储分配策略_第5张图片

顺序分配法

(教妹学编译原理)(十五)运行存储分配策略_第6张图片
处理简单,但对内存空间的使用不够经济合理

层次分配法

(教妹学编译原理)(十五)运行存储分配策略_第7张图片
B[n][n]:过程调用关系矩阵

  • B[ i ][ j ]=1: 表示第i个过程调用第j个过程
  • B[ i ][ j ]=0 :表示第i个过程不调用第j个过程

(教妹学编译原理)(十五)运行存储分配策略_第8张图片

栈式分配存储

当一个过程被调用时,该过程的活动记录被压入栈;当过程结束时,该活动记录被弹出栈。

这种安排不仅允许活跃时段不交叠的多个过程调用之间共享空间,而且允许以如下方式为一个过程编译代码:它的非局部变量的相对地址总是固定的,和过程调用序列无关。

活动树

用来描述程序运行期间控制进入和离开各个活动的情况的树称为活动树。

树中的每个结点对应于一个活动。 根结点是启动程序执行的main过程的活动。

在表示过程p的某个活动的结点上,其子结点对应于被p的这次活动调用的各个过程的活动。按照这些活动被调用的顺序,自左向右地显示它们。 一个子结点必须在其右兄弟结点的活动开始之前结束。

(教妹学编译原理)(十五)运行存储分配策略_第9张图片
(教妹学编译原理)(十五)运行存储分配策略_第10张图片每个活跃的活动都有一个位于控制栈中的活动记录

活动树的根的活动记录位于栈底

程序控制所在的活动的记录位于栈顶

栈中全部活动记录的序列对应于在活动树中到达当前控制所在的活动结点的路径

设计活动记录的一些原则

(教妹学编译原理)(十五)运行存储分配策略_第11张图片

调用序列和返回序列

过程调用和过程返回都需要执行一些代码来管理活动记录
栈,保存或恢复机器状态等

  • 调用序列,实现过程调用的代码段。为一个活动记录在栈中分配空间,并在此记录的字段中填写信息

  • 返回序列,恢复机器状态,使得调用过程能够在调用结束之后继续执行

  • 一个调用代码序列中的代码通常被分割到调用过程(调用者)和被调用过程(被调用者)中。返回序列也是如此

调用序列

(教妹学编译原理)(十五)运行存储分配策略_第12张图片

返回序列

(教妹学编译原理)(十五)运行存储分配策略_第13张图片
调用者和被调用者之间的任务划分
(教妹学编译原理)(十五)运行存储分配策略_第14张图片

变长数据的存储分配

在现代程序设计语言中,在编译时刻不能确定大小的对象将被分配在堆区。但是,如果它们是过程的局部对象,也可以将它们分配在运行时刻栈中。尽量将对象放置在栈区的原因:可以避免对它们的空间进行垃圾回收,也就减少了相应的开销。

只有一个数据对象局部于某个过程,且当此过程结束时它变得不可访问,才可以使用栈为这个对象分配空间。

(教妹学编译原理)(十五)运行存储分配策略_第15张图片

你可能感兴趣的:(编译原理,java,数据结构,编译原理,jvm,面试)