过程调用

2025 年 6 月 9 日 | 阅读时间:5 分钟

引言

众所周知,通过允许程序调用称为过程或函数的特定代码块,从而在相应的编程中实现。该机制通常促进代码重用和更好的组织,并在编程中提供清晰性。当调用一个方法时,控制权会暂时转移到该特定的代码块,并且在其执行之后,控制权会返回到调用之后的那个点。

编译器 中处理过程调用涉及几个关键操作,包括管理调用栈、传递参数和保存调用者的环境。 编译器必须生成适当的指令来保存当前的执行上下文,将控制权转移到过程,从而确保返回到程序中的正确位置。 此过程主要需要使用激活记录,这些记录被称为 “栈帧”,负责存储诸如返回地址、参数和局部变量之类的信息。

尽管如此,相应过程调用可以很容易地分为不同的类型,例如 静态或动态调用,具体取决于如何确定调用的目标。 此外,编译器还需要处理调用约定,这些约定定义了如何传递参数(例如,通过值或引用)以及如何有效地返回结果。 高效实现过程调用对于程序的性能至关重要,尤其是在支持递归或大量函数调用的语言中。 了解编译器如何处理所有这些调用有助于编写优化的代码并有效地开发更好的编译器工具。

什么是过程调用?

过程调用被认为是一种编程结构,用于执行在程序中其他地方定义的一段代码。它还允许程序临时将控制权转移到特定的过程或函数,执行其语句,然后返回以从停止的地方继续执行。过程调用通常包括方法名称,后跟包含实际参数的括号,并以分号结尾。

Procedures call

调用期间提供的实际参数必须与在过程定义中声明的形参的数量、顺序和类型相匹配。 这确保了代码的调用和被调用部分之间的正确通信。 如果类型不匹配,编译器将生成错误并阻止程序的编译。 过程调用对于模块化编程至关重要,在模块化编程中,大型程序被有效地分解为更小、更易于管理的部分。 它们也负责提高代码的可读性、可维护性和可重用性。 在幕后,编译器处理控制权的转移、管理参数以及保存执行上下文的细节。 这通常仅通过使用称为 栈帧 的结构来完成,该结构在调用期间存储必要的信息。 总的来说,过程调用提供了一种清晰有效的方式来有效地管理复杂的程序逻辑。

调用序列

Procedures call

调用的翻译包括在进入和退出每个过程时采取的一系列操作。

以下操作发生在调用序列中

  • 发生过程调用时,为激活记录分配空间。
  • 计算被调用过程的参数。
  • 建立环境指针,使被调用过程能够访问封闭块中的数据。
  • 保存调用过程的状态,以便在调用后可以恢复执行。
  • 还要保存返回地址。 它是被调用例程完成之后必须转移到的位置的地址。
  • 最后,生成跳转到被调用过程的代码的开头。

让我们考虑一个简单过程调用语句的语法

过程调用的一个合适的转换方案是

产生式规则语义动作
S → call id(Elist)对于 QUEUE 中的每个项目 p
  生成 (param p)
    生成 (call id.PLACE)
Elist → Elist, E将 E.PLACE 附加到 QUEUE 的末尾
Elist → E初始化 QUEUE 以仅包含
   E.PLACE

Queue 用于存储过程调用中的参数列表。

过程调用期间的步骤

Procedures call
  • 编译器中的过程调用主要涉及几个系统步骤,这些步骤可以确保正确执行过程以及在调用和被调用过程之间平稳地转移控制。 这些步骤始于编译的早期阶段,并贯穿整个运行时。
  • 该过程从词法分析和解析开始,其中编译器扫描源代码,标识过程名称,并提取调用中提供的任何参数。 这基本上之后是 语义分析, 在语义分析中,编译器检查实际参数的类型和数量是否与过程定义中定义的形参匹配。 它还验证了参数应该如何通过值或引用传递。
  • 接下来是代码生成,在此期间,编译器生成机器级指令,以执行调用。 在运行时,在堆栈上创建一个激活记录,以便有效地存储重要数据,例如参数、局部变量和返回地址。 然后通过有效地使用已定义的传递机制将实际参数传递到过程中。
  • 然后将控制权转移到过程,通过仅使用存储在激活记录中的数据来执行指令。 一旦执行完成,该方法使用存储的返回地址将控制权转移回调用点。

最后,可以从堆栈中删除激活记录,从而根据编程语言的内存管理模型释放内存。 这些有组织的步骤确保过程正确执行并将结果无缝地返回给调用者。

常见问题解答/FAQ

关于在编译器设计中使用过程调用的各种常见问题如下

问题 1:过程调用的含义是什么?

答案: 过程调用是一个指令,负责将控制权转移到预定义的代码块(过程或函数),执行它,然后以有效的方式将控制权返回到调用之后的下一条指令。

问题 2:为什么过程调用很重要?

答案: 它们通过将程序分解为更小、可重用的部分来实现模块化编程,从而有效地提高了代码的清晰度、可维护性和重用性。


下一主题四元式