10

Lisp、Tcl、Perl などのインタープリター言語があり、実行時にコード内でラムダ/プロシージャ/サブルーチンを定義し、同じセッション内で評価することが容易になります。

C++ など、解釈されたものよりもはるかに高速に実行されるコンパイル済み言語がありますが、実行時にコンパイル済みプログラム内で関数を定義し、それを実行することは、可能であれば簡単ではありません。

ここでの問題は、次のことを行うことです。

  1. 実行時に関数を定義します。たとえば、最初の入力データに基づいて、データの分析モデルを導き出します。

  2. 上記の関数をループで高速に実行します。たとえば、派生した分析モデルを適用して受信データを分析します。

私が見た 1 つの解決策は、あまりきれいではありませんでした。

  1. 分析モデルを表す手順は、初期入力データに基づいて組み込み Tcl で導出されました。

  2. ルックアップ テーブルは、楽観的に言えば適用範囲をカバーするサンプル ポイントの配列で Tcl の手順を評価することによって作成されました。

  3. ルックアップ テーブルは、Tcl インタープリターから (C++ で開発された) バイナリーに渡されました。

  4. 次に、入力データは、ルックアップ テーブル内の「十分に近い」値の間を補間することによって分析されました。

上記の解決策は機能しますが、概念と計算の両方でかなりの問題があります。したがって、質問: 純粋に C++ 内で関数を定義し、同じランタイム セッション内で実行できるようにすることは可能ですか?

概念的に言えば、関数を文字列として作成し、メモリ内でコンパイルし、何らかの方法で実行中のバイナリにリンクすることは可能ですか?

4

1 に答える 1

13

箱から出してすぐに動作するものが必要な場合は、ExprTKをご覧ください。自分で式パーサーを書きたい場合は、Boost Spiritをチェックしてください。

別の方法は、C++ コードをその場で作成し、それを共有ライブラリ (プラグイン) としてコンパイルし、実行時にロードすることです。これはおそらく最速のソリューションです。

于 2013-09-04T18:34:48.163 に答える