什么是编译器设计中块结构语言的实现?


块是一条包含自身局部数据声明的语句。块的概念起源于ALGOL。块结构语言允许使用长度可调的数组。块的主要特点是它们的括号结构(ALGOL中使用begin和end),它们可以在其中定义它们的数据。

块结构语言的激活记录

像ALGOL和PL/I这样的块结构语言允许使用可调整大小的数组,即长度可变的数组。因此,我们不能将大小不规则的数组存储在激活记录之间。它可以在激活记录的一个角上或固定大小数据之上分配灵活或可变的数组。指向这些可调整数组的指针将存储在激活记录的固定位置。

下图显示了一个过程的激活记录,该过程有两个长度可调的数组。

考虑一个块结构程序

过程 P;

实数 A;

实数数组 X [10];

在这个过程中,我们使用了3个块。这些块的执行将导致它们的局部数据项A、B、C、D和可调整数组X、Y、Z被存储到堆栈中。特定块的激活记录将在该块当前正在执行时生成。

如果块2处于活动状态或正在执行,则过程P的激活记录将保存块2的局部数据和指向可调整数组的指针在顶部。

显示和静态链接

有两种方法可以访问过程的非局部数据:

  • **静态链接**—在这种方法中,一个称为静态链接的指针附加到每个过程,该指针指向程序中物理上围绕它的该过程的最顶层激活记录。因此,任何过程的非局部数据引用都可以通过下降指针链来查找所有静态封闭过程。

  • **显示**—显示是一个指针数组,用于加快对非局部数据的访问速度。

参数传递

调用过程后,参数将传递给该过程。有两个参数

  • 实际参数
  • 形式参数

根据这些参数,存在各种参数传递方法:

  • **按值调用**—这是参数传递最简单的方法。计算实际参数,并将它们的r值传递给被调用过程。
  • **按引用调用**—当参数按引用传递(也称为按地址调用或按位置调用)时,调用方将传递给被调用过程,一个指向每个实际参数的存储地址的指针。
  • **按名调用**—这是一种不太流行的参数传递方法。该过程被视为宏。该过程体将被调用方的调用替换,实际参数将被形式参数替换。

返回

当过程P1调用过程P2时,过程P2将向P1返回一些值。

将进行以下更改。

  • P2返回的值将存储在激活记录中为其保留的空间中。
  • 顶部指针将被恢复,即再次指向P1调用P2之前的位置。
  • 恢复SP,即设置SP指针指向P1激活记录中的旧SP。
  • 从P1激活记录获取返回地址以完成P2执行的返回。


更新于:2021年11月8日

8K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始
广告