Wie funktionieren C/C++-Compiler?

Lesezeit: 6 Minuten

Benutzeravatar von Justicle
Gerechtigkeit

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.

  • Danke, schöne Folge. Ich nehme an, das Drachenbuch ist: en.wikipedia.org/wiki/index.html?curid=188976

    – Gerechtigkeit

    6. Juli 2009 um 5:31 Uhr

  • 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.

    – NoMoreEiferer

    7. Juli 2009 um 16:34 Uhr

  • 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

Benutzeravatar von NoMoreZealots
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.

Für einen längeren Klappentext lccsehen C unter Linux schneller kompilieren.

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…

    – Norman Ramsey

    7. Juli 2009 um 23:55 Uhr

Benutzeravatar von jens
jens

http://se-radio.net/podcast/2007-07/episode-61-internals-gcc

  • 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…

    – Norman Ramsey

    7. Juli 2009 um 23:55 Uhr

Benutzeravatar von plan9assembler
plan9assembler

siehe Fabrice Bellards otcc-Quellcode

http://bellard.org/otcc/

1387640cookie-checkWie funktionieren C/C++-Compiler?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy