2009-07-21 17 views
14

Ho un'applicazione C e voglio includere un linguaggio di scripting per inserire determinate funzionalità negli script. Non ho esperienza con questo e non so esattamente da dove cominciare (sto ancora imparando C e sto cercando di capire l'applicazione).Come implementare un linguaggio di scripting in un'applicazione C?

In che modo l'incorporamento e la comunicazione tra la mia app e gli script funzionano effettivamente? Penso di aver bisogno dell'interprete per il linguaggio di scripting come libreria (.dll su Windows o C Source Code che può essere compilato nella mia applicazione)? E poi posso fare qualcosa come

interpreter->run("myscript", some_object); 

Come lo script dovrebbe conoscere le proprietà dell'oggetto? Dite che il mio script vuole leggere o modificare some_object-> some_field?

Esistono linguaggi di scripting ottimizzati per questo tipo di incorporamento? So che c'è Lua che è popolare in game dev, e linguaggi come Python, Perl, PHP o Ruby che sembrano essere più mirati come applicazioni stand-alone, ma le mie conoscenze nell'architettura profonda non permettono ipotesi più colte :) (Ho taggato Lua e Python perché sarebbero i miei preferiti, ma fintanto che gira su x86 Windows, Linux e Mac OS X, sono aperto ad altri linguaggi di scripting purché siano facili da implementare in un'applicazione C)

+0

Basta essere curiosi: Può dirci qualcosa sulla tua motivazione? Incorporate un'altra lingua per la diversa (migliore, più facile, ...) sintassi (dal momento che ci sono interpreti incorporabili che usano esattamente C come loro lingua)? O si tratta di avere un'interfaccia programmabile per l'applicazione senza la necessità di ricompilare? O è per la personalizzazione degli utenti finali ...? – ThomasH

+0

È una logica di gioco, principalmente dialoghi e ricerche per un gioco di ruolo che sto pianificando. –

risposta

7

Ecco il documento dal sito web di Python per l'incorporamento Python 2.6 ...

http://docs.python.org/extending/embedding.html

+3

Ho trovato l'integrazione con Python per essere veramente semplice da usare, FWIW. Sono stato in grado di costruire qualcosa di utile e funzionante (compresa la chiamata di routine personalizzate nel mio codice C) in mezza giornata. – Joe

+3

La mia esperienza nell'incorporare i linguaggi di scripting in C include solo Perl, Python, Lua e Tcl. In termini di curva di apprendimento (tempo da zero ad avere un programma funzionante), darei Lua a 1, Tcl a 2, Python a 5 e Perl a 359.000. Ma poi, ho lavorato con Lua e Tcl dopo aver lavorato con Python, mentre ho imparato Python incorporamento conoscendo solo Perl, quindi la mia esperienza possa aver fatto dei due Lua e Tcl sembrano più facili di quanto non siano. Ma sono d'accordo con Joe: ci vuole circa mezza giornata per capirlo con Python e circa 20 minuti per capire con Lua. Lua è molto facile da incorporare. –

+3

Accetto questo soprattutto "Usa Lua!" risponde perché posso uccidere due piccioni con una fava (volevo comunque imparare Python) e perché funziona. Caro lettore anonimo che è giunto a questa domanda di Google: Leggi anche tutte le altre risposte, sono tutte eccellenti. –

17

Lua. Ha un ingombro molto ridotto, è piuttosto veloce, e ho trovato (soggettivamente) di avere l'API più piacevole per interagire con C.

Se si desidera toccare gli oggetti Lua da C - è abbastanza facile utilizzare il costruito -in API. Se si desidera toccare dati C da Lua - è un po 'più di lavoro, in genere è necessario creare metodi wrapper per esporre ciò che si desidera consentire a Lua di modificare.

La piccola base di codice e il controllo stretto sulla quantità di librerie predefinite introdotte nell'interprete incorporato significa anche che è possibile formulare ipotesi ragionevoli sulla sicurezza.

L'unica parte dispari è la numerazione di array basata su 1, tuttavia, non era un grosso problema rispetto a quello che pensavo, data l'esistenza degli iteratori.

Come integrare con C: il tarball di distribuzione per Lua ha una directory "ecc" con alcuni esempi molto utili che dovrebbero iniziare rapidamente. Specificamente - etc/min.c mostra come avviare un interprete, farlo interpretare il file e farlo chiamare la funzione C ('stampa' in quel caso). Da lì in poi puoi andare leggendo la documentazione di Lua e la fonte delle librerie standard incluse nella distribuzione.

+1

Ho usato Lua per questo, ed è estremamente buono. È progettato per l'incorporamento in altri sistemi. Concordo con gli array basati su 1, ovviamente; ogni lingua ha i suoi piccoli frammenti di braindamage, e questo è uno di Lua, ma è copable. –

3

Lua è progettato esattamente per questo scopo e abbastanza facile da utilizzare.

Un'altra cosa che vale la pena guardare è QtScript, che è basata su Javascript, anche se ciò comporterebbe del lavoro per "qt-ify" la tua app.

1

maggior linguaggio di scripting permette l'incorporamento in C e di solito consentono di esporre certi oggetti o anche funzioni dal codice C a lo script in modo che possa manipolare gli oggetti e chiamare le funzioni.

Come detto Lua è stato progettato per questo scopo incorporamento, usando l'interprete è possibile esporre gli oggetti allo script e call funzioni lua da C, cercare incorporamento lua in C e si dovrebbe trovare un sacco di informazioni, anche don Mi manca la sezione del manuale lua "The Application Programming Interface"

Sebbene Python sia più adatto all'uso autonomo, può anche essere incorporato, può essere utile nel caso in cui gli script utilizzino le librerie di grandi quantità fornite con Python.

3

Si consiglia inoltre di dare un'occhiata a SWIG, il wrapper semplificato e generatore di interfaccia. Come si potrebbe immaginare, genera gran parte del codice della piastra della caldaia per interfacciare il codice C/C++ al motore di scripting (che può essere piuttosto complicato da eseguire manualmente).

Supporta Python e Lua (le preferenze) e molte altre lingue. È abbastanza facile generare un modulo che estenda il linguaggio di scripting. L'estensione dell'incorporazione e, che è ciò che desideri, richiede un po 'più di impegno.

2

Si potrebbe dare un'occhiata a Game Scripting Mastery. Dato che mi interessa l'aspetto di alto livello dei giochi per computer, questo libro mi è stato consigliato molto spesso.

Purtroppo il libro sembra essere fuori stampa (almeno in Europa).

8

Lua è totalmente ottimizzato per questo tipo di incasso. Un buon punto di partenza è il libro di Roberto Ierusalimschy Programmazione in Lua; è possibile ottenere il previous edition free online.

In che modo il tuo script conosce le proprietà del tuo oggetto C?

Immaginate per un momento il vostro oggetto è definito in questo modo:

typedef struct my_object *Object; 
Object some_object; 

Cosa significa il codice C conoscono le proprietà di tale oggetto? Quasi niente, ecco cosa. Tutto quello che puoi fare è

  • Passare i puntatori a un oggetto, inserirli in strutture di dati, ecc.funzioni

  • chiamata che in realtà sanno cosa c'è dentro un struct my_object.

Lua ottiene l'accesso agli oggetti C esattamente nello stesso modo: indirettamente tramite le funzioni di:

  • Si effettua chiamate API di mettere un puntatoreall'oggetto sullo stack di Lua, da cui può entrare nelle strutture dati, nelle variabili o in qualsiasi altra parte dell'universo Lua.

  • di definire funzioni che conoscono interni dell'oggetto, e di esportare le funzioni di Lua.

  • C'è un sacco di roba in "libreria ausiliario" per aiutarvi. Non trascurarlo!

Tutto questo è spiegato con chiarezza cristallina nella terza parte del libro di Roberto, che include esempi. Un punto fine è

  • È possibile scegliere se allocare la memoria da soli ("light userdata") o se Lua assegna la memoria. E 'generalmente meglio avere Lua allocare la memoria, perché può quindi liberare automaticamente l'oggetto quando non è necessario, e si può anche associato un Lua metatabella, che consente (tra gli altri trucchi) per consentire l'oggetto di partecipare a norma Le operazioni Lua sono come cercare i campi, non solo le chiamate di funzione.

Nota finale: anche se è possibile utilizzare SWIG o toLua o altri strumenti per provare a generare codice per connettere C e Lua, ti invito a scrivere il codice te stesso, a mano. In realtà è abbastanza facile da fare, ed è l'unico modo per capire cosa sta realmente accadendo.

Problemi correlati