2013-04-05 4 views
8

C++で文字列変数からC++コードを実行することは可能です。 JavaScriptで 同様:文字列変数からC++を実行

var theInstructions = "alert('Hello World'); var x = 100"; 

var F=new Function (theInstructions); 

return(F()); 

私はC++でのJavaScriptのような非常によく似た何かをしたいです。どうやってするか ?

+0

ありません。そうではありません。そのようなことをリモートで可能にするためにも、C++コンパイラの複雑なコンプレックスをアプリに埋め込む必要があります。 –

+3

埋め込みスクリプト言語を使用する場合は、Luaを考慮してください。 –

+0

@jrok:もちろんです。私は実際に過去のこのようなことをしました(古いレイトレーサのソフトウェアシェーダの実装のために)。唯一の "魔法"はコンパイラを呼び出すことです。 –

答えて

7

コードをコンパイルするには、コンパイラを起動する必要があります。さらに、文字列を関数宣言にラップするコードを生成する必要があります。最後に、コンパイルされたコードをロードする必要があります。

私は(私はないなる)私は考え、これをやっていた場合は、次のコード

  • 周り

    1. 連結し、標準的なラッパー関数ヘッダーが構築するために、コマンドライン(system())を経由して、コンパイラを起動します共有 ライブラリ(Linux上でWindows上.dllまたは.so
    2. 共有ライブラリをロードし、
    3. Invokを機能をマップ関数

    これは実際にはほとんどの場合Cコードを書いている方法ではありません。

  • +0

    これは計画のように聞こえ、私は興味があります。あなたはWindowsの簡単な例がありますか? – Jigberto

    +3

    @ジベルト:あなたは明らかに答えの根底にある意味を理解していないようです。これはC++のものではないので、これについて簡単なことは何もありません。そして、あなたが簡単な例を求めているなら、この "計画"に "興味を持ってはいけません"。 – DevSolar

    +0

    @DevSolaまあ、答えは私のニーズに合っていたので、もっとリアルになることを嬉しく思います。私はC++がそのようには設計されていないことを知っていますが、私たちは物事に限定されず、常に回避策を見つけることができます。私は答えが好きで、Luchian Grigoreさんが投稿したものです – Jigberto

    5

    直接、しかし、あなたはできる:

    • その文字列をファイルに書き込む。
    • コンパイラを起動し、そのファイルをコンパイルします。
    • 結果のバイナリを実行します。
    3

    C++は、コンパイルされたである。 C++ソースをマシンコード、実行可能ファイルにコンパイルします。それはロードされ、実行されます。コンパイラはC++を知っています(そして、すべてのライブラリヘッダが利用可能です)。実行ファイルは実行されません。そのため、実行可能コードに文字列を変換することができません。それはマシンコード命令を含むように起こる場合は、確かに、は、文字列の内容を実行することができますが、それは一般的に非常に悪い考えです...

    ことが可能ではないことを意味するものではありませんこの種の実行時コンパイルを実行します。 C++ではほとんど不可能です(実際には何か)。しかし、あなたがやっていることは、C++コンパイラオブジェクトを実装することです...実際にこれを望むかどうかを決める前に、他のコンパイラプロジェクトを見てください。

    翻訳されたの言語では、これを簡単に実行できます。プログラムを実行しているインタプリタに文字列を渡すだけで済みます。彼らは他の点でこのような柔軟性を払っています。

    0

    短い答えはノーです。ハッカーたちはフィールドの日を過ごすだろう。ただし、Windows IActiveScriptSiteインターフェイスを使用してJava/VBスクリプトを利用することはできます。 Google IActiveScriptSiteには、ウェブ上に多数の例があります。あるいは、私が現在やっていることを自分のスクリプトエンジンで行うことができます。

    8

    いいえ、C++は、静的型付けされたネイティブバイナリ言語にコンパイルされています。

    LLVM JITコンパイルを使用することはできますが、ランタイムを中断することなくコンパイルおよびリンクできます。実行可能であるべきですが、C++のドメインにはありません。

    C++でスクリプトエンジンを使用する場合は、JSなどを使用できます。これは、これまでのところ最も高速な動的ソリューションです。 Lua、Python、Rubyも問題ありませんが、通常は遅くなります。これは、スクリプト作成に使用していると考えるとひどいことではありません。

    例えば、Qtの中であなたが何かを行うことができます。

    int main(int argc, char *argv[]) 
    { 
        QCoreApplication a(argc, argv); 
    
        QScriptEngine engine; 
        QScriptValue value = engine.evaluate("var a = 20; var b = 30; a + b"); 
    
        cout << value.toNumber(); 
    
        return a.exec(); 
    } 
    

    をそして、あなたは50を得るでしょうが。)

    +0

    あなたはLuaJITを忘れてしまいました.LuaJITは、既に存在しなければ近いですが、最も早いのは –

    +0

    @ W.Bです。はいLuaJITはかなり速く見えます。他の言語と比べると頭が良いことを望みましたが、サイトのベンチマークはLuaと比較するだけです。 – dtech

    関連する問題