Wie funktioniert ein Compiler? [geschlossen]

16

Hinweis: Ich bin überrascht, dass dies noch nicht angefragt wurde, und wenn ja, konnte ich es bei einer Suche nicht finden.

Ich habe Tonnen von Websites besucht, Tonnen von Artikeln gelesen und Tonnen von Erklärungen gehört. Die meisten von ihnen waren gut, aber sie waren entweder zu breit oder zu kompliziert oder einfach nur schlecht. Meine Frage ist also, wie funktioniert ein Compiler?

Wenn dies eine schwierige, umfassende Frage ist, sagen Sie es mir bitte. Falls nicht, beantworten Sie bitte die Frage.

Dynamisch
quelle
4
Zu weit gefasst, zumindest der Teil "Wie funktioniert es?". Es gibt ganze Bücher zu diesem Thema.
Oded
1
en.wikipedia.org/wiki/Compiler wäre der Wikipedia-Link, der trivial zu finden ist. Was fragst du dich konkret? Die Frage ist so weit gefasst, dass ich in Versuchung geraten wäre, die intelligente Antwort zu geben: "Compiler übersetzen Code von einer Sprache in eine andere", da diese allgemeine Idee viele Nuancen enthält, sobald man sie sich ansieht Was bedeutet das wirklich?
JB King
1
Ja, und ich denke, es wurde ziemlich gut beantwortet.
Jeremy
1
Jede Erklärung, wie ein Compiler funktioniert, ist entweder zu umfangreich oder zu kompliziert. Es ist ein kompliziertes Thema, und die Compiler-Kurse waren die schwierigsten Kurse, die ich je in Bezug auf Computer besucht habe.
David Thornley
1
@ David Natürlich sind Compiler kompliziert und Sie können hier nicht alle Details erklären, wie sie funktionieren. Ich bin mir jedoch sicher, dass Sie ein grundlegendes Verständnis dafür hatten, was ein Compiler ist oder wie er funktioniert, bevor Sie an Ihrem Compilerkurs teilgenommen haben.
Dima

Antworten:

23

Ein Compiler ist ein Programm, das den Quellcode eines anderen Programms aus einer Programmiersprache in ausführbaren Code übersetzt.

Der Quellcode ist normalerweise in einer höheren Programmiersprache (z. B. Pascal, C, C ++, Java, Perl, C # usw.). Der ausführbare Code kann eine Folge von Maschinenbefehlen sein, die direkt von der CPU ausgeführt werden können, oder es kann sich um eine Zwischendarstellung handeln, die von einer virtuellen Maschine interpretiert wird (z. B. Java-Bytecode).

Kurz gesagt, ein Compiler konvertiert ein Programm von einem für Menschen lesbaren Format in ein maschinenlesbares Format.

Wie ein Compiler funktioniert, ist in der Tat kompliziert. Es gibt Bücher und Universitätskurse zu diesem Thema. Ich werde versuchen, die Hauptphasen des Prozesses kurz zu skizzieren, aber dies wird ein sehr flüchtiger Überblick sein.

  1. Lexing - Teilen Sie den Text des Programms in "Token" auf. Die Token sind die "Wörter" der Programmiersprache, z. B. Bezeichner (Schlüsselwörter, Variablennamen, Funktionsnamen usw.) oder Operatoren (=, *, & usw.).
  2. Parsing - konvertiert die Folge von Tokens in einen Analysebaum, der eine Datenstruktur darstellt, die verschiedene Sprachkonstrukte darstellt: Typdeklarationen, Variablendeklarationen, Funktionsdefinitionen, Schleifen, Bedingungen, Ausdrücke usw.
  3. Optimierung - konstante Ausdrücke auswerten, nicht verwendete Variablen oder nicht erreichbaren Code optimieren, Schleifen nach Möglichkeit entfernen usw.
  4. Übersetzen Sie den Analysebaum in Maschinenanweisungen (oder JVM-Bytecode).

Ich betone noch einmal, dass dies eine sehr kurze Beschreibung ist. Moderne Compiler sind sehr schlau und daher sehr kompliziert.

Dima
quelle
2
Tatsächlich verwandelt es eine Sprache in eine andere. Der frühe C ++ - Compiler kompilierte bis C. Gleiches gilt für den Vala-Compiler. Der Java-Compiler wird in Bytecode kompiliert, der ohne den JIT-Compiler einer JVM nicht ausführbar ist.
Deadalnix
1
@deadalnix IMHO, der Punkt ist, dass Sie von nicht ausführbarem Code zu ausführbarem Code wechseln. Ich würde argumentieren, dass C-Front kein Compiler war, sondern ein Front-End für den C-Compiler. Oder eine Phase im Kompilierungsprozess, wenn Sie so wollen. Virtuelle Maschinen verwischen natürlich die Grenze zwischen "ausführbar" und "nicht ausführbar". In diesem Fall würde ich ausführbaren Code einfach als das betrachten, was in die virtuelle Maschine eingeht, wie den Byte-Code, und abstrahieren, was in der VM vor sich geht, wie JIT.
Dima
1
@Dima, es muss nicht von nicht ausführbarem Code zu ausführbarem Code sein. Beispielsweise können Sie JVM-Bytecode nicht direkt auf Windows-Computern ausführen.
1
@ Thorbjørn Ravn Andersen: Der Bytecode kann jedoch von der JVM ausgeführt werden. Ist es nicht der Sinn einer "virtuellen Maschine", für den Programmierer wie eine echte Maschine auszusehen?
Dima
2
Ich würde argumentieren, dass traditionell ein Compiler ein Programm von einem für Menschen lesbaren Format in ein maschinenlesbares Format konvertierte, wie Dima sagte. Variationen wie Cfront, das C ++ in C konvertiert, oder Java, das Java in Bytecode konvertiert, sind fortgeschrittenere Themen, die wahrscheinlich erst dann behandelt werden sollten, wenn jemandem, der mit dem Konzept nicht vertraut ist, das traditionelle Grundkonzept erklärt wurde.
Carson63000
5

Ein Compiler ist ein Computerprogramm (oder eine Reihe von Anweisungen), das in einer Programmiersprache (der Quellsprache) geschriebenen Quellcode in eine andere Computersprache (die Zielsprache, die häufig eine binäre Form hat, die als Objektcode bezeichnet wird) umwandelt. Der häufigste Grund für die Transformation von Quellcode ist die Erstellung eines ausführbaren Programms.

Compiler verbinden Quellprogramme in Hochsprachen mit der zugrunde liegenden Hardware. Ein Compiler benötigt:

  1. Feststellung der Richtigkeit der Syntax von Programmen
  2. Richtigen und effizienten Objektcode generieren
  3. Organisation zur Laufzeit
  4. Formatieren der Ausgabe gemäß Assembler- und / oder Linker-Konventionen.
Mario Stylianou
quelle