6

私はSchemeインタープリターを書いていました(完全にR5RSと互換性を持たせようとしています)が、VMオペコードにコンパイルすると高速になることに気づきました。(間違っている場合は訂正してください。)メモリ内のSchemeソースコードを解釈できますが、コード生成の理解に固執しています。

私の質問は次のとおりです。たとえば、JVMやその他のVM(または実際のマシン)の場合、解析ツリーからオペコードを生成するにはどのようなパターンが必要ですか?そして、もしあれば、そうすることの複雑さ、利点、または欠点は何でしょうか?

4

1 に答える 1

7

スキームの場合、JVMに関連する2つの主要な問題が発生します。

まず、JVMは明示的な末尾呼び出しアノテーションをサポートしていないため、高価なミニインタープリターのトリックに頼らずに、R5RS(3.5)で要求される適切な末尾再帰を保証することはできません。

2番目の問題は継続サポートです。JVMは継続の実装に役立つものを何も提供しないため、ここでもミニインタープリターを使用する必要があります。つまり、各CPSの自明な関数は次のクロージャを返す必要があり、それは無限のミニインタプリタループによって呼び出されます。

しかし、それでも多くの興味深い最適化の可能性があります。Bigloo(比較的高速なJVMバックエンドがあります)とKawaを確認することをお勧めします。一般的なコンパイル手法については、90分でSchemeをご覧ください。

それでも、解釈はコンパイルの実行可能な代替手段です(少なくとも、JVMでは、その厳しい制限と一般的な非効率性のため)。SISCがどのように実装されているかをご覧ください。これは、非常に興味深く革新的なアプローチです。

于 2012-10-25T08:36:24.443 に答える