私は、スクリプト機能を使用してC ++アプリケーションを最適に拡張する方法を研究しており、PythonまたはJavaScriptのいずれかを検討しています。ユーザー定義のスクリプトには、アプリケーションのデータモデルにアクセスする機能が必要です。
これらのスクリプトエンジンを埋め込んだ経験はありますか?いくつかの潜在的な落とし穴は何ですか?
私は、スクリプト機能を使用してC ++アプリケーションを最適に拡張する方法を研究しており、PythonまたはJavaScriptのいずれかを検討しています。ユーザー定義のスクリプトには、アプリケーションのデータモデルにアクセスする機能が必要です。
これらのスクリプトエンジンを埋め込んだ経験はありますか?いくつかの潜在的な落とし穴は何ですか?
Luaは、プログラムに埋め込むための優れた候補でもあります。その非常に自己完結型であり、ネイティブのクロスランゲージコールシステムでさえ悪くはありません。
JavaScriptの場合、現時点での最善の策は、操作が簡単なV8(Google製)を確認することです。
Boost::Pythonライブラリを使用して Python を埋め込むのは確かに簡単です(わかりました、皮肉です。) クロスランゲージ機能に関しては、何も「簡単」ではありません。Boost は、このような開発を支援するために多くのことを行ってきました。私が一緒に働いた開発者の 1 人は、Boost->Python インターフェースについて断言しています。彼のコードは、UI に組み込まれた REPL を使用して、ユーザーが Python でプログラミングできます。すばらしい。
ただし、私の経験は、SWIG や Java などの他の言語を使用した方がよく観察されています。私は現在 SWIG と協力して C++ を Python でラップしています。例外、スレッド化、クロスランゲージ ポリモーフィズムなど、さまざまな落とし穴があります。
まずはこの2ヶ所を目指します。私が言ったように、「簡単」なことは何もありませんが、これらはどちらも人生をより住みやすくします.
本当に Python や Javascript に慣れていない限り、 Luaの使用を検討したいと思います。完全に組み込みスクリプト エンジンとして設計されているため、C および C++ が既にうまく行っていることとのかなりの重複が排除されます。また、C の呼び出し可能な関数に関して、コードと Lua エンジンの間のインターフェースのみを使用する限り、組み込みも非常に簡単です。
C++ レベルのインターフェイスを使用する場合は、LuaBindを参照してください。これにより、作成した C++ クラス (生成するプロキシ) から派生する Lua クラスなどを使用できます。
Boost :: Pythonは、ウィーティーズの回答と同様に、非常に成熟したソリューションです。
Luaは埋め込みが簡単であるという評判がありますが、私はこれを自分で試したことはありません。
Rのユーザーとして、私はRInsideパッケージを使用して可能なRを埋め込むことにもっと興味があります。簡単な例は
#include <RInside.h> // for the embedded R via RInside
int main(int argc, char *argv[]) {
RInside R(argc, argv); // create an embedded R instance
R["txt"] = "Hello, world!\n"; // assign a char* (string) to 'txt'
R.parseEvalQ("cat(txt)"); // eval the init string, ignoring any returns
exit(0);
}
パッケージにはさらにいくつかの例があります。 RInsideは基本的に、 Rcppインターフェイスパッケージの一部を使用して、Rエンジンの優れたラッパーを提供します。
シンプルで埋め込みが簡単な、c/c++ のような構文の angelscript をご覧ください。無料でcorssプラットフォーム。数時間で開始できます。