私と私の友人は、ジャスト イン タイム コンパイルを使用して独自のプログラミング言語を作成することを考えています。使用する 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 つの整数を追加することとは異なる方法で処理されますよね?)