我正在构建一个从类似 C 的语言到堆栈机器的玩具编译器,我现在需要弄清楚如何处理函数并阻止局部变量。抽象地思考一下,看起来我在频谱的两端有两个选择:1)为每个变量预处理和预分配堆栈空间,2)向 VM 添加特殊指令以遍历堆栈。
为每个变量预处理和预分配堆栈空间
这样做的好处是可以提前为我提供变量的所有地址,因此我不必非常聪明或向 VM 添加任何额外的指令来遍历堆栈。缺点是它可能非常浪费,因为从不执行但声明一大堆变量的条件代码将占用大量不必要的空间。例如,
a : t1 = value;
if (test) {
b : t2; c : t3; d : t4; ...;
}
在上面的代码中,即使test
总是错误的,我仍然会为条件分支中的所有这些变量分配空间。
向 VM 添加特殊指令以遍历堆栈
我能想到的另一种方法是为每个变量声明生成代码,然后添加一些特殊的 VM 指令以在运行时找出这些变量的地址。这解决了浪费堆栈空间的问题,但增加了计算开销,我可以通过一些缓存方法来解决。
那么正确的方法是什么,还有另一种我认为更好的方法吗?