Nach über einem Jahrzehnt C/C++-Programmierung ist mir folgendes Muster aufgefallen: Sehr gute Programmierer neigen dazu, detaillierte Kenntnisse über das Innere des Compilers zu haben.
Ich bin ein einigermaßen guter Programmierer und habe eine Ad-hoc-Sammlung von Compiler-“Aberglauben”, also möchte ich mein Wissen neu starten und bei den Grundlagen beginnen.
Kann jemand Links zu Online-Ressourcen oder Lieblingsbüchern empfehlen? Ich interessiere mich besonders für C/C++ Kompilierung, Optimierung, GCC und LLVM.
Hier finden Sie Ressourcen: stackoverflow.com/questions/1669/learning-to-write-a-compiler
– Eliseo Ocampos
6. Juli 2009 um 16:20 Uhr
GCC hat ein “internales” Handbuch, das einige spezifische interne Details dokumentiert, wie z. B. seine Maschinenbeschreibungsdateien und die Datenstrukturen, die es zur Darstellung der Funktionslogik verwendet, sowie GIMPLE- und RTL-interne Darstellungen: gcc.gnu.org/onlinedocs/gccint. Aber es ist nicht wirklich ein Überblick darüber, wie es funktioniert.
– Peter Cordes
22. April um 8:50 Uhr
Beginnen Sie mit dem Drachenbuch …. (Betonen Sie mehr auf Codeoptimierung und Codegenerierung)
Schreiben Sie einen Spielzeug-Compiler für eine pädagogische Programmiersprache wie Decaf oder Cool …, Sie können Parser-Generatoren (Lex und Yacc) für Ihr Frontend verwenden (um das Leben einfacher zu machen und sich auf mehr Kobold-Zeug zu konzentrieren) …
Lesen Sie dann das gcc internals book und durchsuchen Sie den gcc-Quellcode.
Ja, das ist das Drachenbuch. Ich habe die 1. Auflage gelesen. Es hatte einen viel einfacheren Drachen ….
– RBerteig
6. Juli 2009 um 7:46 Uhr
Gah. Die Leute empfehlen das immer wieder. Nicht ich. Beginnen Sie mit einer zwanglosen Einführung – sagen Sie „Lass uns einen Compiler bauen“ – und schauen Sie sich dann eine Informatik-Referenz mit all der Mathematik und Theorie an.
– dmckee — Ex-Moderator-Kätzchen
6. Juli 2009 um 16:23 Uhr
Ich würde davon abraten zu versuchen, GCC zu verstehen. Es ist ziemlich ungewöhnlich, was Compiler angeht, und seine Architektur ist vom Design her schlecht (wie in, das Design ist absichtlich verkrüppelt. Ja, ich meine es ernst. Nein, ich mache nicht nur einen Witz auf Kosten von GCC).
– Dietrich Ep
7. Juli 2009 um 2:40 Uhr
Wenn es darum geht, zu verstehen, was Sie tun, fügen LEX und YACC einfach eine zusätzliche Technologieebene hinzu, die Ihre Sicht auf das, was vor sich geht, verdeckt. Wenn das Ziel darin besteht, zu verstehen, wie ein Compiler funktioniert, wird Ihnen ein rekursiver, anständiger Parser ein besseres Verständnis vermitteln als die Verwendung von LEX und YACC, und im Allgemeinen, wenn Sie dies nur als Lernübung tun, werden Sie wahrscheinlich keinen optimierenden Compiler schreiben Ihre Freizeit, ohne dass Ihnen jemand anderes hilft.
Ich habe das GCC-Interna-Handbuch durchgeblättert, es scheint nicht nützlich zu sein, um zu “lernen”, wie ein Compiler funktioniert. Es ist kein Lehrdokument, es setzt voraus, dass Sie bereits über Kenntnisse des Themas verfügen.
– NoMoreEiferer
13. Juli 2009 um 14:08 Uhr
Keine Eiferer mehr
Compiler Text sind gut, aber sie sind ein bisschen schwer, um sich selbst beizubringen. Jack Crenshaw hat ein „Buch“, das eine Reihe von Artikeln war, die Sie herunterladen und lesen können, mit dem Titel „Lets Build a Compiler“. Es folgt einer „Learn by Doing“-Methodik, die großartig ist, wenn Sie nichts aus dem Besuch formaler Kurse zu diesem Thema herausgeholt haben oder es VIEL zu viele Jahre her sind, seit Sie es genommen haben (das ist mein Fall). Es hält Ihre Hand und führt Sie durch das Schreiben eines Compilers, anstatt Sie mit Lambda Calculus und tiefen theoretischen Problemen herumzuschlagen, die nur die Wissenschaft interessiert. Es war eine gute Möglichkeit, jene Gehirnzellen aufzurütteln, die nur eine verschwommene Erinnerung daran hatten, vor vielen, vielen Monden in der Schule etwas auf das VAX geschrieben zu haben (JA, das ist richtig ein VAX!). Es ist sehr gesprächig geschrieben und es ist einfach, sich hinzusetzen und zu lesen, im Gegensatz zu den meisten Lehrbüchern, die mehrere Kannen Kaffee erfordern, nur um das erste Kapitel zu überstehen. Sobald Sie eine Grundlage für das Verständnis haben, sind traditionellere Texte wie das Drachenbuch großartige Referenzen, um Ihr Verständnis zu erweitern. (Und persönlich mag ich die Dead Tree-Versionen, ich habe Jack’s ausgedruckt, es ist viel einfacher, es in einer bequemen Position zu lesen als auf einem Laptop. Und die Ebook-Reader sind zu teuer für etwas, das sich nicht so anfühlt, als würde man lesen noch ein richtiges Buch.)
Was manche vielleicht als “Nachteil” bezeichnen, ist, dass es in Pascal geschrieben ist, aber ich dachte, das hat mich nur mehr zum Nachdenken gebracht, als wenn mir jemand ein funktionierendes C-Programm gegeben hätte, mit dem ich anfangen könnte. Abgesehen davon wurde es für den 68000 geschrieben, der derzeit nur in eingebetteten Systemen verwendet wird. Auch dies war für mich kein Problem, ich wusste, dass 68000 Asm und 68000 Asm leichter zu lesen sind als einige andere Asm.
Wenn Sie eine Dead-Tree-Edition wünschen, versuchen Sie The Art of Compiler Design: Theory and Practice.
Wie von Pete Eddy angemerkt, ist das Tutorial von Jack Crenshaw hervorragend für Neulinge geeignet. Aber wenn du sehen willst wie ein echter Produktions-C-Compiler funktioniert– eine, die war entworfen von brillanten Ingenieuren erstellt, anstatt Code an die Wand zu werfen, bis etwas hängen bleibt – besorgen Sie sich eine Kopie von Fraser und Hansons A Retargetable C Compiler: Design and Implementation, das den Quellcode bis ins kleinste Detail enthält lcc Compiler. Erläuterungen zum Design und zur Implementierung werden mit dem Code gemischt. Es ist kein erstes Buch für einen Anfänger, aber es lohnt sich, es sorgfältig zu studieren, und Sie können ein gebrauchtes Exemplar für 35 $ bekommen.
Die lcc-Webseite enthält auch Links zu einer Reihe guter Lehrbücher. Ich kenne allerdings keinen Intro-Text, der mir wirklich gefällt.
PS Sorry, dass du an der Uni abgezockt wurdest.
Danke für den Tipp – lcc werde ich mir mal anschauen
– Gerechtigkeit
7. Juli 2009 um 7:46 Uhr
Brillante Ingenieure? Jack Crenshaw entwarf Teile des Space Shuttles, und selbstgebaute Computer waren ein HOBBY von ihm. Um den Intellekt der Leute, die lcc geschrieben haben, nicht in Frage zu stellen, aber Sie müssen nicht brillant sein, um einen Compiler zu entwerfen. Es ist wirklich nicht so schwer.
– NoMoreEiferer
7. Juli 2009 um 19:02 Uhr
Der Verweis war nicht auf Crenshaw, sondern auf gcc. RMS ist vieles, aber brillanter Ingenieur gehört nicht dazu. Dann 1000 Affen dazugeben und gut umrühren…
Danke für den Tipp – lcc werde ich mir mal anschauen
– Gerechtigkeit
7. Juli 2009 um 7:46 Uhr
Brillante Ingenieure? Jack Crenshaw entwarf Teile des Space Shuttles, und selbstgebaute Computer waren ein HOBBY von ihm. Um den Intellekt der Leute, die lcc geschrieben haben, nicht in Frage zu stellen, aber Sie müssen nicht brillant sein, um einen Compiler zu entwerfen. Es ist wirklich nicht so schwer.
– NoMoreEiferer
7. Juli 2009 um 19:02 Uhr
Der Verweis war nicht auf Crenshaw, sondern auf gcc. RMS ist vieles, aber brillanter Ingenieur gehört nicht dazu. Dann 1000 Affen dazugeben und gut umrühren…
Hier finden Sie Ressourcen: stackoverflow.com/questions/1669/learning-to-write-a-compiler
– Eliseo Ocampos
6. Juli 2009 um 16:20 Uhr
GCC hat ein “internales” Handbuch, das einige spezifische interne Details dokumentiert, wie z. B. seine Maschinenbeschreibungsdateien und die Datenstrukturen, die es zur Darstellung der Funktionslogik verwendet, sowie GIMPLE- und RTL-interne Darstellungen: gcc.gnu.org/onlinedocs/gccint. Aber es ist nicht wirklich ein Überblick darüber, wie es funktioniert.
– Peter Cordes
22. April um 8:50 Uhr