CIL にコンパイルしようとしているカスタム スタック ベースの言語があるので、JIT できます。整数とブール値しか持たないため、言語自体はかなり単純です。ただし、各データ型には専用のスタックがあります。言語自体はコマンドのストリームであり、各コマンドはいずれかのスタックから値をピーク、プッシュ、および/またはポップできます。コマンドによってプッシュ/ポップされる整数またはブール値の数は変更されません (したがって、コマンドのアリティは固定されます)。外部メモリを表す、言語が値を読み書きするフラットな整数配列もあります。スタック自体は、任意の深さにすることができます。
「加算」、「減算」などの単純なコマンドの場合、整数スタック コマンドを CIL に変換するのはほとんど簡単です。CIL スタックは整数スタックを大規模に置き換えることができます (ただし、副次的な質問があります: 方法に制限はありますか? CIL スタックの深さは、仕様上でも実際上でもかまいませんか?) ただし、StoreIfTrue のようなコマンドもあります。これは、(整数スタックからの) 値のみをあるインデックス (整数スタックからのインデックス) のフラットな整数配列に格納するだけです。 ) ブール スタックの一番上の値が true の場合。そのため、一部のコマンドでは、ブール スタックと整数スタックに同時にアクセスする必要があります。
現在、ブール値のスタックを表す System.Collections.Generic.Stack を維持する必要があります。しかし、私のカスタム言語の 2 つのスタック モデルを、CIL とより直接的に互換性のある単一のスタック モデルに "フラット化" するための既知のアルゴリズムまたは方法があるかどうか疑問に思っています。