Ich bin eigentlich ein Kind, haha. Ich habe noch nie einen eigentlichen Compiler geschrieben oder eine Sprache entworfen, aber ich habe das Red Dragon Book fertiggestellt, also nehme ich an, dass ich etwas von einer Idee habe (hoffe ich).
Es hängt erstens von der Grammatik ab. Wenn es LR oder LALR ist, nehme ich an, dass Werkzeuge wie Bison/Flex gut funktionieren würden. Wenn es mehr LL ist, würde ich Spirit verwenden, die eine Komponente von Boost ist. Es ermöglicht Ihnen, die Grammatik der Sprache in C++ in einer EBNF-artigen Syntax zu schreiben, so dass Sie sich nicht mit Code-Generatoren herumschlagen müssen; Der C++ - Compiler kompiliert die Grammatik für Sie. Wenn eine dieser Methoden fehlschlägt, schreibe ich eine EBNF-Grammatik auf Papier und führe dann eine schwere rekursive Abstiegsanalyse durch, die zu funktionieren scheint; Wenn C++ mit RDP ziemlich gut geparst werden kann (wie GCC es tut), dann nehme ich an, dass mit genügend Unit-Tests und Geduld ganze Compiler mit RDP geschrieben werden können.
Sobald ich einen Parser laufen habe und irgendeine Art von Zwischenrepräsentation, dann hängt es davon ab, wie es läuft. Wenn es sich um einen Bytecode- oder Native-Code-Compiler handelt, verwende ich LLVM oder libJIT, um es zu verarbeiten. LLVM eignet sich besser für die allgemeine Kompilierung, aber ich mag die libJIT API und Dokumentation besser. Alternativ, wenn ich wirklich faul bin, erzeuge ich C-Code und lasse GCC die eigentliche Kompilierung machen. Eine andere Alternative besteht darin, eine vorhandene VM wie Parrot oder die JVM oder die CLR zu targetieren. Parrot ist die VM, die für Perl entworfen wird. Wenn es nur ein Interpreter ist, gehe ich den Syntaxbaum durch.
Eine radikale Alternative ist die Verwendung von Prolog mit Syntaxfunktionen, die EBNF bemerkenswert simulieren. Ich habe jedoch keine Erfahrung damit, und wenn ich nicht falsch liege (was ich mit ziemlicher Sicherheit tun werde), wäre Prolog ziemlich langsam, wenn er schwere Programmiersprachen mit einer Menge von syntaktischen Konstrukten und Macken parsen würde (lies: C++ und Perl).
All dies werde ich in C++ tun, nur weil ich mehr daran gewöhnt bin, in C zu schreiben. Ich würde von Java/Python oder irgendetwas dieser Art für den eigentlichen Produktionscode (Compiler schreiben in C/C++ hilft dabei, es portabel zu machen), aber ich könnte sehen, dass ich sie als Prototyping-Sprache benutze, besonders Python, zu dem ich teilweise tendiere. Natürlich habe ich das vorher noch nie gemacht, also kann ich es nicht sagen.
Für die Aufzeichnung verwenden wir "Kinder" immer noch die Befehlszeile und munkeln, welche Shell besser ist. Oder ich tue das zumindest. C ist aber tot. Ich muss jetzt vor den Programmierern von C fliehen, also werde ich dich sehen! –
Welche Art von Sprache, interpretiert oder kompiliert? –
interpretiert oder zusammengestellt? Hmmm gute Frage. Ich nehme an, es macht einen Unterschied, so dass ich sagen werde, nur um auf der sicheren Seite zu sein. – Mike