2013-04-05 16 views
8

in C++ è possibile eseguire il codice C++ dalla variabile stringa. Come in JavaScript:esegue C++ dalla variabile String

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

var F=new Function (theInstructions); 

return(F()); 

voglio qualcosa di molto simile come Javascript in C++. Come farlo ?

+0

no. non è. dovresti incorporare l'intero complesso del compilatore C++ all'interno della tua app affinché tale cosa sia persino lontanamente possibile. –

+3

Se si desidera un linguaggio di scripting incorporato, considerare Lua. –

+0

@jrok: certo che lo è. In realtà ho fatto qualcosa del genere in passato (per una specie di implementazione di software shader per un vecchio ray tracer da me). L'unica "magia" è invocare un compilatore. –

risposta

7

Avrete bisogno di richiamare un compilatore per compilare il codice. Inoltre, sarà necessario generare del codice per avvolgere la stringa in una dichiarazione di funzione. Infine, dovrai in qualche modo caricare il codice compilato.

Se fossi facendo questo (che vorrei Non) lo farei:

  1. Concatenate un colpo di testa funzione wrapper standard di tutto il codice di
  2. richiamare un compilatore dalla riga di comando (system()) per costruire condiviso libreria (.dll su Windows o .so su linux)
  3. caricare la libreria condivisa e mappa la funzione
  4. Invok e la funzione

Questo non è proprio il modo in cui si desidera scrivere il codice C nella maggior parte dei casi.

+0

Questo suona come un piano, e sono interessato. Puoi venire con un semplice esempio di Windows? – Jigberto

+3

@Jigberto: A quanto pare non hai capito il significato sottostante delle risposte qui. Non c'è nulla di semplice in questo, perché questo non è ciò di cui parla C++. E se chiedi un semplice esempio, non dovresti essere "interessato" a questo "piano". – DevSolar

+0

@DevSola bene, la risposta si adatta alle mie esigenze :) quindi sono felice di farlo diventare più reale. So che C++ non è stato progettato in questo modo, ma non siamo limitati nelle cose e possiamo sempre trovare soluzioni alternative. Mi piace la risposta, e quella che è stata pubblicata da Luchian Grigore – Jigberto

5

Direttamente, n. Ma è possibile:

  • scrivere quella stringa in un file.
  • invoca il compilatore e compila quel file.
  • esegue il binario risultante.
3

C++ è un compilato in lingua. Si compila il codice sorgente C++ in codice macchina, l'eseguibile. Questo è caricato ed eseguito. Il compilatore conosce C++ (e ha tutte le intestazioni di libreria disponibili). L'eseguibile no, ed è per questo che non può trasformare una stringa in codice eseguibile. È possibile, infatti, eseguire il contenuto di una stringa se succede a contenere istruzioni in codice macchina, ma che è generalmente una pessima idea ...

Ciò non significa che non sarebbe stato possibile per eseguire questo tipo di compilazione in fase di esecuzione. Molto poco (se, anzi, qualsiasi cosa) è impossibile in C++. Ma quello che faresti sarebbe implementare un oggetto del compilatore C++ ... guarda gli altri progetti del compilatore prima di decidere se vuoi davvero questo.

Le lingue interpretate come possono essere eseguite con facilità, devono semplicemente passare la stringa all'interprete che sta già eseguendo il programma. Pagano questo tipo di flessibilità per altri aspetti.

0

Risposta breve è no. Gli hacker avrebbero avuto una giornata campale. È tuttavia possibile utilizzare l'interfaccia Windows IActiveScriptSite per utilizzare lo script Java/VB. Google IActiveScriptSite, ci sono numerosi esempi sul web. Oppure puoi fare quello che sto facendo, lanciare il tuo motore di script.

8

No, C++ è un tipo statico, compilato in linguaggio binario nativo.

Sebbene sia possibile utilizzare compilazione JIT LLVM, compilare e collegare senza interrompere il runtime. Dovrebbe essere fattibile, ma non è solo nel dominio del C++.

Se si desidera un motore di scripting in C++, è possibile utilizzare ad esempio JS - è di gran lunga la soluzione dinamica più veloce là fuori. Anche Lua, Python, Ruby sono OK, ma in genere più lenti, il che potrebbe non essere una cosa terribile considerando che lo stai usando solo per lo scripting.

Per esempio, in Qt si può fare qualcosa di simile:

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(); 
} 

E otterrete 50;)

+0

Hai dimenticato LuaJIT, che è vicino, se non già presente, ad essere il più veloce –

+0

@ W.B. sì LuaJIT sembra abbastanza veloce. Vorrei che ci fosse un confronto diretto con altre lingue, ma i benchmark sul loro sito comparano solo a Lua. – dtech