私は、財務データの多くのCPU集中分析を行うクロスプラットフォーム(Mac OS X、Windows、およびLinux)アプリケーションを実装している最中です。分析エンジンの大部分は、速度の理由からC ++で記述され、ユーザーがアクセスできるスクリプトエンジンがC++テストエンジンとインターフェイスします。既存の大規模なユーザーベースで他の人気のあるソフトウェアをエミュレートするために、時間をかけていくつかのスクリプトフロントエンドを作成したいと思います。最初のフロントは、VisualBasicのようなスクリプト言語になります。
LLVMは私のニーズにぴったりだと思います。データ量が非常に多いため、パフォーマンスは非常に重要です。回答を得るためにテストを1回実行するのに、数時間または数日かかる場合があります。LLVMを使用すると、単一のバックエンドソリューションを使用できるようになると同時に、スクリプト言語のさまざまなフレーバーに対してさまざまなフロントエンドを実装できるようになると思います。
テストエンジン自体はインターフェイスから分離され、テストは別のプロセスで行われ、進行状況と結果がテスト管理インターフェイスに報告されます。テストは、テストエンジンコードと統合されたスクリプトコードで構成されます。
私が書いた同様の商用テストシステムの以前の実装では、C ++で記述され、テストエンジンライブラリに直接リンクされているため、テストライブラリと簡単にインターフェイスできる高速インタプリタを構築しました。スクリプトコードからライブラリオブジェクトのテストへのコールバックには、かなりのオーバーヘッドを伴うフォーマット間の変換が含まれていました。
LLVMを使用すると、コールバックをC ++に直接実装して、スクリプトコードをC++で記述されているかのように機能させることができると想像しています。同様に、すべてのコードがLLVMバイトコード形式にコンパイルされた場合、LLVMオプティマイザーはスクリプト言語とC++で記述されたテストエンジンコードの間の境界を越えて最適化できるようです。
毎回テストエンジンをコンパイルする必要はありません。理想的には、スクリプトコードのみをJITコンパイルしたいと思います。小規模なテストの場合は、いくつかの最適化パスをスキップしますが、大規模なテストの場合は、リンク中に完全な最適化を実行します。
それで、これは可能ですか?テストエンジンを.oオブジェクトファイルまたは.aライブラリファイルにプリコンパイルしてから、JITを使用してスクリプトコードにリンクできますか?
最後に、理想的には、スクリプトコードに特定のC++クラスのサブクラスとして特定のメソッドを実装してもらいたいと思います。したがって、C++テストエンジンはC++オブジェクトのみを認識しますが、JITセットアップコードは、オブジェクトのメソッドの一部を実装するスクリプトコードをコンパイルします。正しい名前マングリングアルゴリズムを使用した場合、スクリプト言語のLLVM生成を、テストエンジンにリンクできるC++メソッド呼び出しのように設定するのは比較的簡単なようです。
したがって、リンク段階は2つの方向に進みます。つまり、スクリプト言語からテストエンジンオブジェクトを呼び出して価格情報とテスト状態情報を取得し、テストエンジンから特定のC++オブジェクトのメソッドを呼び出します。コードはC++からではなくC++から提供されます。スクリプト言語から。
要約すれば:
1)JITコンパイル、コード生成プロセスの一部として、プリコンパイルされた(.bc、.o、または.aのいずれかの)ファイルにリンクできますか?
2)すべてC ++で記述されているかのように動作するコードを作成できるように、上記の1)のプロセスを使用してコードをリンクできますか?