web-dev-qa-db-ja.com

C ++のスクリプト言語

最近、キノコのようにポッピングしているスクリプト言語が少し錆びています。

今日、C++とシームレスに対話するスクリプト言語、つまりC++クラスを使用でき、私にとって最も重要なものをC++またはDLL/.SO(およびその。 h)C++プログラムにリンクして、スクリプトが定義または実装するクラスを利用できるようにするため。

Lua、Ruby、pythonなどの一般的なスクリプト言語を埋め込むことができますが、インターフェイスには通常、提供されたスクリプトコードを評価する何らかの「評価」関数が含まれています。 C++とスクリプト言語を結合するために使用されるツールに応じて、C++へのスクリプトのコールバックの統合は多少簡単に記述できますが、実際に独立したモジュールを記述できるスクリプト言語を見たことはありませんプログラムに.hおよび.so/dllとして公開されます(C++コードを生成するスクリプト言語の行に沿っている可能性があります)。

そのようなツール/スクリプト言語を知っていますか?

前もって感謝します。

PD。 Vala またはHaskellのGHCに沿って考えてきました。 Cは生成されますが、C++は生成されません...

39
Diego Sevilla

以下は、言語バインディングよりもC++統合指向です。

  • ChaiScript -ちょっとしたプロジェクトで試してみると、面白い、これはC++を念頭に置いて作られており、ヘッダーを含めるだけで機能します!まだ大きなプロジェクトに適しているかどうかはわかりませんが、それがわかるでしょう、試してみてください!
  • Falcon -大きなプロジェクトに取り組んでいる、素晴らしい; ChaiScriptのような「1つの組み込み」ではありませんが、非常に柔軟性があり、C++(ライブラリ内のC++コードのみ)で使用されると完全に考えられているためです。スクリプトの柔軟性(Ruby/pythonに匹敵)
  • AngelScript -まだ試していない
  • GameMonkey -まだ試していない
  • Io -まだ試していません

あなたのために、あなたが本当にC++でスクリプトモジュールを書き、それをスクリプト言語に簡単に公開したいなら、私はFalconを使うことを勧めます。それは完全にC++で作られており、すべてのモジュール/ライブラリはそのように書かれています。

32
Klaim

Luaを試してください: http://www.lua.org/

LuaでC++クラスを使用するには、次を使用できます。

バインディングを生成するにはtolua ++を使用します。 http://www.codenix.com/~tolua/

入力としてクリーンアップされたヘッダーを受け取り、ハードワークを行うcファイルを出力します。簡単で、素敵で、一緒に仕事をする喜び。

C++でLuaオブジェクトを使用するには、(field、setField、callMethod、methods、fields)などのメソッドを使用して汎用プロキシオブジェクトを記述するアプローチをとります。

Dllが必要な場合は、リソースとして.luaを使用し(Windowsの場合、Linuxに適したものは何なのかわかりません)、DllMainでluaコードでプロキシオブジェクトを初期化します。

C++コードは、プロキシオブジェクトを使用してluaコードを呼び出すことができます。このタスクを簡単にするために、プロキシにいくつかのイントロスペクションメソッドを含めることができます。

作成するすべてのluaライブラリでプロキシオブジェクトを再利用し、提供されたluaコードを変更するだけで済みます。

21
Vitor Py

このコンテキストで通常尋ねられる質問は、スクリプトからインスタンス化できるようにC++クラスを公開する方法です。そして、答えはしばしば http://www.swig.org/ のようなものです

あなたは反対の質問をしているとあなたは問題を少し複雑にしているように聞こえます。 .hファイルと.soファイルを生成するスクリプトエンジンは、実際にはスクリプトエンジンではなく、コンパイラーです。その場合、C++を使用できます。

スクリプトエンジンはそのようには機能しません。スクリプトと、スクリプトから呼び出すことができる一連の関数を提供するいくつかのコールバックを渡すと、エンジンがスクリプトを解釈します。

21

これは私の専門分野のわずかに外れていますが、私はダウンボートのリスクを冒すつもりです。 :-)

Boost :: Python はあなたが探しているもののようです。少しマクロマジックを使用して処理を行いますが、PythonクラスをC++にかなりきれいに公開します。

13
Dragontamer5788

Io言語用のC++バインディングライブラリであるLikeMagicの著者です。 (私はイオの著者ではありません。)

http://github.com/dennisferron/LikeMagic

LikeMagicでの私の明確な目標の1つは、双方向での完全かつ完全なC++相互運用性です。 LikeMagicは、ネイティブIoタイプをC++タイプとしてマーシャルし(STLコンテナーとIoのネイティブリストタイプ間の変換を含む)、Io内のC++クラス、メソッド、フィールド、および配列を表します。 Io環境のIoコードのブロックoutを渡し、C++でファンクターとして使用することもできます!!

Ioスクリプトで使用するためにC++型をラップするのは簡単、迅速、簡単です。 C++からスクリプトオブジェクトにアクセスするには、説明したような「評価」関数が必要ですが、テンプレートベースの型変換とマーシャリングにより、スクリプト文字列の実行結果に簡単にアクセスできます。また、Io block()オブジェクトをC++ファンクタに変える前述の機能があります。

現在、プロジェクトはまだ初期段階ですが、完全に運用されています。ビルド手順と依存関係を文書化するなどの作業が必要です。MSVCでまだサポートされていないC++ 0x機能を使用しているため、gcc 4.4.1+(Microsoft Visual C++ではない)でのみビルドできます。ただし、LinuxとWindowsを完全にサポートしており、Macへの移植が計画されています。

悪いニュース:C++から呼び出し可能な.hファイルと.soまたは.dllファイルをスクリプトで生成するには、コンパイラ(ある種)が必要になるだけでなく、 JITコンパイラーになります。 (多くのスクリプト言語、特にIoでは)オブジェクトのメソッドとフィールドは実行時までわからないためです-そして、Ioでは、メソッドをライブオブジェクトに追加したり削除したりすることさえできます!最初に、あなたがこれを求めているという事実そのものが、おそらく動的言語isを本当に理解していないのではないかと思うようになります。しかし、私はあなたが最初に何かをするのに理想的または最も簡単な方法を想像しようとするデザインの方法を信じて、それから実際に可能であるものにそこから逆方向に働きます。そして、使いやすさの観点から、あなたが説明するものは使いやすいと認めます。

しかし、それは理想的であり、JITコンパイルでスクリプト言語を使用することはほとんど不可能ですが、あまり実用的ではないため、あなたが求めているものが本当に欲しいものかどうかはまだわかりません。 .hおよび.so/.dllファイルがスクリプトからJITされ、スクリプトが変更された場合、C++プログラムを再コンパイルして変更を利用する必要があります!それはそもそもスクリプトを使用する主な利点に違反していませんか?

実用的である唯一の方法は、スクリプトを定義したインターフェイスが変更されず、スクリプト関数のC++ラッパーを作成している場合のみです。次のような多くのC++関数を持つことになります。

int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }

ラッパー関数の呼び出し元の観点から見ると、コードがきれいに見えます。しかし、それが必要な場合は、スクリプト言語でリフレクションを使用して、スクリプトオブジェクトに格納されているメソッドリストから.hファイルを生成してみませんか?この種の反射は Ioで簡単に実行できます です。ある時点で OpenC++ソースからソースへのトランスレーター をLikeMagicの呼び出し可能ライブラリとして統合する予定です。つまり、文字列を書き出す代わりに堅牢なC++コードジェネレーターを使用することもできます。

5
Dennis

Luaでこれを行うことができますが、多くのクラスがある場合は、SWIGやtoLua ++などのツールを使用してグルーコードの一部を生成する必要があります。

これらのツールはいずれも、スクリプト言語が隠されている.hファイルを持ち、それがスクリプトであることを知らずにC++コードからスクリプトを呼び出すという問題の異常な部分を処理しません。これを実現するには、次のことを行う必要があります。

  • グルーコードを自分で書いてください。 (Luaの場合、クラスに入るまでこれは比較的簡単ですが、それほど簡単ではないため、SWIGやtoLua ++などのツールが存在します。)

  • インターフェイスの背後に、スクリプトインタープリターのグローバルな状態を隠します。

  • それぞれがスクリプトを使用して実装される複数の.hファイルがある場合、どのファイルが状態を共有するかを決定する必要がありますスクリプト言語およびどのファイルが別々のスクリプト状態を使用するか。 (基本的には、スクリプト言語のVMで、極端なのは(a)すべての.hファイルで同じVMとb)各.hファイルには、独自の独立したVMがあります。他の選択肢はより複雑です。)

自分でこれを行うことにした場合、LuaテーブルをC++クラスに変換するためのグルーコードを記述する(プログラムの残りの部分から見てLuaコードがC++のようになる)のは簡単です。 LuaでC++をラップする(C++オブジェクトがLua値のようなスクリプトに見えるようにする)別の方向に進むことは、ロバにとって大きな苦痛です。

あなたが何をするにしても、あなたはあなたの前にいくつかの仕事を持っています。

2
Norman Ramsey

Googleの V8エンジン はC++で記述されています。プロジェクトに統合できるかもしれません。彼らはそれを行うことについて話します この記事では

1
T.J. Crowder

良い質問です。私はこれについて自分でよく考えましたが、残念ながら、この種のことに対する簡単な解決策はありません。 Windowsを使用している場合(そうではないと思います)、C++およびVB(スクリプト言語として考えてください)でCOMコンポーネントを作成することにより、このようなことを実現できます。 、これは異なる言語間で相互運用するための良い方法です。同じことは、相互に相互運用できる.NETベースの言語にも当てはまります。

私も、C++、できればオープンソースにこのようなものが存在するかどうかを知りたいと思っています。

1
tathagata

Guile (スキームインタープリター)または V8 (Googleのjavascriptインタープリター-Chromeで使用-C++で記述されています) )。

0
Ben Collins

Ringプログラミング言語をお試しください http://ring-lang.net

(1)C/C++言語を使用した拡張機能 https://en.wikibooks.org/wiki/Ring/Lessons/Extension_using_the_C/C%2B%2B_languages

(2)C/C++プログラムへのリングインタープリターの埋め込み https://en.wikibooks.org/wiki/Ring/Lessons/Embedding_Ring_Interpreter_in_C/C%2B%2B_Programs

(3)C/C++ライブラリをラップするためのコードジェネレーター https://en.wikibooks.org/wiki/Ring/Lessons/Code_Generator_for_wrapping_C/C%2B%2B_Libraries

0
msfclipper