仮想マシンを構築したいのですが、良い参考資料はありますか?[閉まっている]


22

ゲームコード(本質的にスクリプト)を実行するプラットフォームに依存しない方法として仮想マシンを構築したいと考えています。

私がゲームで知っている仮想マシンはかなり古く、InfocomのZ-Machine、LucasArtsのSCUMM、id SoftwareのQuake 3です。.net開発者として、私はCLRに精通しており、CIL命令を調べて、VMレベル(言語レベル)で実際に実装するものの概要を取得しました。昨年、6502 Assemblerでも少し手を出しました。

問題は、これを実装したい¹ので、もう少し深く掘り下げる必要があります。スタックベースのVMとレジスタベースのVMがあることは知っていますが、どのアプローチがどれが優れているか、また、より多くのアプローチまたはハイブリッドアプローチがあるかどうかはわかりません。メモリ管理に対処し、どの低レベルタイプがVMの一部である判断し、ldstrのようなものが動作する理由を理解する必要があります。

私の唯一の参考書(Z-Machineのものを除く)はCLI Annotated Standardですが、VMに関するより良い、より一般的/基本的な講義があるのでしょうか?基本的にDragon Bookのようなものですが、VM用ですか?レジスタベースのVMを使用するドナルドクヌースのコンピュータープログラミング技術は知っていますが、特に未完成であるため、そのシリーズがまだどのように適用できるのかわかりません。

明確化:目標は、専用のVMを構築することです。たとえば、InfocomのZ-Machineには、背景色を設定したり、サウンドを再生したりするためのOpCodeが含まれています。したがって、スクリプト(言語TBD)を受け取り、それからバイトコードを生成するコンパイラーに対して、OpCodesとしてVMにどれだけの量が入るかを把握する必要がありますが、そのためには、実際に何をしているのかを理解する必要があります。


¹最新の技術により、高レベルのスクリプト言語をその場で解釈することができます。しかし、その面白さはどこにありますか?:)また、最近では仮想マシンはVMWareタイプのOS仮想化に関連付けられていることが多いため、Googleを検索するのも少し難しいです...


6
スタックベースのマシンをチューリング完了させるに、スタック外のメモリが必要です。それ以外の場合は、PDA
ラチェットフリーク

1
最初の質問は、どこまで行きたいですか?私はSCUMM / SCUMMVMを見たことはありませんが、CILが...のように動き回るグラフィカルなものについて非常に高いレベルで知っていると仮定します...すなわちアセンブラ命令)、その後、VMの最初のバージョンは、ループであるdo { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);かもしれない、コンパイラ...そして楽しい開始-それは実際に動作させるために最適化
ヨハネス

3
単純なForthランタイムの実装から始めてみてください。
SKロジック

1
Quake 3仮想マシンはどのくらい正確ですか?
ラムハウンド

3
@Ramhound IDテックエンジンは長い間、内部仮想化のいくつかのフォームを使用しているこの記事では、またはウィキペディアの情報は、より良い説明するかもしれません。
ダニエルB

回答:


18

Luaをチェックすることから始めます。サンプル実装としても、最終的に独自のロールを行わないことにした場合は、すぐに使用できる非常に便利なVM /言語としても。

ソースコードは非常に読みやすく、注釈付きソースコードもあります。そして、主な著者であるロベルト・エルサリムスキによって書かれたいくつかのデザイン文書

最後に、自分の代わりに使用することを選択した場合、ゲーム開発者の間で長い間人気があり、非常に高いパフォーマンスのJIT実装があることがわかります。

スタックベースとレジスタベースについては、スタックベースのVMの方が設計が簡単だと思いますが、コンパイラはより複雑になる可能性があります。Iesualimschyのペーパーノートにあるように、Luaは最初のレジスタベースの言語VMの1つでしたが、その後、LLVM、Dalvik、およびいくつかの最新のJavaScript VMなど、他のいくつかの仮想マシンが発芽しました。


2
レジスタマシン対スタックについて:私はオウム/ Perl6の開発者からの引用を覚えている:「レジスタベースのマシンを構築することは難しいですが、私たちは私たちのコンパイラ側の既存研究のトンの恩恵を受ける」(リテラルではありません)
ヨハネス

+1 Luaには、優れたバイトコードの実装と、VMについて学習するための非常にクリーンな設計があります。さらに、多くの人が自分のニーズに合わせてLuaをカスタマイズしており、ゼロから始めたくない場合は非常に拡張可能であることがわかります。
CodexArcanum

まだこれを行っています。VMに関する開発者からの別の素晴らしいドキュメント:inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
Michael Stum

2

現時点では、リンクするための特定のリソースはありませんが、過去に同様のトピックを調査した結果、Smalltalk VMも学習に役立つことがわかりました。Smalltalkで使用されるバイトコードについて書かれた学術論文や記事が多数あり、そのバイトコードを使用するためのインタープリターやVMの作成もあります。Googleで検索するとsmalltalk vm implementationsmalltalk bytecode interpreter多くの読み物が得られるはずです。

ソースコードを表示したり、実装を試してみたい場合は、SqueakまたはPharoのバージョンをお勧めします。

Selfは基本的にプロトタイプベースのオブジェクトを備えたSmalltalk(JavaScriptに似ています)であるため、関連する言語/ VM Selfにも興味があります。


0

[スクリプト]ソースコードがマシンまたはランタイム環境にどのように侵入するかを分析することから始めます。

HTMLドキュメントのようなもの<a onclick="dosomething();">がある場合、非常に高速なコンパイラが必要になります。この場合、バイトコードの実行速度はそれほど重要ではありません。ユースケースがJava / .NETに近く、完全にコンパイルできる場合、VMアーキテクチャとバイトコード構造は、JavaバイトコードまたはILに近くなります。

別の基準は、私が「グルーネス」と名付けたものです。もともとスクリプトはグルー言語として開発されました-スクリプトは、さまざまなネイティブ機能(Perl、Python、Ruby、JS)を接続する方法を定義するだけです。その場合、コードのほとんどが言語自体で記述された関数であるJava / .NETの場合よりも、VMおよびバイトコードの有効性はそれほど重要ではありません。

そして、私が使用する最後の主要な基準は、あなたの言語の拡張性です。C ++などで実装された多くのネイティブオブジェクト/関数を言語ランタイムに追加する計画がある場合、VMアーキテクチャはC ++との統合に「便利」である必要があります。たとえば、スクリプトC ++オブジェクトをそのまま公開する場合は、ヒープ管理として参照カウントするだけです(Pythonのように、統合の例としてboost :: pythonを参照してください)。移動/圧縮ヒープ/ GCを使用する場合は、別の話になります。ネイティブのものをランタイムに追加するLuaの方法は、少しトリッキーです(C ++開発者にとって)。

言い換えれば、最初に典型的なユースケースを定義しようとすると、何を読むべきかを提案しやすくなります。


1
最新のJavaScriptコンパイラーは非常に複雑であり、生成されたコードをどの程度最適化するかは常に疑問です。
johannes

JavaScriptの実行パフォーマンスが重要です。小さなスクリプト用ではなく、大規模なJSが多いサイトであり、良くも悪くも、人気のあるサイトの大部分を占めています。JSエンジンがJITコンパイラーを使用する理由があります(V8にはインタープリターさえありません。マシンコードに直接進みます)。

@delnan:JSのユースケースは、たとえばPythonとはまったく異なります。Pythonでは、レイトレーシングアルゴリズムの実装などが必要な場合、ネイティブライブラリを実行し、スクリプトから呼び出します。これは、どのJITソリューションよりも常に高速です(少なくとも遅くはありません)。JSレルムでは、ネイティブコードのような贅沢はありません。そのため、JS VMを可能な限り高速にすることが唯一の選択肢です。しかし、再び、価格で。HTMLでの "dosomethingnative()"の評価 "<button onclick =" dosomethingnative() ">シンプルインタープリターでの評価は、V8よりも桁違いに速くなる可能性があります。
c-smile

@ c-smileまさに私のポイント。

@delnan:しかし、私のポイントはかなり異なります:一般的なユースケースを分析し、それから初めて、VMのどのようなアーキテクチャ、言語構文などが必要になるかを決定できます。
c-スマイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.