Perl内部机制:堆栈、消息协议与扩展开发
1. 堆栈与消息协议基础
在Perl编程中,参数传递和结果返回依赖于参数堆栈这一数据结构。例如,当调用 foo(10, 20)
,而 foo
又调用了 bar("hello", 30.2, 100)
时,就涉及到参数在堆栈中的传递。
那么, bar
如何知道从堆栈顶部获取多少个参数呢?Perl使用另一个名为标记堆栈(markstack)的堆栈来跟踪参数堆栈的范围。 bar
通过计算当前堆栈顶部与标记堆栈顶部存储的书签之间的差值,就能确定属于它的参数,这部分堆栈对应于 bar
的 @_
数组。当 bar
准备返回时,它将一个或多个结果存入其堆栈区域, foo
通过查看标记堆栈就能知道返回了多少个标量。
当在脚本空间中操作时,这些操作是透明的。但如果编写由Perl调用的C例程(扩展Perl)或从C调用Perl函数(嵌入Perl),就需要处理一些细节。
2. 从C调用Perl子例程
当在应用程序中嵌入Perl解释器并从C调用Perl子例程时,需要使用一系列宏(定义在 pp.h
中),具体如下表所示:
| Function/Macro | Description |
| — | — |
| dSP | 声明一些供后续宏使用的变量。 |
| ENTER | 开始作用域。