Domanda

Quali suggerimenti puoi dare a una persona che sta cercando di scrivere un linguaggio di programmazione o di script? io non sono preoccupato di come programmare o progettare un compilatore, ma di come svilupparne uno rapidamente usando strumenti e generatori di codice.

L'ultima volta che ho provato l'ho codificato in c ++ e gli stati e la sintassi hanno impiegato quasi il tempo di scrivere la logica effettiva. So che i seguenti strumenti sarebbero di aiuto.

Stavo pensando di poter generare codice c ++ e far compilare gcc. Utilizzando gli strumenti sopra indicati per quanto tempo stimeresti scrivere un programma o un linguaggio di script?


Sono state poste ripetutamente variazioni su questa domanda, fin da Imparare a scrivere un compilatore . Ecco un elenco incompleto di risorse SO sull'argomento.

È stato utile?

Soluzione

Stimare quanto tempo potrebbe richiedere qualcosa del genere dipende da molti fattori diversi. Ad esempio, un programmatore esperto può facilmente eliminare un semplice valutatore di espressioni aritmetiche in un paio d'ore, con test unitari. Ma un programmatore alle prime armi potrebbe dover imparare le tecniche di analisi, la discesa ricorsiva, la rappresentazione astratta degli alberi delle espressioni, le strategie per camminare sugli alberi e così via. Questo potrebbe facilmente richiedere settimane o più, solo per le espressioni aritmetiche.

Tuttavia, non lasciarti scoraggiare. Mentre Jeff e Joel stavano discutendo con Eric Sink su un recente podcast Stack Overflow , scrivere un compilatore è un ottimo modo per conoscere molti aspetti diversi della programmazione. Ho creato alcuni compilatori e sono tra i miei progetti di programmazione più memorabili.

Alcuni libri classici sulla compilazione di compilatori sono:

Altri suggerimenti

Dave Hanson, che con Chris Fraser ha trascorso 10 anni a costruire uno dei compilatori più accuratamente realizzati al mondo , una volta mi ha detto che una delle cose principali che ha imparato dall'esperienza è stata quella di non provare a scrivere un compilatore in C o C ++.

Se vuoi sviluppare qualcosa velocemente, non generare codice nativo; targetizzare una macchina virtuale esistente come CLR, JVM o la Lua . Genera codice usando il munch massimo.

Un'altra buona opzione se stai scrivendo un interprete è solo quella di utilizzare la gestione della memoria e altre funzionalità del tuo linguaggio di programmazione sottostante. Analizza un AST e quindi interpreta la camminata dell'albero dell'AST. Questo ti farà decollare rapidamente. Le prestazioni non sono le migliori, ma sono accettabili. (Usando questa tecnica una volta ho scritto un interprete PostScript in Modula-3. La prima implementazione ha richiesto una settimana e sebbene in seguito abbia subito un tuning delle prestazioni, principalmente nel lexer, non ha mai dovuto essere sostituita.)

Evita generatori di parser LALR; usa qualcosa che ti fa risparmiare tempo, come ANTLR o il Elkhound generatore di parser GLR.

I libri classici sulla progettazione del compilatore sono

" Principi di progettazione del compilatore " di Alfred V. Aho e Jeffrey D. Ullman. È in circolazione da un po 'di tempo ormai e il suo cavaliere rosa e il drago verde sono ben noti ad almeno un paio di generazioni di studenti CS.

Anche ...

"Compilatori: principi, tecniche e strumenti" di Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman

Se sei interessato a scrivere un compilatore, questi sono senza dubbio i posti migliori da cui iniziare.

  

Come persona che conosce molto bene il C ++,   quali consigli puoi dare a una persona che   stai cercando di scrivere un linguaggio di programmazione o di script?

Non farlo. (o almeno pensaci a lungo prima di farlo!)

Se stai cercando di scrivere un linguaggio di scripting per esporre i metodi / proprietà di alcuni oggetti scritti su misura, sarebbe meglio implementarli in Java (o .NET / VB o tutti quei micidiali Microsoftism) e quindi usare uno dei Bean Scripting Framework come linguaggio di scripting. (con qualunque equivalente sia alla fine di Microsoft.)

Qualsiasi domanda sui compilatori avrà una risposta " vai a leggere il libro del drago, leggi quel libro, questo libro ... " su SO indipendentemente dal loro contenuto in pochi minuti. Quindi ho saltato quella parte (come stavo dicendo in primo luogo). Leggere questi libri per imparare a utilizzare gli strumenti desiderati è utile quanto leggere il momento angolare per imparare a guidare una bici.

Quindi, per rispondere a ciò che hai chiesto, senza mettere in discussione la tua intenzione, posso facilmente consigliare antlr e antlrworks per i principianti. Puoi generare facilmente il tuo AST (dove accade la vera magia, penso) ed eseguire il debug della grammatica visivamente. Genera una buona parte di un compilatore funzionante per te.

Se conosci le tue cose e vuoi avere più controllo o non ti piace antlr, puoi usare lemon generatore di parser e ragel compilatore di macchine a stati (supporto speciale per lexing) insieme .

Se non hai bisogno di troppe prestazioni e poiché prevedi di generare codice C / C ++, puoi saltare da solo le ottimizzazioni e lasciare quelle cose al tuo compilatore C / C ++.

Se riesci a vivere con un tempo di esecuzione lento, puoi ridurre ulteriormente i tuoi sforzi di sviluppo semplicemente interpretando, poiché spesso è più facile implementare le funzionalità dinamiche in questo modo.

Penso che a tutti manchi un punto molto importante.

PERCHÉ vuoi scrivere un compilatore / interprete / parser ecc.

Ciò determinerà seriamente molto di ciò che fai.

Ho lavorato su alcune implementazioni linguistiche, alcune piuttosto strane, alcune specifiche del dominio, altre semplicemente scriptate attraverso gli ambienti di comando (spesso in cui l'ambiente di comando è stato successivamente nascosto). Ognuno richiedeva diversi livelli di abilità.

Molti libri disponibili. Uno che amavo era un libro BYTE: Threaded Interpreted Languages ??- scommetto che è fuori catalogo.

I motori di script semplici possono essere creati con un pensiero di qualche sera e un po 'di tentativi ed errori.

Ma scommetto che ora ci sono corsi online che ti faranno risparmiare un sacco di tempo.

Consiglio vivamente di esaminare gli interpreti bytecode esistenti. Se riesci ad adattare il tuo linguaggio a CIL (.NET) o Java (o anche ad altri come Python o Parrot), risparmierai tutto lo sforzo di creare un ambiente di supporto praticabile e puoi continuare a sperimentare concetti di linguaggio.

Se stai pensando di scrivere un interprete o un compilatore, non farlo perché vuoi scrivere la prossima cosa importante. Scrivilo perché hai già uno scopo in mente o da imparare. Se lo fai potresti scoprire di aver scritto per sbaglio la prossima grande cosa.

Un buon strumento che ho usato per LALR è il GOLD Parsing System . È gratuito, la grammatica è Backus-Naur Form e ci sono molti esempi, inclusi i motori scritti in C #, VB.NET, Java e altri. Ciò consente di scrivere una grammatica, compilare la grammatica in un file e quindi utilizzare un motore per analizzare la grammatica.

Come raccomandato sopra, consiglierei di indirizzare un codice byte di qualche tipo, come IL. Ciò ti consentirà di sfruttare le enormi quantità di quadri esistenti.

Buona fortuna

Se non si desidera iniziare a scrivere un compilatore per ridurre la propria lingua in assembly / machine, l'opzione successiva è quella di scrivere un compilatore in una macchina virtuale con linguaggio a codice byte, come JVM, PVM o. NET.

Ovviamente, se non vuoi nemmeno farlo - vuoi solo creare il tuo "linguaggio specifico di dominio", lo costruirò in Common Lisp. Le macro Lisp forniscono un metodo piuttosto semplice per creare qualsiasi sintassi desiderata e analizzarla in Lisp. E non devi preoccuparti di byte-code o assembly. Certo, devi imparare Lisp.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top