質問

バイトコードインタープリターを設計するとき、スタックまたは3つのアドレス形式(または他の何か?)が優れているかどうかについて、最近のコンセンサスはありますか?私はこれらの考慮事項を見ています:

  1. 客観的な言語は、JavaScriptにかなり似た動的言語です。

  2. パフォーマンスは重要ですが、開発の速度と携帯性は今のところそうです。

  3. したがって、実装は当面の間、厳密に通訳となります。 JITコンパイラが後でリソースを許可します。

  4. 通訳はCに書かれます。

役に立ちましたか?

解決

OCAMLバイトコードインタープリターをご覧ください - これは、この種の最速の1つです。これはかなりスタックマシンであり、ロード時にねじ付きコードに変換されます(GNUコンピューターexto拡張機能を使用)。また、フォースのようなスレッドコードを生成することもできますが、比較的簡単にできるはずです。

ただし、将来のJITコンパイルを念頭に置いている場合は、スタックマシンが実際にはフル機能のスタックマシンではなく、代わりに式のシリアル化フォーム(.NET CLIなど)であることを確認してください。 「スタック」バイトコードを3つのアドレスフォームに変換してからSSAに変換します。

他のヒント

読んだ ルアの進化LUA 5.0の実装 LUAがスタックベースの仮想マシンからレジスタベースの仮想マシンにどのように変更されたか、そしてそれがパフォーマンスを獲得した理由について。

David GreggとRoberto Ierusalimschyが行った実験は、同じタスクを実行するために必要なバイトコード命令(したがって、デコードオーバーヘッド)が少ないため、レジスタベースのバイトコードがスタックベースのバイトコードよりもうまく機能することを示しています。そう 3つのアドレス形式は明確な勝者です。

この分野ではあまり経験がないので、以下の一部を自分で検証したいと思うかもしれません(または、他の誰かが必要に応じて私を修正できるのでしょうか?)。

私が現在ほとんどで働いている2つの言語は、C#とJavaなので、私は自然に彼らの方法論に傾いています。ほとんどの人が知っているように、両方ともバイトコードにコンパイルされ、両方のプラットフォーム(CLRとJVM)がJITを利用します(少なくとも主流の実装では)。また、各プラットフォームのジッターはc/c ++で書かれていると思いますが、私は本当に確かではありません。

全体として、これらの言語とそれぞれのプラットフォームはあなたの状況にかなり似ています(動的な部分は別としてですが、これが重要かどうかはわかりません)。また、それらはそのような主流の言語であるため、彼らの実装はあなたのデザインのかなり良いガイドとして役立つと確信しています。


それが邪魔にならないので、CLRとJVMの両方がスタックベースのアーキテクチャであることを確かに知っています。スタックベースのvsレジスタベースで私が覚えている利点のいくつかは

  1. 小さい生成コード
  2. よりシンプルな通訳
  3. よりシンプルなコンパイラ

また、スタックベースはもう少し直感的で読みやすいと思いますが、それは主観的なことであり、以前に言ったように、私はまだあまり多くのバイトコードを見ていません。

レジスタベースのアーキテクチャのいくつかの利点はあります

  1. より少ない指示を実行する必要があります
  2. より速い通訳者(#1からフォロー)
  3. 最も一般的なハードウェアはレジスタベースであるため、より簡単にマシンコードに翻訳できます

もちろん、それぞれの欠点を相殺する方法は常にありますが、これらは考慮すべき明らかなことを説明していると思います。

心にJITがある場合、ByteCodesが唯一のオプションです。

あなたが私のtiscriptを見ることができる場合に備えて: http://www.codeproject.com/kb/recipes/tiscript.aspx およびソース: http://code.google.com/p/tiscript/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top