Steve Yegge hat einen großartigen Blog-Beitrag geschrieben , der sich etwas indirekt damit befasst.
Das Wichtigste: Compiler decken so ziemlich jeden Aspekt der Informatik ab. Es handelt sich um einen Kurs der Oberstufe, da Sie alle anderen Dinge, die Sie im Lehrplan für Informatik lernen, kennen müssen, um beginnen zu können. Datenstrukturen, Suche und Sortierung, asymptotische Performance, Grafikfärbung? Es ist alles drin.
Es gibt einen Grund, warum Knuth seit mehreren Jahrzehnten an seiner monumentalen (und nie endenden) "Kunst der Computerprogrammierung" arbeitet, obwohl sie als (nur) ein Compiler-Lehrbuch begann. Ebenso wie Carl Sagan sagte: "Wenn Sie einen Apfelkuchen von Grund auf neu machen wollen, müssen Sie zuerst das Universum erfinden." Wenn Sie einen Compiler schreiben wollen, müssen Sie sich zuerst mit fast allen Aspekten der Informatik befassen.
Das heißt, wenn der Compiler selbst gehostet ist, kann er mit ziemlicher Sicherheit das tun, was ich brauche, egal was ich tue. Umgekehrt, wenn Sie keinen Compiler in Ihrer Sprache geschrieben haben, besteht eine gute Chance, dass etwas übersehen wird, das für jemanden wirklich wichtig ist, da die Sprachimplementierer niemals ein Programm schreiben mussten, bei dem sie über all diese Probleme nachdenken müssten.
Großer Punkt # 2: Ab 30.000 Fuß sehen eine überraschende Anzahl von Problemen genau wie Compiler aus.
Compiler nehmen einen Strom von Symbolen, ermitteln ihre Struktur nach bestimmten domänenspezifischen vordefinierten Regeln und wandeln sie in einen anderen Symbolstrom um. Klingt ziemlich allgemein, nicht wahr? Gut ja.
Unabhängig davon, ob Sie Mitglied des Visual C ++ - Teams sind oder nicht, müssen Sie häufig etwas tun, das wie ein Teil eines Compilers aussieht. Ich mache es buchstäblich jeden Tag.
Im Gegensatz zu den meisten anderen Berufen verwenden Programmierer nicht nur Werkzeuge, sondern bauen ihre eigenen Werkzeuge. Ein Programmierer, der (aufgrund mangelnder Kenntnisse oder fehlender verwendbarer Werkzeuge zum Erstellen anderer Werkzeuge) keine Werkzeuge schreiben kann, ist für immer behindert und auf die Werkzeuge beschränkt, die jemand anderes bereitstellt.
Wenn eine Sprache zum Erstellen von Programmen "nicht gut geeignet" ist, die einen Strom von Symbolen aufnehmen, Regeln auf sie anwenden und ihn in einen anderen Strom von Symbolen umwandeln können, klingt dies nach einer ziemlich eingeschränkten Sprache und nicht nach einer, die nützlich wäre mir.
(Zum Glück gibt es nicht viele Programmiersprachen, die für die Transformation von Symbolen ungeeignet sind. C ist wahrscheinlich eine der schlechtesten Sprachen, die derzeit verwendet werden. C-Compiler sind jedoch in der Regel selbst gehostet, sodass sie niemanden aufhalten.)
Ein dritter Grund, mit dem ich aus persönlicher Erfahrung enden werde, der von Yegge nicht erwähnt wurde (weil er nicht über das "Warum Selbst-Host" schrieb): Es schüttelt Wanzen aus. Wenn Sie einen Compiler schreiben, bedeutet dies, dass Sie jedes Mal , wenn Sie ihn erstellen (nicht nur, wenn Sie ihn ausführen ), darauf angewiesen sind, dass er funktioniert und ordnungsgemäß mit einer Codebasis von angemessener Größe (dem Compiler selbst) verglichen wird.
In diesem Monat habe ich einen relativ neuen und berühmten Compiler verwendet, der nicht von mir selbst gehostet wird (Sie können sich wahrscheinlich vorstellen, welchen), und ich kann keine 2 Tage ohne Fehler in der Sache verbringen. Ich frage mich, wie viel die Designer tatsächlich verwenden mussten.