Embedding di script estremamente semplici nell'applicazione

1

Ho bisogno di programmare un'applicazione C ++ che funzionerà fondamentalmente come interprete di script, ma con script estremamente semplici e limitati.

Gli script avranno un formato come questo:

processedA = doProcessA(source)
processedB = doProcessB(source)
destination = mix(processedA, processedB)

Questo indica che nella mia applicazione C ++ ciò dovrebbe accadere (pseudocodice):

while(source)
{
  processedA = doProcessA(*source);
  processedB = doProcessB(*source);
  *destination = mix(processedA, processedB);
  source++;
  destination++;
}

Non sono sicuro di quale sia la mia opzione per interpretare la mia lingua. L'analisi dovrebbe essere semplice. Dovrei costruire un interprete per la mia lingua, usare llvm in qualche modo per compilare il flusso (non so come), usare un linguaggio di scripting con i collegamenti c ++ o qualcos'altro interamente?

Ho anche bisogno che questo sia ragionevolmente veloce (non c'è un limite ma più veloce è, meglio è).

    
posta m fran 20.02.2015 - 08:58
fonte

2 risposte

6

Ci sono molti interpreti facilmente integrabili, in particolare GNU guile (e altre varianti dello Schema, ad esempio libscheme ), Lua , Tcl e persino Python, OCaml , Perl (ad es. Con pappagallo ), NekoVM .. .

Si noti che se il proprio software diventa abbastanza popolare e se i suoi utenti (avanzati) sono autorizzati a copiarlo (cioè se la capacità di scripting è documentata, accessibile o configurabile), ci sono possibilità che alcuni utenti remoti usino molto ( e persino abusare) delle strutture di scripting.

Quindi le premesse implicite nella tua domanda ("script estremamente basilari") finiranno per diventare false. Ad un certo punto gli script non saranno più di base!

Questo è il motivo per cui un linguaggio di scripting deve essere un linguaggio di programmazione abbastanza buono (con un aspetto familiare). Un qualche strano utente alla fine codificherà molte migliaia di righe. (a proposito, questo problema sociale è probabilmente quello che Ousterhout, il famoso autore di Tcl, sottovalutato: inizialmente aveva progettato il primo Tcl per i piccoli script, ma alla fine alcune persone hanno scritto enormi script Tcl, e quindi Tcl è diventato un peso, perché manca di proposito alcune funzionalità che i linguaggi di programmazione reali dovrebbero avere ... strutture dati efficienti, modularità, ecc. Da allora, Tcl è migliorato significativamente.)

Se per qualche motivo non puoi (o non vuoi) incorporare un interprete esistente nel tuo prodotto e hai deciso di scrivere il tuo interprete di scripting (che significa molti mesi di lavoro!), studia diversi linguaggi di programmazione e scripting prima di progettare i propri (e documentare le lingue che ti hanno ispirato). Prenditi cura di avere una buona rappresentazione interna (s) della sceneggiatura interpretata (almeno alcuni AST , e preferibilmente alcuni bytecode ). Leggi in particolare il libro di Scott: linguaggio di programmazione pragmatico e Il libro di Queinnec: Lisp in Small Pieces e studia diversi Domain Languages Languages ; leggi la raccolta dei rifiuti e forse checkpoint delle applicazioni & persistenza .

Puoi prendere in considerazione l'utilizzo delle tecniche compilazione JIT (ad es. con llvm , libjit , libgccjit , luajit ...) e potresti anche considerare di generare C (o C ++) codice al volo e compilarlo e dlopen -ing come plugin (come ho fatto in MELT ) . Le macchine attuali sono abbastanza veloci da renderle compatibili con un'interazione REPL .

Tieni presente che incorporare qualche interprete nella tua applicazione ha un impatto architettonico enorme e probabilmente dovrebbe modificare o influire profondamente sul design della tua applicazione e su come verrebbe utilizzata da utenti esperti.

Ricorda che un linguaggio di scripting è quasi sempre Turing-complete (a meno che tu non presti particolare attenzione nel suo design per evitare che ). Non dimenticare mai il problema di interruzione .

Nel mondo dell'elaborazione audio, leggi Faustine (di Karim Barkati, Haisheng Wang e Pierre Jouvelot) e < a href="http://faust.grame.fr/"> Faust (di Grame in Francia).

    
risposta data 20.02.2015 - 09:36
fonte
3

Usa uno esistente - = non preoccuparti di reinventare la ruota quando ci sono migliori ruote disponibili, che sono più economiche da usare.

Lua sembra essere l'interprete di script incorporato C / C ++ più comune. Esistono anche tutorial su YouTube per incorporarlo nei tuoi programmi C ++ o codeproject .

    
risposta data 20.02.2015 - 09:40
fonte