2010-06-30 19 views
36

sto diventando un po 'arrugginito in linguaggi di scripting, a condizione che stanno spuntando come funghi ultimamente :)linguaggio di scripting per C++

Oggi ho pensato che sarebbe stato bello avere un linguaggio di scripting che parla senza soluzione di continuità per C++ , cioè, potrebbe usare le classi C++ e, il più importante per me, potrebbe essere compilato in C++ o qualche DLL/.SO (più il suo .h) in modo che potessi collegarlo al mio programma C++ e usare le classi lo script definisce o implementa.

So che potrei incorporare qualsiasi linguaggio di scripting popolare come lua, ruby, python ... ma l'interfaccia di solito include una sorta di funzione di "eval" che valuta il codice di script fornito. A seconda dello strumento utilizzato per accoppiare C++ e il linguaggio di scripting, l'integrazione per i callback dello script in C++ potrebbe essere più o meno facile da scrivere, ma non ho visto alcun linguaggio di scripting che mi permetta di scrivere moduli indipendenti che sono esposto come .h e .so/dll al mio programma (forse sulla falsariga di un linguaggio di scripting che genera codice C++).

Conosci uno di questi strumenti/linguaggio di scripting?

Grazie in anticipo.

PD. Ho pensato sulla falsariga di Vala o di GHC di Haskell. Generano C, ma non C++ ...

+4

Il q l'aspetto sembra non essere fuori tema per me. – sergiol

+0

Ci dispiace, ma perché dovresti usare un linguaggio di scripting? Cos'altro fornisce oltre all'input dell'utente? – kim366

+0

@DiegoSevilla è nato un altro linguaggio di programmazione. Si chiama ZetScript Non so se sei ancora alla ricerca di un motore di script, ma guarda se è adatto alle tue esigenze! http://zetscript.org –

risposta

0

È possibile verificare l'incorporamento di Guile (un interprete di schema) o V8 (interprete javascript di Google, utilizzato in Chrome, che è scritto in C++).

+0

Anche in questo caso, non in attesa di essere incorporato. Usare V8 o Guile mi costringe a scrivere wrapper ad-hoc per C++. Voglio che il linguaggio di scripting sia in grado di generare il .h e così via. –

+0

Colpa mia per non aver letto attentamente la tua domanda. Non conosco nessuno strumento linguistico che faccia prontamente quello che vuoi. –

1

Google V8 engine è scritto in C++, mi aspetto che potresti essere in grado di integrarlo in un progetto. Parlano di farlo in this article.

+0

Oh, no, non embeeding, ma che il linguaggio di scripting sia in grado di generare moduli .so standalone (e i corrispondenti file .h da usare da C++) –

+0

@Diego: Beh, mi aspetto che tu possa concludere alcuni JavaScript codice * e * interprete V8 in un '.so' :-) ma dubito che sia ciò che intendi. Quindi, qualcosa che compila JavaScript per scrivere codice (piuttosto che permettere a JavaScript di dialogare senza problemi con C++) e elimina il garbage collector (probabilmente usando il conteggio dei riferimenti) e altri aspetti dell'interprete. È un compito arduo. V8 compila JavaScript direttamente sul codice macchina, ma al volo e in modo dinamico (perché JavaScript è un linguaggio dinamico). Mai sentito parlare di uno per C++. [OT: ce n'è uno per Java (Rhino).] –

13

Questo è leggermente al di fuori della mia area di competenza, ma sono disposto a rischiare i downvotes. :-)

Boost::Python sembra essere quello che stai cercando. Usa un po 'di magia magica per fare le sue cose, ma espone le classi Python al C++ in modo piuttosto pulito.

+0

La mia esperienza con Boost: Python era infelice. Anche il codice sembrava marcire sulla vite. SWIG è stata un'esperienza molto migliore. –

21

La domanda di solito posta in questo contesto è la seguente: come esporre le mie classi C++ in modo che possano essere istanziate dallo script? E la risposta è spesso qualcosa come http://www.swig.org/

Stai facendo la domanda opposta e sembra che tu stia complicando un po 'le cose. Un motore di scripting che produceva file .h e file .so non sarebbe realmente un motore di scripting - sarebbe un compilatore! In tal caso potresti usare C++.

I motori di scripting non funzionano così. Passi loro uno script e alcuni callback che forniscono un insieme di funzioni che possono essere chiamate dallo script e il motore interpreta lo script.

+0

Daniel, sì, i motori di scripting possono eseguire l'esecuzione dinamica, ma potrebbero non farlo. Forse quello che sto cercando, come ho affermato, è un linguaggio di scripting invece di un motore di scripting. Sulla falsariga del Vala di GNOME, più un aiuto per scrivere codice veloce che viene convertito in C++ (C nel caso di Vala), o come ghc, che in realtà genera codice C prendendo in considerazione la garbage collection, ecc. Sarebbe gentile di un DSL per C++ che ha anche una serie di librerie run-time che possono essere utilizzate. Forse la google go language è la risposta (curiosamente non menzionata da nessuno) ... –

+0

Forse perché Go, come Lua e altri linguaggi, si interfaccia con C ma non direttamente con C++ ... source: http://golang.org/ doc/go_faq.html # Do_Go_programs_link_with_Cpp_programs – Klaim

+0

Grazie non sapevo di Swig a tutti ... –

1

Buona domanda, ci ho pensato spesso, ma purtroppo non c'è una soluzione facile a questo genere di cose. Se si è su Windows (credo di no), è possibile ottenere qualcosa di simile creando componenti COM in C++ e VB (considerando questo come linguaggio di scripting). Il parlare avviene attraverso le interfacce COM, che è un buon modo per intervenire tra lingue disparate. Stesse vincite per i linguaggi basati su .NET che possono interagire tra loro.

Anche io sono desideroso di sapere se esiste qualcosa del genere per C++, preferibilmente open source.

+0

"che è un bel modo di intervenire ...": Devo assolutamente non essere d'accordo. COM (specialmente se usato per interfacciare VB e C++) è particolarmente difficile da usare ... –

+0

Ok, sì, l'interoperabilità COM ha parecchie stranezze :), se usato tra C++ e VB, e forse di più quando tra .NET e COM; ne hai pienamente compreso e memorizzato molto, non qualcosa di particolarmente ben progettato. Io stesso non sono un fan di COM e difficilmente lo consiglio. – tathagata

21

Prova Lua: http://www.lua.org/

Per utilizzare classi C++ in lua è possibile utilizzare:

Per generare l'uso tolua vincolante ++: http://www.codenix.com/~tolua/

Ci vuole un colpo di testa ripulito come file di input e output AC che fa il duro lavoro. Facile, piacevole e piacevole da lavorare.

Per l'utilizzo di oggetti Lua in C++, l'approccio di scrittura di un oggetto Proxy generico con metodi come (campo, setField, callMethod, metodi, campi).

Se si desidera una DLL, è possibile avere .lua come risorsa (in Windows, non so quale possa essere un equivalente adatto per Linux) e sul proprio DllMain inizializzare l'oggetto proxy con il codice lua.

Il codice C++ può quindi utilizzare l'oggetto proxy per chiamare il codice lua, con forse alcuni metodi di introspezione nel proxy per semplificare questa operazione.

Si potrebbe semplicemente riutilizzare l'oggetto proxy per ogni libreria lua che si desidera scrivere, semplicemente cambiando il codice lua fornito.

+0

Il collegamento è morto ....... –

+0

@RanWang Questa è una risposta di 7 anni. È passato un po 'di tempo da quando ho usato tolua ++. Googling per 'tolua ++' mostra alcuni repository GitHub - qualcuno di loro funziona per te? –

+0

Trovato ~ Grazie mille –

2

Puoi farlo con Lua, ma se hai molte classi vorrai uno strumento come SWIG o toLua ++ per generare parte del codice di colla per te.

Nessuno di questi strumenti gestirà la parte insolita del problema, ovvero il file .h dietro cui è nascosto un linguaggio di scripting e di avere gli script di chiamata di codice C++ senza sapere che si tratta di script. Per fare ciò, dovrai fare quanto segue:

  • Scrivere il codice della colla da soli. (Per Lua, questo è relativamente facile, finché non entri in classe, dopodiché non è così facile, ecco perché esistono strumenti come SWIG e toLua ++.)

  • Nascondere dietro l'interfaccia una sorta di stato globale dell'interprete di scripting .

  • si Supponendo che dispone di più file .h che ogni vengono implementati utilizzando script, si deve decidere quali Stato Capitale nel linguaggio di scripting e quali utilizzare gli stati di scripting separati. (Quello che in pratica è una VM per il linguaggio di scripting, e gli estremi sono (a) tutti i file .h usano la stessa VM in comune e (b) ogni file .h ha una propria VM isolata, altre scelte sono più complicato.)

Se si decide di farlo da soli, scrivendo il codice colla per trasformare le tabelle Lua in classi C++ (in modo che il codice Lua assomiglia a C++ per il resto del programma) è abbastanza semplice. Andando nella direzione opposta, dove si avvolge il C++ in Lua (in modo che gli oggetti C++ guardino agli script come i valori Lua) è un grande rompicoglioni.

Non importa quello che fai, hai un po 'di lavoro davanti a te.

28

Le successive sono più C integrazione ++ orientata di binding di linguaggio:

  • ChaiScript - provando in questo momento in un piccolo progetto, interessante, questo è fatto con il C++ in mente e opere di appena compreso un colpo di testa !Non so se è buono per un grande progetto, ma vedrà, provalo per avere un assaggio!
  • Falcon - prova su un grande progetto, eccellente; non è un "include embed" come ChaiScript ma è perché è molto flessibile e totalmente pensato per essere usato in C++ (solo codice C++ in libs) - Ho deciso di seguirlo per il mio progetto più grande che richiede molto flessibilità di scripting (paragonabile a ruby ​​/ Python)
  • AngelScript - non ha cercato ancora
  • GameMonkey - non ho provato ancora
  • Io - non ho provato ancora

per voi, se voglio davvero scrivere il tuo modulo di scripting in C++ e facilmente esporlo al linguaggio di scripting, I would r ecommand che va con Falcon. È totalmente MADE in C++, tutti i moduli/librerie sono scritti in questo modo.

+0

Grazie, Klaim. Questo è il tipo di risposta che stavo cercando. Vado a provare i tuoi consigli e vediamo. –

+0

Nessun problema, ho eseguito molte ricerche (con l'aiuto dei forum) per ottenere questo elenco di linguaggi di scripting interessanti. – Klaim

+1

@DiegoSevilla Ehi, hai provato quelle lingue e ho risposto correttamente alla tua domanda? :) – Klaim

5

Sono l'autore di LikeMagic, una libreria di binding C++ per la lingua Io. (Io non sono l'autore di Io.)

http://github.com/dennisferron/LikeMagic

Uno dei miei obiettivi espliciti con LikeMagic è completa e totale interoperabilità C++, in entrambe le direzioni. LikeMagic eseguirà il marshalling dei tipi Io nativi come tipi C++ (compresa la conversione tra i contenitori STL e il tipo Lista nativo di Io) e rappresenterà classi, metodi, campi e array C++ all'interno di Io. È anche possibile passare un blocco del codice Io fuori dell'ambiente Io e utilizzarlo in C++ come un funtore !!

Il wrapping di tipi C++ per il consumo nello script Io è semplice, rapido e facile. L'accesso agli oggetti script da C++ richiede una funzione di "eval" come quella descritta, ma la conversione e il marshaling di tipo basato su modello facilita l'accesso al risultato dell'esecuzione di una stringa di script. E c'è la già citata capacità di trasformare oggetti Io block() in funtori C++.

In questo momento il progetto è ancora nelle fasi iniziali, sebbene sia pienamente operativo. Ho ancora bisogno di fare cose come documentare i suoi passi di costruzione e le dipendenze, e può essere costruito solo con gcc 4.4.1+ (non Microsoft Visual C++) perché usa le funzionalità C++ 0x non ancora supportate in MSVC. Tuttavia, supporta pienamente Linux e Windows e una porta Mac è pianificata.

Ora la cattiva notizia: Rendere gli script producono file .he .so o file dll richiamabili dal C++ non solo richiede un compilatore (di una specie), ma avrebbe anche essere un compilatore JIT. Questo perché (in molti linguaggi di scripting, ma soprattutto in Io) i metodi ei campi di un oggetto non sono noti fino al runtime - e in Io, i metodi possono anche essere aggiunti e rimossi da oggetti live! All'inizio stavo per dire che il fatto stesso che me lo chiedi mi fa chiedere se forse non capisci veramente che linguaggio dinamico è. Ma io credo in un modo di progettare in cui provi per la prima volta a immaginare il modo ideale o più semplice di fare qualcosa, e poi a ritroso da lì a ciò che è effettivamente possibile. E così ammetto da un punto di vista della facilità d'uso, quello che descrivi è più facile da usare.

Ma mentre è ideale, e appena possibile (utilizzando un linguaggio di script con compilation JIT), non è molto pratico, quindi non sono ancora sicuro se quello che stai chiedendo è quello che vuoi veramente. Se i file .h e .so/.dll sono JITted dallo script e lo script cambia, è necessario ricompilare il programma C++ per sfruttare la modifica! In primo luogo, non viola il vantaggio principale dell'utilizzo di script?

L'unico modo in cui è pratico sarebbe se le interfacce definite gli script non cambiano, e state semplicemente creando wrapper C++ per le funzioni di script. Si finirebbe con l'avere un sacco di funzioni C++ come:

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

Devo ammettere che il codice più pulito guardando dal punto di vista dei chiamanti della funzione wrapper. Ma se è quello che vuoi, perché non usare la reflection nel linguaggio di scripting e generare un file .h fuori dagli elenchi dei metodi memorizzati negli oggetti script? Questo tipo di riflessione può essere easily done in Io. Ad un certo punto ho intenzione di integrare lo OpenC++ source-to-source translator come libreria richiamabile da LikeMagic, il che significa che potresti persino usare un robusto generatore di codice C++ invece di scrivere le stringhe.

0

Prova il linguaggio di programmazione Anello lingue http://ring-lang.net

(1) Estensione utilizzando il C/C++ https://en.wikibooks.org/wiki/Ring/Lessons/Extension_using_the_C/C%2B%2B_languages

(2) Embedding Anello Interprete in C/C++ Programmi https://en.wikibooks.org/wiki/Ring/Lessons/Embedding_Ring_Interpreter_in_C/C%2B%2B_Programs

(3) Generatore di codice per il wrapping di librerie C/C++ https://en.wikibooks.org/wiki/Ring/Lessons/Code_Generator_for_wrapping_C/C%2B%2B_Libraries

Problemi correlati