9

私は現在 C++ を学んでおり、埋め込みスクリプト言語についてよく耳にします。想像してたけど全然違う。

パフォーマンスの高い関数はすべて C++ で記述し、Lua や Python などのスクリプト言語から呼び出すことにしました。

しかし、それは逆のようです。-> Lua/Python で関数を作成し、C コードで呼び出します。

C++ で API を記述し、それらの関数を別の言語で呼び出す代わりに、言語を C++ に埋め込む利点は何ですか?

例:

// function in c++
int expensiveFunction(){
  return 1;
}

次に、Python でこの関数を呼び出すと、C++ のパフォーマンスが得られますが、Python のランタイム インタープリターのおかげで実行時に変更を加えることができます。

4

6 に答える 6

5

実際、多くのゲーム エンジンは、Lua や Python を埋め込んでエンジンへのインターフェイスを構築することを好みます。これには次の利点があります。

  • プログラマーでなくても、エンジンとやり取りできます。
  • スクリプトのマイナーな変更のために再コンパイルする必要はありません。
  • スクリプトのエラーによって、システム全体がクラッシュするわけではありません。

C++ は、スクリプト言語の柔軟性と C++ のパフォーマンスが必要なプロジェクトのバックエンドとして非常に便利です。C++ をフロントエンドとして使用し、スクリプト言語をバックエンドとして使用するプロジェクトは聞いたことがありません。

API スタイル

私の会社のソフトウェアでは、このスタイルを使用しています。ほとんどの言語でかなり簡単に呼び出すことができる Windows DLL を介して API を公開します。特に VB と VBA をサポートしています。これは、バックエンドがスクリプト作成者の制御外にある場合に最適です。ただし、スクリプト作成者の観点から発生する問題をデバッグするのは困難です。

利点

  • 強力なデカップリング
  • さまざまな言語からアクセス可能

短所

  • 2 プロセスのデバッグが困難

埋め込みスタイル

ソフトウェアは実際にスクリプト インタープリターをソフトウェアに組み込みます。このようにして、あたかもネイティブ関数であるかのように機能を公開できます。このスタイルでは、通常、スクリプト作成者とバックエンド プログラマーが同じ会社にいます。また、従来のソフトウェアで使用して、他のユーザーがアプリケーションの機能を拡張できるようにすることもできます。ソース コードを共有すると、スクリプトに起因する問題をより簡単にデバッグできます。アプリケーションは、スクリプトを起動するタイミングと方法も処理します。ただし、追加の言語をサポートするために、アプリケーション開発者は他のインタープリターを埋め込む必要があります。

利点

  • より強いカップリング
  • 1 つのプロセスのデバッグが容易

短所

  • 承認された言語でのみアクセス可能
于 2012-11-05T23:37:15.440 に答える
4

実際、どちらのアプローチもうまく機能します。問題は、特定のアプリケーションにどのアプローチがより適しているかです。

たとえば、パフォーマンス重視のコードを言語の拡張として記述することは、誰かがスクリプト言語で小さなライブラリを使用しているように感じさせたいアプリケーションに適しています。Python アプリケーション内に含めるグラフィックス レンダリング用のパフォーマンスの高い API を提供したい場合は、これが最適な方法です。

一方、ゲーム エンジンのようにほぼ完全に C++ で記述されたエンジンがあり、再コンパイルを必要とせずにゲーム エンジンにフックする簡単な方法を提供したい場合は、インタープリターを埋め込むことができます。これが、geme エンジンが AI や行動フックなどをスクリプト言語で記述することが多い理由です。たとえば、ボットの「応答時間」を変更すると、ゲームを再起動しなくてもすぐに違いを確認できます。

どちらが「大きい」かは意図次第ですが、LuaでもPythonでも両方のアプローチができると思います。

于 2012-11-06T02:00:09.533 に答える
1

パフォーマンス、再コンパイル、保守性などの考慮事項の他に、コードのセキュリティも理由の 1 つです。

c/c++ のようなコンパイル済み言語は、他の人がソース コードなしで正確なアルゴリズムを知るのが難しい(不可能ではない) のに対し、スクリプトは実行時にコンパイルされるため、ロジックを知るのは (明らかに)簡単です。

于 2012-11-06T02:58:52.380 に答える
1

理由の 1 つは、独自の main 関数を持つ C++ フレームワークを使用したい (そしてそれをプログラムの main 関数として強制的に使用する) ことです。

私の意見では、それは多くの場合、フレームワークの悪い設計です。プログラムでそのようなフレームワークを複数使用するのは簡単ではありません...

同じことが、1 つのプログラム内の複数のスクリプト言語にも当てはまります。主な機能を提供できる言語は 1 つだけです。他のすべての言語を埋め込む必要があります。

注: スレッドを使用すると、「複数のメイン関数」のようなものを取得できます。まあ、実際には複数の主な機能ではありません。しかし、複数のイベント処理ループ。

于 2012-11-05T23:51:36.993 に答える
1

Python をロボット コントローラに組み込んだことがあります。コントローラーは、コンピューター チップのウエハーを扱うロボットを管理し、他のさまざまなデバイスも制御しました。顧客は、ウエハーがどこにあるかを把握する、ドアを開ける、ライトをオン/オフする、スイッチを読み取るなどの処理を実行する Python プログラムを作成できます。または、シリアル ラインまたはイーサネットから命令を読み取り、それらをアクションに変換することもできます。 . もちろん、ロボットの細かい制御は C++ レベルで処理され、リアルタイム OS 上で最も緊急の優先順位で実行されました。

于 2012-11-06T02:11:52.133 に答える
1

スクリプトは実行時にコンパイルされますが、メイン言語はコンパイル時にコンパイルされます。これにより、単純なスクリプトを更新するためにプロジェクト全体をコンパイルする必要がないため、大規模なコード ベースでの作業が比較的簡単になります。

于 2012-11-05T23:33:29.770 に答える