1

我为一个简单的堆栈机器编写了一个小型编译器。它只能通过一些虚拟机黑客来组装和处理范围/功能。那就是我让它在字节码本身中定义范围和范围变量定义。

我能得到一些关于我应该如何处理范围的指示吗?

我面临的问题主要是,我如何让它知道何时以及何时不使用内部变量覆盖外部变量等。字节码是可变的,我更愿意改变它。

其他问题包括返回后如何将变量保留在外面。这样一个变量仍然有它的值。我可以将它推入堆栈,但我可以有很多变量。

我认为已经完成了一些编译器工作来检查这些事情,但我想不出需要做什么才能做到这一点。

4

1 回答 1

2

一种方法是在编译时重命名变量以确保没有屏蔽。所以:

{
   declare foo;
   foo = assignment;
   {
     declare foo;

     foo = another_assignment;
     another_use = foo;
   }
   use = foo;
}

相当于:

{
   declare foo_0;
   foo_0 = assignment;
   {
     declare foo_1;

     foo_1 = another_assignment;
     another_use = foo_1;
   }
   use = foo_0;
}

编译时,您为每个变量维护一个“重命名堆栈”。和:

  1. 每当您看到声明时,您都会生成一个新名称并将其推送到相应变量的重命名堆栈中。

  2. 当您看到分配/使用时,您将名称替换为堆栈顶部的任何内容。

  3. 当你离开一个作用域时,你把它从堆栈中弹出。

于 2012-10-03T15:27:44.467 回答