-1

私と私の友人は、ジャスト イン タイム コンパイルを使用して独自のプログラミング言語を作成することを考えています。使用する Assembly については同意しましたが、変数を格納する方法についてはよくわかりません。私たちが同意したのは、これらの構造です。

変数はキーに置き換えられます (コンパイル中)。すべてのキーは、1 から 65535 の範囲の 2 バイト整数です。たとえば、名前空間内に変数がある場合、そのキーは最初に名前空間のキーを含む 2 バイト整数から存在し、次に名前空間を含む 2 バイト整数から存在します。実際の変数のキー。

たとえば、名前空間 foo があり、その中に変数 test があり、名前空間 foo にキー 1 が割り当てられ、1 内の変数 test にキー 1->1 が割り当てられるとします。(最初の名前空間の最初の変数)。アセンブリ自体では、これらのキーを NULL バイトで終了します。(これは、コンパイル前の実際のコードではなく、コンパイルされたアセンブリであることに注意してください)

GETV 1 1 0 SET 5 RET

このアセンブリは名前空間 foo から変数 test を取得し、それを 5 に設定します。その後、その変数を返します。

GETV 1 2 1 0 SETV 1 1 0 RET

このアセンブリは、次の (架空の) コードと一致する可能性があります。

foo::testClass::test = foo::test;
return foo::test;

次の構造を提供することが与えられます。

namespace foo { // 1 First Global Variable
    byte test = 1; // 1 1 - First Variable Inside First Global Variable
    class testClass { // 1 2 - Second Variable Inside First Global Variable
        static byte test = 0; // 1 2 1 - First Variable Inside Second Variable Inside First Global Variable
    }
}

これらの変数にアクセスするにはどうすればよいですか? 私の現在の計画は、キーを文字列としてハッシュとして使用して、ハッシュマップ内にそれらを格納することでした。現在のキーに格納されている変数の種類、その長さ、およびそれを使用して計算を行う方法をどのように知ることができるので、これを行う方法がわかりません。符号なし整数を符号付き整数に追加するなどの狂った計算を防ぐことはコンパイラによって処理される可能性があることは理解していますが、それでも変数の長さ、およびその処理方法という問題が残ります。(2 つの float を追加することは、2 つの整数を追加することとは異なる方法で処理されますよね?)

4

1 に答える 1

1

ここでの最善のアプローチは、変数にいくつかの奇妙な識別子を保持するのではなく、直接ポインターを使用することです。プログラムがコンパイルされると、人間中心の名前はもう必要ありません。

さらに重要なことは、変数の構造について考える必要があることです。言語の構文によっては、変数の値を保持するためのメモリに加えて、変数の型などのメタデータも保存する必要がある場合があります。この情報は、自動型キャストをサポートする場合にのみ必要です。言語が厳密に型指定されている場合、コンパイル時にすべての型の競合を解決できるため、実行時に型情報は必要ありません。

また、構文によっては、変数の人間が読める名前を実際のアドレスにマップするためのインデックスを保持する必要がある場合があります。このインデックスは、言語に次のような関数がある場合にのみ必要です。

var_by_name(s:string):pointer
于 2013-08-25T06:31:13.633 に答える