17

I have no experience with llvm or clang, yet. From what I read clang is said to be easily embeddable Wikipedia-Clang, however, I did not find any tutorials about how to achieve this. So is it possible to provide the user of a c++ application with scripting-powers by JIT compiling and executing user-defined code at runtime? Would it be possible to call the applications own classes and methods and share objects?

edit: I'd prefer a C-like syntax for the script-languge (or even C++ itself)

4

5 に答える 5

15

チュートリアルはわかりませんが、Clangソースに役立つCインタープリターの例があります。ここで見つけることができます:http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

この方法を使用すると、スクリプト言語の構文を選択する機会が少なくなる可能性があります。Clangは、C、C ++、およびObjective Cのみを解析します。バリエーションが必要な場合は、作業を切り取ってもらうことができます。

于 2010-07-12T14:02:23.240 に答える
7

これがまさにあなたが説明したことだと思います。

http://root.cern.ch/drupal/content/cling

于 2013-09-04T02:20:36.433 に答える
6

他の回答で述べられているように、clangをライブラリとして使用してJITコンパイルを実装できます。次に、コンパイルされたモジュール(たとえば、.soライブラリ)をロードする必要があります。

これを実現するには、標準のdlopen(unix)またはLoadLibrary(windows)を使用してロードし、dlsym(unix)を使用して、コンパイルされた関数、たとえば名前がわかっている「スクリプト」main()のような関数を動的に参照します。 。C ++の場合、マングルされたシンボルを使用する必要があることに注意してください。移植可能な代替手段は、例えばGNUのlibltdlです。

別の方法として、「スクリプト」は、モジュールのinit関数を実装するか、静的コードを配置することにより、ロード時に自動的に実行される場合があります(C ++グローバル定義オブジェクトのコンストラクターがすぐに呼び出されます)。

ロードされたモジュールは、メインアプリケーション内のすべてのものを直接呼び出すことができます。もちろん、シンボルはコンパイル時に適切なメインアプリのヘッダーファイルを使用して認識されます。

プログラムにC++「プラグイン」を簡単に追加し、コンポーネントインターフェイスを事前に知りたい場合(たとえば、モジュールがメモリにロードされる前に、メインアプリケーションがロードされたクラスの名前とインターフェイスを.hから知っている場合)ライブラリを動的にロードし、静的にリンクされているかのようにクラスを使用できます。モジュールをdlopen()する前に、クラスのオブジェクトをインスタンス化しようとしないように注意してください。

静的コードを使用すると、プラグインの自動登録メカニズムも実装できます。

于 2013-05-18T09:59:07.003 に答える
1

Clangについてはわかりませんが、Chを確認することをお勧めします。

http://www.softintegration.com/

これは、埋め込み可能またはスタンドアロンのc /c++インタープリターとして説明されています。ここにそれを埋め込む例を含むドブス博士の記事があります:

http://www.drdobbs.com/architecture-and-design/212201774

私はそれで遊ぶ以上のことはしていませんが、それは安定した成熟した製品のようです。これは商用のクローズドソースですが、「標準」バージョンは個人使用と商用使用の両方で無料であると説明されています。ただし、ライセンスを見ると、「商用」には社内での使用のみが含まれ、販売または配布される製品に埋め込まれていないようです。(私は弁護士ではないので、ライセンス条項を確認するためにSoftIntegrationに確認する必要があります。)

于 2010-07-13T17:41:50.750 に答える
0

あなたの場合、 ClangのようなCまたはC++コンパイラを埋め込むことが良い考えかどうかはわかりません。「スクリプト」、つまり(実行時に!)フィードされる(CまたはC ++)コードは任意である可能性があるため、アプリケーション全体をクラッシュさせることができます。通常、誤ったユーザー入力によってアプリケーションがクラッシュすることは望ましくありません。

未定義の動作はC++(アプリケーションで使用される「C ++スクリプト」を含む)にも関連して適用されるため、すべてのCプログラマーが知っておくべき ことを必ずお読みください。残念ながら、多くのUBはプロセスをクラッシュさせないことに注意してください(たとえば、バッファオーバーフローにより、完全に無関係なデータが破損する可能性があります)。

インタプリタを埋め込みたい場合は、GuileLuaなど、その目的のために設計されたものを選択し、スクリプトのエラーによってアプリケーション全体がクラッシュしないように注意してください。インタプリタの埋め込みの詳細については、この回答を参照してください。

于 2015-02-21T09:34:17.813 に答える