これは基本的なことかもしれませんが...ここに行きます。
Lua や Ruby などのスクリプト言語を C++ プログラムに組み込むことにした場合、そのインタープリターをリンクすることで、C++ で何ができるようになりますか?
Ruby や Lua のコードを cpp ファイルに書き込んだり、単にプログラムからスクリプトを呼び出したりすることはできますか?
後者が本当なら、どうすればいいですか?
それらはスクリプト言語であるため、コードは常に「解釈」されます。実際には、プログラム内のスクリプト コードを「呼び出し」ているのではなく、その時点に到達すると、そのスレッド (スクリプト部分に到達するスレッド) のコンテキストでインタープリターを実行していることになります。スクリプト言語を実行し、それを解釈した後に該当するマシン コードを実行します (JIT コンパイルのようなものですが、実際にはコンパイルは必要ありません)。
このため、コンパイル済みプログラム内またはコンパイル済みプログラムからスクリプト内の変数にアクセスする場合を除き、インタープリターをフォークしてスクリプトを実行するのと基本的に同じです。コンパイルされたプログラムのコンテキストを持つスレッドを使用しているため、値に/からアクセスするには、スクリプト変数もスタックに保存し、スレッドがインタープリターの実行を停止したときにそれらにアクセスできる必要があります (変数を保存したと仮定します)。スタック上)。
編集:応答:
あなたはそれを自分で書かなければならないでしょう。次のように考えてください。C++ でアセンブリを使用する場合は、asm キーワードを使用します。次に、C++ コンパイラで、ソース ファイルを解析し、asm キーワードを取得してから、アセンブリ コンパイラに切り替える必要があります。次に、アセンブリ コンパイラは asm 領域の終了ブラケットまで移動し、このコードをコンパイルする必要があります。
これを行いたい場合は、アセンブリが解釈されずにコンパイルされるため、少し異なります(これがやりたいことです)。あなたがする必要があるのは、あなたが使用しているコンパイラ(C++としましょう)を変更して、独自のユーザー定義キーワードを認識するようにすることです。このキーワードが scriptX{} だとしましょう。C++ のパーサーを変更して、scriptX{} が表示されたときに、コンパイル済みプログラムの読み取り専用データ セクションの括弧内のすべてを格納するようにする必要があります。次に、コンパイルされたアセンブリ ファイルにフックを追加して、スレッドのコンテキストをスクリプト インタープリターに切り替え、スクリプト セクションの先頭でプログラム カウンターを開始する必要があります (オブジェクト ファイルの読み取り専用データ セクションに配置します)。 .
頑張ってください...
スクリプト言語をプログラムに埋め込む一般的な理由は、エンド ユーザーが提供するスクリプトを使用してプログラムを制御できるようにすることです。
おそらく、このようなスクリプトの最も単純な例は構成ファイルです。プログラムにオプションがあり、実行ごとにオプションを覚えておく必要があるとします。これらをオプション構造のバイナリ イメージとしてファイルに書き出すことはできますが、それは壊れやすく、検査や編集が容易ではなく、システム間で移植できない可能性があります。オプションを何らかのラベルを付けてプレーンテキストで書き出すことで、これらの苦情のほとんどに対処できますが、そのテキストを解析してオプションを回復する必要があります。次に、一部のユーザーは火曜日に別のオプションを求めたり、簡単な計算を行って 1 つのオプションから別のオプションを計算したり、Windows と Linux の両方で使用できる 1 つの構成ファイルを作成したりします。それらのアイデアとメカニズムの。この時点で、
LuaとTCLの両方の言語は、本質的にそのシナリオから生まれました。大規模なシステムは、エンド ユーザーが構成および制御する必要がありました。エンド ユーザーは、(特に) 正常にコンパイルするのに何時間もかかる可能性のある大規模なシステムで作業している場合でも、単純なテキスト ファイルを編集してすぐに満足を得たいと考えていました。
ここでの利点の 1 つは、ユーザーのニーズの変化に合わせてプログラミング言語を一度に 1 つの機能を発明するのではなく、完全な言語とそのドキュメントから始めることです。言語設計者はすでに多くの困難な決定を下しており (文字列と数値をどのように表現するか、リストはどうするか、名前付きの値はどうするか、どのif
ように見えるかなど)、一般的には慎重に設計およびデバッグされた実装も提供しています。テーブルに。
Lua は統合が特に簡単です。シンプルな構成ファイルを読み取り、Lua 状態から設定を抽出することは、その C API の小さなサブセットを使用して行うことができます。Lua を利用できるようになれば、それを別の用途に使用するのも魅力的です。多くの場合、最も内側のループのみを C で記述し、Lua を使用してそれらの機能を結合し、アプリケーションのすべての「ビジネス ロジック」を提供する方が生産的であることがわかります。これが Adobe Lightroom の実装方法であり、単純なセットトップ ボックスから iOS デバイス、さらには PC に至るまでのプラットフォーム上の多くのゲームです。