2009-07-30 16 views
5

Nel mio continuo sforzo di estinguere la mia sete immatura per una maggiore conoscenza di programmazione, mi è venuta l'idea di tentare di scrivere un (almeno per ora) linguaggio di programmazione semplice che compaia in bytecode. Il problema è che non conosco la prima cosa sulla progettazione della lingua. Qualcuno ha qualche consiglio su una metodologia per costruire un parser e quali dovrebbero essere le caratteristiche di base di ogni lingua? Quale lettura consiglieresti per il design della lingua? Per quanto alto livello dovrei sparare? È irrealistico sperare di poter includere una funzionalità per consentire a un bytecode in linea in un modo simile a gcc che consente l'assemblatore in linea? Vedere principalmente il codice in C e Java che sarebbe meglio per la scrittura del compilatore?Metodologie per la progettazione di un linguaggio di programmazione semplice

+0

Dupe di http://stackoverflow.com/questions/479013/requirements-for-compiler-design/479048 tra molti altri. Inoltre, stai facendo troppe domande: una alla volta è una buona regola. –

+1

E questo http://stackoverflow.com/questions/1669/learning-to-write-a-compiler è la risposta SO definitiva sull'argomento. –

+0

ok Mi dispiace, non ho visto che era un duplicato dovrebbe essere chiuso come duplicato o devo cancellare la domanda? –

risposta

3

Ci sono tanti modi ...

Si potrebbe guardare in lingue di stack e indietro. Non è molto utile quando si tratta di progettare altre lingue, ma è qualcosa che può essere fatto molto rapidamente.

Si potrebbe esaminare le lingue funzionali. Molti di questi sono basati su alcuni concetti semplici e hanno un semplice parsing. E, tuttavia, sono molto potenti.

E, quindi, le lingue tradizionali. Sono i più difficili. Avrai bisogno di conoscere gli analizzatori lessicali, i parser, le grammatiche LALR, grammatiche LL, EBNF e lingue regolari solo per superare l'analisi.

Targeting di un bytecode non è solo una buona idea: fare altrimenti è semplicemente folle, e per lo più inutile, in un esercizio di apprendimento.

Fatevi un favore e cercate libri ed esercitazioni sui compilatori.

O C o Java. Java probabilmente ha un vantaggio, poiché l'orientamento dell'oggetto è una buona corrispondenza per questo tipo di attività. La mia raccomandazione personale è Scala. È un buon linguaggio per fare questo tipo di cose e ti insegnerà cose interessanti sulla progettazione della lingua lungo la strada.

+0

* "Il targeting di un bytecode non è semplicemente una buona idea" * Al contrario mirare a una macchina reale (esx86), scrivendo un interprete o qualcos'altro? A proposito, scrivere un compilatore che abbia come target anche una macchina virtuale "ideale" (al contrario di una CPU in cui devi preoccuparti dell'assegnazione dei registri et al.) Tende ad essere molto più difficile della scrittura di un interprete? Immagino che si possa rendere la compilazione abbastanza semplice compilando un albero invece di una stringa di byte piatta, ma non l'ho mai fatto prima, e mi piacerebbe sapere cosa gli altri hanno da dire al riguardo. –

+0

@Joey Contrariamente al targeting di una macchina reale, in effetti. Anche i compilatori che generano codice macchina generano spesso un output bytecode intermedio (sebbene i compilatori di fascia alta possano evitare di farlo per ottenere i massimi guadagni in termini di velocità di compilazione e ottimizzazioni disponibili). Scrivere un interprete è più facile, anzi, soprattutto se si sceglie di scrivere un linguaggio dinamico. Per quanto riguarda la compilazione in un albero, un albero è il _output_ di parsing, quindi è decisamente più semplice, anche se non proprio così tanto. –

+0

Oops, mi sono confuso dalla tua frase (sembrava che tu avessi detto che il bytecode di destinazione è folle e inutile, ma hai detto il contrario). Inoltre, stavo parlando più lungo le linee di un albero sintonizzato per l'esecuzione, distinto dall'output del parser di base (sebbene in impostazioni semplici, potrebbero essere praticamente la stessa struttura). –

1

Prima è possibile leggere a book on compilers.

Per capire realmente cosa sta succedendo, è probabile che tu voglia di scrivere il codice in C.

Java non sarebbe una cattiva scelta se si voleva scrivere un linguaggio interpretato, come ad esempio Jython. Ma dal momento che suona come si desidera compilare fino a codice macchina, potrebbe essere più facile in C.

1

vi consiglio di leggere i seguenti libri:

ANTLR

Language Design Patterns

Questo vi darà strumenti e tecniche per la creazione di parser, lexer e compilatori per le lingue personalizzate.

Problemi correlati