22

次の機能を備えたVMを探しています。

  • コンパイルされたコードのフットプリントが小さい(200K未満)。
  • 外部依存関係はありません。
  • Unicode(またはraw)文字列のサポート。
  • クリーンなコード/よく整理されています。
  • C(99)コード、C++ではありません。
  • C/Javaのような構文
  • 演算子/ビット単位:AND/ORなど。
  • スレッドのサポート。
  • 汎用/ポータブルバイトコード。バイトコードは、エンディアンなどが異なる異なるアーキテクチャでコンパイルされた場合でも、異なるマシンで動作するはずです。
  • Barebones、特別なものは必要ありません。基本的な言語のサポートのみ。
  • レクサー/パーサーとコンパイラーはVMとは別のものです。プログラムにVMを埋め込み、バイトコードを個別にコンパイルします。

これまで、 LuaSquirrelNekoPawnIo、AngelScript ...を確認しましたが、仕様にやや近いのはLuaだけですが、構文はひどく、ビット単位のサポートがなく、コードスタイルもありません。一般的には最悪です。リスとIOは、ほとんどが巨大です。ポーンは問題があり、小さいですが、バイトコードはクロスプラットフォームではなく、実装にはいくつかの重大な問題があります(たとえば、バイトコードはまったく検証されておらず、ヘッダーAFAIKも検証されていません)。

私はそこに適切なオプションを見つけたいと思います。

ありがとう!

更新: Javascriptインタープリターは...インタープリターです。これはバイトコードベースのVMのVMの質問であるため、コンパイラ/バイトコードのVM分離要件です。JSは解釈され、JITによってコンパイルされることはめったにありません。必ずしもJITは必要ありません。また、現在のすべてのECMAScriptパーサーはほとんど小さいです。

4

7 に答える 7

6

あなたはNekoVMをレビューしたと言っていますが、それがあなたに適していない理由については言及していません。

C++ ではなく C で記述されており、VM は 10kLOC 未満で、コンパイルされたサイズは約 100kB であり、コンパイラは移植可能なバイトコードを生成する別の実行可能ファイルです。言語自体は C に似た構文、ビットごとの演算子を備えており、スレッドに敵対的ではありません。

于 2011-03-12T02:02:42.820 に答える
3

最後に、これまでのところ、実際にそれを行った回答はありませんでした。LUAをフォークすることになりました。今日の時点で、上記の要件を備えた自己完結型の VM は存在しません... 残念です ;(

それでも、コードに問題がなければ、Pawn は非常に優れています。

于 2011-04-28T05:17:37.283 に答える
1

非常に「ベアボーン」なものの場合:

http://en.wikibooks.org/wiki/Creating_a_Virtual_Machine/Register_VM_in_C

当然のことながら、何よりもトピックの簡単な紹介です。

それでも、少なくとも次のいくつかの望ましい基準を満たしている可能性があります。

  • コンパイル済みコードのフットプリントが小さい (200K 未満) ... チェック、明らかに;
  • 外部依存関係はありません...チェック;
  • きれいなコード/よく整理された...チェック;
  • C(99) コード、C++ ではありません ... チェック;
  • C/Java ライクな構文 ... チェック。
于 2014-04-14T09:44:36.213 に答える
1

EmbedVM を試してください。

http://www.clifford.at/embedvm/

http://svn.clifford.at/embedvm/trunk/

これは、推測ゲームのコードの例です。コンパイラは、lex+yacc を使用して C で構築されています。

global points;

function main()
{
    local num, guess;
    points = 0;
    while (1)
    {
        // report points
        $uf4();

        // get next random number
        num = $uf0();
        do {
            // read next guess
            guess = $uf1();
            if (guess < num) {
                // hint to user: try larger numbers
                $uf2(+1);
                points = points - 1;
            }
            if (guess > num) {
                // hint to user: try smaller numbers
                $uf2(-1);
                points = points - 1;
            }
        } while (guess != num);

        // level up!
        points = points + 10;
        $uf3();
    }
}

スレッドのサポートはありません。ただし、VM にはグローバルな状態がないため、同じプロセスで複数のコピーを簡単に実行できます。

API は単純です。VM RAM は、コールバックを介してアクセスされます。メインループがembedvm_exec(vmdata)繰り返し呼び出され、単一の操作を実行して戻ります。

VM のフットプリントは小さく、8 ビット マイクロコントローラーで使用されています。

于 2012-04-10T19:16:49.120 に答える
0

オプションでは、最小限のものを使用して拡張することです。mini-vmは、コメントを含めて 200 行未満のコードで、リベラル ライセンス (MIT) があり、C で記述されています。すぐに使用できる操作は 0 ですが、拡張は非常に簡単です。含まれているサンプル コンパイラは、単なる計算機です。しかし、比較、ブランチ、メモリ アクセス、およびスーパーバイザー呼び出しを追加して、目的の場所に移動することは容易に想像できます。拡張が容易な VM は、ドメイン固有言語の開発に特に役立ちます。また、複数のコンパイラを実装する (またはそれらを移植する) 必要がないことを除けば、複数の言語でミニ VM のフレーバーをターゲットにすることは簡単です。QuakeC コンパイラは単なる lcc です。非常に簡単にリターゲットできます)。

スレッド化のサポートは拡張である必要があり、コア VM はマルチプロセッサ pthread シナリオ (ヘビーウェイト スレッド化) では適切に動作しません。奇妙なことに、mini-vm は重いスレッドごとに pc (プログラム カウンター) を持つことができますが、同じコンテキストを使用するすべてのスレッド間でレジスタを共有します。ただし、個別のコンテキストを実行すると、スレッドセーフになります。

質問はベアボーン VM の要求から始まるため、言語に関する要件への回答はスキップします。しかし同時に、C/Java のような構文が要求され、この競合を述べる以外にその競合を解決する方法がわかりません。

于 2017-03-04T01:54:40.397 に答える
-1

コードに JavaScript インタープリターを埋め込んでみてください。

http://www.mozilla.org/js/spidermonkey/

于 2011-03-12T01:18:14.067 に答える