2009-08-15 13 views
5

Ho lavorato a un programma in C che esegue molte manipolazioni di stringhe e molto spesso deve essere ottimizzato e ricompilato per una sorta di elaborazione di casi speciali. Ho pensato che l'integrazione di alcuni linguaggi di scripting con un buon supporto per la manipolazione delle stringhe avrebbe avuto un senso per il progetto.Lingua incorporabile con un buon supporto per la manipolazione delle stringhe

Quale linguaggio fornirebbe il miglior supporto per la manipolazione delle stringhe pur essendo facile da incorporare in un programma C?

Per qualche fondo in più ...

  • prestazioni è piuttosto importante (tempo soprattutto di avvio)
  • esigenze facilmente essere compilati su più piattaforme (Linux, Solaris, Win32 (idealmente con MinGW), Darwin)
  • deve essere una lingua che sarà ancora in giro in 5 anni di tempo

ho guardato un po 'alla Python (forse peso troppo pesante?) e Lua (forse non focalizzata sulla strin g manipolazione?) ma non ne sanno abbastanza su di loro o su quali altre scelte potrebbero esserci.

risposta

0

Perl. La sua (originale) ragione di essere è la manipolazione delle stringhe.

+0

Ma non è affatto facile da incorporare in un programma C da quello che ho capito. Conosci diverso? –

+0

Mai provato, personalmente non ho usato C/C++ molto oltre "Hello World". So che almeno uno (C++ penso) progetto opensource che lo incorpori però, se vuoi curiosare e vedere come è fatto. –

+0

Sì, come si chiama? –

3

Le persone hanno incorporato tcl in progetti più grandi per quelli che sembrano età. E 'stato un po' da quando ho dovuto usare TCL per qualsiasi cosa ...

Una delle cose che differenzia TCL distingue da altri linguaggi di programmazione è che tutto è una stringa.

E per il vostro riferimento, ecco lo tcl documentation on string functions.

tcl potrebbe essere più facile da incorporare rispetto a perl, ma devo concordare il ragionamento di @Matthew Scharley. Inoltre, tcl non è esattamente noto per le sue prestazioni, ma forse è cambiato negli ultimi anni.

In ogni caso, here is the tcl wiki link on embedding tcl in C applications, e una citazione rilevante dalla pagina: "Come faccio a incorporare un interprete Tcl nella mia C esistente (o C++) applicazione"

è una domanda molto frequente. È semplice, certamente molto più facile che fare lo stesso con Perl o, in generale, con Python; inoltre, questo tipo di "incorporabilità" era uno degli obiettivi originali di Tcl, e molti, molti progetti lo fanno. Non ci sono discussioni complete sull'argomento disponibili, ma possiamo dare una panoramica qui. (RWT 14-Ott-2002)


Un'altra alternativa potrebbe essere quella di andare con Lua, come lei ha ricordato, mentre si estende con un'altra libreria di stringa C di vostra scelta (Google salta fuori The Better String Library, per esempio) .

Una volta compilato Lua nella domanda, you can "extend" C functions to Lua's interpreter. O forse the built-in string functions sono adeguati per te.

Hai certamente alcune opzioni.

10

Non mi sono mai pentito di usare Lua.

È molto facile da incorporare nella vostra applicazione. Infatti, ora di solito non scrivo applicazioni C, scrivo solo librerie C e le controllo da Lua.

La manipolazione del testo non è la sua caratteristica migliore, ma è sicuramente molto meglio della sola C. E la libreria LPEG rende la creazione di parser quasi banalmente semplice, mettendo a rischio la regex (ma ha ancora un paio di sintassi regex-like se preferite).

+3

Nella nicchia del linguaggio incorporabile, Lua è semplicemente perfetta - piccola, perfetta portabilità (rigoroso C++ - sottoinsieme ANSI C compilabile), sintassi semplice e ordinata, libreria standard minima ma comoda, facilità di estensibilità (oserei dire che batte Python lì), e ottima documentazione. La mia passata esperienza con Lua era stata nient'altro che positiva. Potrebbero non essere disponibili funzionalità di manipolazione delle stringhe, ma è possibile fornire facilmente tutte le funzioni personalizzate che potrebbero essere necessarie a tale scopo (regex, ecc.). –

+2

+1 per scrivere librerie C controllate da Lua. Questo è diventato sempre più comune anche per me. – RBerteig

+0

Non dimenticare che Lua ha vinto parecchi concorsi di benchmark, e cioè prima di introdurre un compilatore JIT per il suo bytecode. E, anche una JIT è disponibile, vedi http://luajit.org/ per i dettagli cruenti. – RBerteig

3

Abbiamo esaminato sia Python che Lua per lo scripting per un prodotto .NET. L'obiettivo era fornire alcune funzionalità di scripting per gli utenti finali. La decisione è caduta su Python perché i potenzi potrebbero preferire qualsiasi supporto con Microsoft a tutto il resto. La mia scelta era per Lua.

1

Alcune persone possono essere in disaccordo, ma Sara Goleman ha pubblicato a great book sull'estensione e l'incorporamento di PHP. Che sta diventando una delle lingue più diffuse in giro ... :)

PHP Il supporto per le stringhe non è eccezionale come dire Perl, ma è molto utile.

Ho detto che è scritto in C? </my2cents >

+0

Quali sono i vantaggi dell'uso di PHP come linguaggio incorporato? Qualsiasi di questi è di solito specifico del dominio, quindi la grande popolarità altrove non è un fattore importante. E PHP ha molti detrattori come linguaggio a sé stante. –

1

Python non è per niente pesante! È piuttosto semplice da incorporare (ecco lo official guide, ma puoi trovare anche molti tutorial), molto potente, ottimo per l'elaborazione delle stringhe e un linguaggio piacevole e facile da usare nel complesso. Ha un'enorme comunità di utenti e una base di supporto, il che è un vantaggio.

Python è anche stato incorporato in un gran numero di applicazioni reali. Un esempio interessante che mi viene in mente è il gioco Civilization IV, la maggior parte dei quali viene eseguito su script Python su un'API C++.

3

C'è una buona carta un'indagine sui meriti relativi delle API incorporamento dei vari linguaggi di scripting:

H. Muhammad and R. Ierusalimschy. C APIs in extension 
and extensible languages. Journal of Universal Computer 
Science, 13(6):839–853, 2007. 

cerca di coniugare entrambi eccellenti manipolazione di stringhe e un eccellente API embed, vorrei suggerire, al fine di:

  • Ruby: supporto di stringa eccellente, incluso il supporto della sintassi per regex. API embed ben progettata, molto facile da usare.
  • Lua: Non sono sicuro di come sia il suo supporto per le stringhe, ma dovrebbe essere un ottimo linguaggio per l'incorporamento.
  • Python: meno facile da incorporare, un po 'più difficile da usare con le stringhe rispetto a Ruby. Ma ha Pyrex, quindi potrebbe essere un modo più semplice per incorporarlo.
  • PHP: API scadente, linguaggio sgradevole. L'embed SAPI è davvero un cittadino di seconda classe, ma funziona. Ci sono molte funzioni di manipolazione delle stringhe. Comunque, non lo raccomanderei.
  • Perl: Nasty da incorporare (per quanto ho sentito), il supporto per le stringhe potrebbe essere migliore.

Non posso commentare TCL, ma sento che è stato progettato per l'incorporamento.

4

Lua spicca la testa sopra le altre scelte.

... il miglior supporto per la manipolazione delle stringhe pur essendo facile da incorporare?

Lua è progettato da incorporare in C; l'API è chiara e facile da usare; la documentazione è eccezionale.

Alcune altre risposte hanno denigrato le capacità di stringa di Lua. Penso che stiano sottovalutando Lua. Le funzionalità di stringa di Lua in realtà trovano un punto debole tra "solo concatenazione" e la completa complessità delle espressioni regolari. La capacità di formattazione delle stringhe è molto forte e accumulare stringhe tramite "buffer" o tabelle è semplice ed efficiente.

La scansione delle stringhe è, a mio parere, una delle parti migliori del progetto. Non ha "o" schemi, ma in caso contrario fornisce una grande parte di ciò che ottieni dalle espressioni regolari, inclusa una funzione di "cattura" molto potente ed elegante. Ad esempio, posso convertire una stringa esadecimale catturando ogni singolo carattere e applicando una funzione ad esso:

s:gsub('.', function(c) return string.format("%02x", string.byte(c)) end) 

O posso scappare non alfanumerici, caratteri non-spaziali in ottale:

s:gsub('[^%w%s]', function(c) return string.format([[\%03o]], string.byte(c)) end) 

Alcune delle caratteristiche esposte qui:

  • Il carattere di escape per la scansione stringa è %, che è diverso dal carattere di escape per la quotatura delle stringhe, che è \. Questa decisione è brillante e dovrebbe vincere un premio di per sé :-)

  • Ci sono diversi meccanismi di citazione stringhe letterali, tra cui [[...]] in cui non caratteri devono essere sfuggito. Se vuoi generare o associare stringhe con barre retroverse (come LaTeX per esempio), questa è una manna dal cielo.

Se si desidera che tutta la potenza di un parser libera dal contesto, si può sempre usare LPEG, una libreria scritta da uno dei designer di Lua.

prestazioni è piuttosto importante (tempo soprattutto di avvio)

Lua vince sempre premi di performance. L'avvio è velocissimo: l'intero sistema (compresi compilatore, libreria, garbage collector e sistema di runtime) si adatta a 150 KB. Per evitare i tempi di pausa, Lua fornisce garbage collection incrementale. Vedere anche domanda SO Why is Lua faster than other scripting languages?

È possibile rendere l'avvio ancora più veloce da precompilare i propri script, ma non ho mai ritenuto necessario per fare questo codice — e perché compilato (in contrasto con il codice sorgente) non è portabile, precompilazione di solito crea più mal di testa di quello che risolve.

esigenze essere facilmente compilati su più piattaforme

Lua compila utilizzando puro ANSI C e non richiede nemmeno POSIX. Ho una versione in esecuzione sul mio PalmOS PDA.

Deve essere una lingua che sarà ancora in giro tra 5 anni.

Lua è in giro dal 1993. Inoltre, i due membri del team che forniscono il maggior sostegno sono professori di ruolo presso il PUC-Rio. Lua è il loro sostentamento. Infine, l'intero sistema ha solo 17.000 righe di codice. Se Rio fosse caduto fuori dalla mappa domani, chiunque avesse un buon corso di compilatore universitario avrebbe potuto ritirare il sistema e mantenerlo. Ci sarebbero molti volontari.

Ho guardato un po 'alla Python e Lua, ma non so davvero abbastanza su di loro

vedere così in discussione Which game scripting language is better to use: Lua or Python?.