15

私は C++ で書かれた高性能システムに取り組んでいます。プロセスは、このアプリケーション用に開発された単純な言語で記述された複雑なロジック (ルール) を実行時に理解できる必要があります。2 つのオプションがあります。

  1. ロジックの解釈 - 組み込みインタープリターを実行し、動的関数呼び出しを生成します。これは、データを受信すると、解釈されたロジックに基づいてデータに作用します

  2. ロジックを plugin.so 動的共有ファイルにコンパイルし、dlopen、dlsym を使用してプラグインをロードし、実行時にロジック関数を呼び出します。

オプション 2 は、最適化されたマシン コードであり、プロセスに組み込まれたインタープリターよりもはるかに高速に実行されるため、非常に魅力的です。

私が検討しているオプションは次のとおりです。

    • コンパイルメソッドを書く string compile( string logic, list & errors, list & warnings )
    • ここで入力ロジックは、カスタム言語でコード化されたロジックを含む文字列です
    • llvm ir を生成し、compile メソッドの戻り値は ir 文字列を返します
    • リンクメソッドを書く bool link(string ir, string filename, list & errors, list & warnings)
    • リンク メソッドについては、llvm のドキュメントを検索しましたが、そのようなメソッドを作成する可能性があるかどうかを確認できませんでした。

    私が正しければ、LLVM IR は LLVM バイト コードまたはアセンブリ コードに変換されます。次に、LLVM JIT を使用して JIT モードで実行するか、GNU アセンブラーを使用してネイティブ コードを生成します。

    それを行うLLVMで関数を見つけることは可能ですか? C++ のシステム コマンドを使用して "as" を呼び出して、私の要件に合わせて plugin.so ファイルを生成するよりも、すべてコード内で行う方がはるかに優れています。

    実行時にプロセスから共有ライブラリのネイティブ バイナリ コードを生成する方法を知っている場合はお知らせください。

    4

    1 に答える 1

    3

    llc は、LLVM-IR からバイナリ コードへの変換を行う llvm ツールです。必要なのはそれだけだと思います。

    基本的に、LLVM IR を好きなように作成してから、IR を介して llc を呼び出すことができます。

    コマンドラインから呼び出すことも、llc の実装に移動して、独自のプログラムでそれを行う方法を確認することもできます。

    便利なリンクは次のとおりです。

    http://llvm.org/docs/CommandGuide/llc.html

    お役に立てば幸いです。

    于 2014-05-02T19:59:33.360 に答える