12

私は、C++ アプリをユーザーがスクリプト可能にする作業に直面しています。このアプリは数年間開発されており、これまで誰も考えたことはありませんでした. マルチスレッド、テンプレートの魔法、多重継承など、あらゆる種類の優れた機能が含まれています。スクリプト言語としては Python が推奨されますが、実装がはるかに簡単な場合は Lua も受け入れられる可能性があります。

質問1

私がこれまでに学んだことから、Python/Lua と C++ を統合するには、大まかに言えば、「拡張」と「埋め込み」の 2 つの方法があります。

この場合、両方が必要なようです。スクリプト言語は、アプリからオブジェクト、メソッド、およびデータにアクセスする必要がありますが、ユーザーがスクリプトを記述したら、何も再起動せずにアプリによって呼び出される必要があります。

これは通常、現実の世界でどのように行われますか?

質問2

世の中には当惑するほど多くの手動ソリューションとバインディング ジェネレーターが存在するようですが、それらはすべて完璧とは言えません。

  • swig、pyste、Py++、ctypes、Boost.Python sip、PyCXX、pybindgen、robin、(Cython/Pyrex、Weave)
  • CppLua、Diluculum、Luabind、Luabridge、LuaCpp、Luna/LunaWrapper、MLuaBind、MultiScript、OOLua、SLB、Sweet Lua、lux (このリストは lua wiki から)
  • CPB、tolua、tolua++、toLuaxx、luna、そして再び swig

ウェブ上にあるこれらのコメントのほとんどは、少し古くなっています。たとえば、swig は、自明でないケースでは難しく、理解できないコードを生成すると言われています。OTOH、最近v2.0になりました。

上記のいくつかは、pygccxml を使用して、gcc が C++ コードを分析し、バインディングを生成できるようにします。gcc はおそらく私よりもコードをよく理解しているので、このアイデアは魅力的だと思います :-)。これはうまくいきますか?

それらすべてをテストすると、プロジェクト全体に割り当てられた時間の半分が簡単に費やされる可能性があります。

それで、あなたはどれをお勧めしますか?

4

5 に答える 5

12

複雑な状況で満足のいくバインディングを生成するのは難しいため、swig はお勧めしません。元の C++ コードを「解析」して、swig が噛んで許容可能なバインディングを生成できる許容可能な C++ コードを生成する、恐ろしいスクリプトを作成する必要がありました。したがって、一般的には、元の C++ プログラムの解析に依存するソリューションは避けてください。

Lua と Python の間: Lua の方がはるかによく文書化されており、よりきれいに実装されていることがわかりました。Python には GIL (グローバル ロック) がありますが、Lua では、たとえば、各スレッドにインタープリター インスタンスを含めることができます。なので、選べるならLuaをオススメします。それはより小さな言語であり、理解しやすく、埋め込みも容易です (よりクリーンで小さな API で、優れたドキュメントを備えています)。私は自分の小さなプロジェクトに luabind を使用しましたが、使いやすいことがわかりました。

于 2010-07-21T12:29:09.593 に答える
1

質問 1 について - はい、両方を行う必要があります。

アプリケーションのスクリプト インターフェイスを組み込みインタープリターに公開すると、問題のユーザー スクリプトが実行されます。

埋め込みに関する Python マニュアルのセクションには、Extending Embedded Pythonのセクションが含まれており、Lua についても同様のチュートリアルがあります。たとえば、この記事を参照してください。もちろん、どのスクリプト言語とバインド メカニズムを使用するかを決定した場合は、おそらくもっと簡単な方法を見つけることができます。

于 2010-07-21T12:51:40.600 に答える
1

上記のいくつかは、pygccxml を使用して、gcc が C++ コードを分析し、バインディングを生成できるようにします。gcc はおそらく私よりもコードをよく理解しているので、このアイデアは魅力的だと思います :-)。これはうまくいきますか?

同様のアプローチが Lua Qt バインディング - lqtで使用されています。を使用cpptoxmlして、パラメーターを含むすべてのクラスとメソッドを含む XML ファイルを生成し、それに従ってバインディング C++ コードを生成します。

ジェネレーターは、仮想メソッド、オーバーロードされたオペレーター、選択されたテンプレート クラス、シグナル/スロット メカニズムなどを含む、ほぼすべての Qt クラスとメソッドをバインドできます。

Qt用に特別に作成されましたが、汎用バインダーとして機能する「noqt」モードがありますが、残念ながら私はそれを使用した経験がないため、コードをバインドするのにどれだけの作業が必要かわかりません.

于 2010-07-21T14:53:53.503 に答える
0

私の経験はあまりないかもしれませんが、少なくともあなたが支払った金額の価値があると思います ;)

私は基本的な「hello world」python モジュールをいくつか実行しましたが、swig を実際に使用することはできませんでした。これは、私が行っていたことに対して多くのオーバーヘッドがあるように思えました。もちろん、それがあなたのニーズにちょうどいい量である可能性もあります.

于 2010-07-21T12:30:40.197 に答える
0

Boost::Python を試してみてください。ある程度の学習曲線が関連付けられていますが、私の見解では、この仕事に最適なツールです。私たちは巨大なリアルタイム システムを持っており、Boost::Python で QA 用のスクリプト ライブラリを開発しました。

于 2010-07-21T12:55:10.337 に答える