17

私は、財務データの多くの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)のプロセスを使用してコードをリンクできますか?

4

3 に答える 3

14
  1. はい、できます!使用するLLVMのバージョンに応じて、異なるAPI呼び出しがあります。2.5ではllvm::getBitcodeModuleProviderが必要になります。
  2. C ++関数を呼び出す最も簡単な方法は、フラグllvm :: Function :: ExternalLinkageを使用して関数(llvm :: Function :: Create)を作成し、次にaddGlobalMappingを使用してC++関数を指すようにすることです。
于 2010-05-19T01:57:00.287 に答える
3
  1. そう信じる。
  2. これは毛深いです。呼び出す関数のC++ABIと一致させる必要があり、生成されたコードが同じデータ構造、クラス、レイアウトなどを使用していることを確認する必要があります(ヘッダーファイルと同等のものを介して)。C ++ ABIには、かなりの数のニュアンスと移植性の問題があります。おそらく、最初にCとの相互運用を行うプロトタイプです。clang現在、C++のサポートは制限されています。
于 2010-05-10T20:40:30.830 に答える
1

1).bcファイルをロードしてリンクできます。.oファイルが.soアーカイブにコンパイルされている場合は、ロード可能であり、それらのシンボルを使用できる必要があります。

2)コールバックでひどいことをしたくない限り、おそらく標準のC関数ポインターを渡して、関数ポインターによってコールバックを行うことができます。他の特定のこともできますが、C ++コンパイラではないときに、C ++オブジェクトやテンプレートを定義したり、メンバー関数を呼び出したりすることは、やりたくないことです。

C ++ ABIを知っている必要があり、ターゲットとするプラットフォームについて知っている必要があります。あらゆる種類のことを知っている必要があります。事実上、C++のように見えるコードを生成するにはC++コンパイラである必要があります。マングラーという名前は、最も厄介な部分の1つです。

于 2010-06-21T14:07:39.207 に答える