1

単純なスタック マシン用の小さなコンパイラを作成しました。いくつかの仮想マシンのハックのみで、スコープ/機能を組み立てて処理できます。つまり、スコープを定義し、スコープ変数定義をバイトコード自体に定義します。

スコープをどのように処理する必要があるかについて、いくつかの指針を得ることができますか。

私が直面している問題は主に、外側の変数を内側の変数で上書きするときと上書きしないときをどのように知らせるかなどです。バイトコードは変更可能であり、変更したいと考えています。

その他の問題には、戻った後に変数を外部に保持する方法が含まれます。そのため、変数にはまだその値があります。スタックにプッシュできますが、多くの変数を持つことができます。

これらのことをチェックするためにコンパイラーの作業が行われていると思いますが、それを行うために何をする必要があるかはわかりません。

4

1 に答える 1

2

1 つの方法は、コンパイル時に変数の名前を変更して、マスキングがないようにすることです。そう:

{
   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 つの「rename-stack」を維持します。と:

  1. 宣言が表示されるたびに、新しい名前を生成し、対応する変数の名前変更スタックにプッシュします。

  2. 割り当て/使用法が表示されたら、名前をスタックの一番上にあるものに置き換えます。

  3. スコープを離れるときは、スタックからポップします。

于 2012-10-03T15:27:44.467 に答える