2009-12-18 11 views
14

Ho deciso di scrivere un piccolo interprete come mio prossimo progetto, in Ruby. Quali conoscenze/competenze dovrò avere per avere successo?
Non ho ancora deciso il linguaggio da interpretare, ma sto cercando qualcosa che non sia un linguaggio giocattolo, ma sarebbe relativamente facile scrivere un interprete. Grazie in anticipo.Come scrivere un interprete?

+0

eh? Se non si decide sulla lingua, come puoi sapere? Alcuni possono essere molto semplici da interpretare, anche usando le librerie ... –

+0

Penso che sia molto più facile scrivere un interprete Ruby in Lisp che viceversa. – Svante

+0

Svante, non ne sono così sicuro. –

risposta

29

Dovrete imparare almeno:

  • analisi lessicale (raggruppamento caratteri in token)
  • parsing (raggruppamento segnalini insieme nella struttura)
  • albero sintattico astratto (che rappresentano la struttura del programma in un data struttura)
  • rappresentazione dei dati (presupponendo che la lingua abbia variabili)
  • un ciclo di valutazione che "esegue" il programma

Un'eccellente introduzione ad alcuni di questi argomenti è disponibile nel testo introduttivo Structure and Interpretation of Computer Programs. Il linguaggio utilizzato in quel libro è Scheme, che è un linguaggio robusto e ben specificato che è l'ideale per la prima implementazione dell'interprete. Altamente raccomandato.

+0

Grazie per l'ottima risposta. Solo curioso, quanto pensi che ci vorrà per completare un semplice interprete di lavoro? – bennybdbc

+2

La risposta a questa domanda dipende da molti fattori, il più importante dei quali sono: (a) il livello di esperienza della persona che fa la attuazione, e (b) la scelta della lingua da interpretare. Forse anche (c) la scelta del linguaggio di implementazione. Come ipotesi approssimativa, per un programmatore intermedio che apprende le tecniche, potrei dire un paio di settimane di lavoro dedicato. –

1

Non è così difficile. Ecco un LISP interpreter in ruby e la fonte è così piccola che si suppone di copiarla/incollarla. ma imparerai LISP adesso? hehe.

5

Non ho ancora deciso sul linguaggio per interpretare ancora, ma io sto cercando qualcosa che non è un linguaggio giocattolo, ma sarebbe relativamente facile scrivere un interprete per . Grazie in anticipo.

Prova qualche dialetto di Lisp come Schema o Clojure. (Ora c'è un'idea: Clojure-in-Ruby, che si integra con Ruby e Clojure con Java.)

Con Lisp, non è necessario preoccuparsi delle idiosincrasie della sintassi, poiché la sintassi di Lisp è molto più vicina a l'albero di sintassi astratto.

+1

Clorure suona come una lingua che Scooby Doo avrebbe scavato. – FMc

+0

E 'stato fatto http://www.springerlink.com/content/q3n77q7172831288/ e http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red –

2

This SICP chapter mostra come scrivere un interprete Lisp in Lisp (un valutatore metacircolare). Secondo me questo è il miglior punto di partenza. Quindi è possibile passare a Lisp in Small Pieces per imparare come scrivere interpreti avanzati e compilatori per Lisp. Il vantaggio di implementare un linguaggio come Lisp (nello stesso Lisp!) È che si ottengono gratuitamente l'analizzatore lessicale, il parser, l'AST, la rappresentazione di dati/programmi e REPL. Puoi concentrarti sul compito di far funzionare la tua lingua!

2

ho avuto un'idea simile un paio di giorni fa. LISP è di gran lunga il più semplice da implementare perché la sintassi è così semplice e le strutture dati che il linguaggio manipola sono le stesse strutture in cui è scritto il codice. Quindi è necessaria solo un'implementazione minima e possiamo definire il resto in termini di si.

Tuttavia, se si sta cercando di apprendere l'analisi, è possibile che si desideri eseguire una lingua più complessa con Abstract Syntax Trees, ecc.

Se si desidera verificare l'implementazione Java (letteralmente di due giorni) di lisp, consultare mylisp.googlecode.com. Ci sto ancora lavorando ma è incredibile quanto tempo ci sia voluto per far funzionare le cose esistenti.

1

Se stai solo facendo questo per divertimento, fare il vostro proprio, linguaggio semplice e basta provare. La mia raccomandazione sarebbe qualcosa di simile ad un BASIC classico molto semplice (niente elementi visivi di base o orientati agli oggetti). Con i numeri di linea, GOTO, INPUT e PRINT e il gioco è fatto. Tu fai le basi e ottieni una migliore comprensione di come funzionano le cose.

La conoscenza di cui hai bisogno?

  • creazione di token (svolta che pezzo enorme di personaggi in qualcosa di più efficiente leggibili, in modo efficace la suddivisione in su in 'parole')
  • di analisi (andando oltre i gettoni e la costruzione di una struttura di dati da esso)
  • Interpretariato (looping sulla struttura dei dati ed esecuzione di ogni comando)

E per quest'ultimo è necessario anche un modo per aggirare le variabili. Solitamente si implementa solo uno "stack", un enorme blocco di dati in cui è possibile contrassegnare un'area alla fine.

1

Non implementato in Lisp, ma ho trovato Write Yourself A Scheme in 48 Hours essere un documento molto utile mentre ero agli inizi con Haskell (anche se non ho avuto nessuna parte vicino a finirlo dopo 48 ore; misura con le pinze). Ti dà anche molte informazioni sugli interpreti in generale.