Dovresti considerare di compilarlo in C (vedi questo e that risposte), o in altri linguaggi (Java, Common Lisp, Ocaml, o anche un mix di Javascript & C - come HOP fa ...) Puoi anche compilare la rappresentazione testuale di LLVM bytecode oppure utilizzare la libreria LLVM come back-end o (se si utilizza GCC 5 o versione successiva) utilizzare libgccjit (per scegliere come target Rappresentazioni interne GCC e profitti dalle ottimizzazioni GCC). Puoi anche scegliere alcuni bytecode esistenti (ad es. JVM, Ocaml, Neko, Parrot, ...) e compilarli. E potresti anche usare qualche libreria JIT come libjit
, GNU lightning, asmjit
etc ...
Lexing & l'analisi è non il lavoro principale di un compilatore o di un interprete. Sono le parti semplici. Un compilatore è principalmente che trasforma (molto spesso in più passaggi) alcune rappresentazioni interne (in particolare Abstract Syntax Trees , ma non solo loro) del codice sorgente che sta compilando. Un interprete spesso trasforma alcune rappresentazioni interne, quindi attraversa altre (ad esempio qualche bytecode o qualche AST normalizzato). Gioca con l'opzione GCC -fdump-tree-all
, e forse con MELT (un DSL simile a Lisp per ispezionare e / o trasformare le rappresentazioni interne GCC). La semantica del tuo linguaggio di programmazione è più importante della sintassi.
Una parte importante è gestione della memoria . Vuoi un garbage collector (è una parte fondamentale della tua semantica)? Che dire di digitando (statico o dinamico) & tipo di inferenza ? Gestisci chiamate di coda ? Vuoi omoiconicity ? metaprogramming ? Vuoi chiusure (hanno più spesso bisogno di un GC)? Considera GC conservativo di Boehm e / o leggi il manuale GC .
Bootstrapping i compilatori sono importanti. Vedi anche questo e i riferimenti che ho fornito lì. Leggi anche questo & che risponde spiegando tecniche e amp; dettagli pratici (e dovrebbe curare il tuo mal di testa su "Haskell scritto in Haskell", "Ocaml scritto in Ocaml", "MELT scritto in MELT", "CAIA scritto in CAIA", "GCC o Clang / LLVM scritto in C ++").
Inoltre, se non ne conosci nessuno, gioca con Ocaml, Common Lisp, o Haskell o Scheme (vedi anche SICP ). Leggi il libro di Scott su Programming Language Pragmatics e il libro di Queinnec su Lisp In Small Pieces .
Assicurati di implementare la tua lingua un software gratuito (su link troverai molte altre implementazioni linguistiche, ad es. compilatori o interpreti.