641 Shares 5403 views

Broadcaster – ist … Arten von Compilern. Konvertieren und Rundfunkprogramme

Programme, sowie Menschen, von einer Sprache in einer anderen brauchen einen Dolmetscher oder Übersetzer zu übersetzen.

Grundkonzepte

Das Programm ist eine sprachliche Darstellung der Berechnungen: i → P → P (i). Ein Interpreter ist ein Programm, das auf das Eingabeprogramm P und eine Eingabe x zugeführt wird. Es führt bei P x: I (P, x) = P (x). Die Tatsache, dass es nur ein Übersetzer in der Lage ist, alle möglichen Programme durchführen (die im formalen System dargestellt werden können) ist eine sehr tiefe und bedeutende Entdeckung Turing.

Der Prozessor ist ein Interpreter von Programmen in Maschinensprache. Im Allgemeinen zu teuer für Sprachen hochrangiger Interpreten zu schreiben, so dass sie in eine Form übersetzen, die leichter zu interpretieren ist.

Einige Arten von Übersetzern haben sehr seltsame Namen:

  • Der Assembler übersetzt Assembler-Sprache Programme in Maschinensprache.
  • Der Compiler übersetzt eine High-Level-Sprache auf eine niedrigere Sprache.

Broadcaster – ist ein Programm, das als Eingangsdaten das Programm in einer Sprache S und produziert T-Programm in der Weise, dass sie beide haben die gleiche Semantik: P → X → F: Das heißt, ∀x. P (x) = Q (x).

Wenn das gesamte Programm in etwas interpretierbar ausgestrahlt wird eine Zusammenstellung vor der Ausführung oder AOT Kompilation genannt. AOT-Compiler kann in Reihe verwendet werden, von denen die letztere ist oftmals der Assembler, zum Beispiel:

Der Quellcode-Compiler → (Übersetzer) → → Assembler-Code Assembler (Compiler) → → CPU Maschinencode (Interpreter).

Operational oder dynamische Kompilierung tritt auf, wenn das Programm ausgestrahlt wird, wenn von anderen zuvor kompilierten Teil ausgeführt. JIT-Compiler erinnern, was sie bereits getan haben, um nicht den Quellcode immer wieder zu wiederholen. Sie können sogar adaptive Kompilierung erzeugen und Neuübersetzung basierend auf dem Verhalten der Programmausführungsumgebung.

Viele Sprachen erlauben Code während der Kompilierung durchzuführen und den neuen Code zur Laufzeit kompilieren.

Übersetzung Bühne

Broadcast umfasst die Schritte des Analysierens und Synthetisieren:

Der Source Code Analyzer → → → konzeptionelle Darstellung Generator (Synthesizer) → Zielcode.

Dies ist aus diesen Gründen:

  • Jede andere Methode ist nicht geeignet. Wort-Übersetzung einfach nicht funktioniert.
  • Gute technische Lösung: Wenn Sie möchten, schreiben Übersetzer für M und N Ausgangssprachen gezielt schreiben muss nur M + N einfache Programme (polukompilyatorov) anstelle von M × N-Komplex (insgesamt Übersetzer).

in der Praxis ist eine konzeptionelle Ansicht jedoch sehr selten ausdrucksstark genug und stark genug, um all denkbare Ausgangs- und Zielsprache zu decken. Während einige waren in der Lage nahe an diese zu kommen.

Real Compiler passieren viele Stufen. Wenn Sie Ihren eigenen Compiler zu schaffen braucht nicht all die harte Arbeit zu wiederholen, dass die Menschen getan haben, Darstellungen und Generatoren zu erstellen. Sie können Ihre Sprache direkt in JavaScript oder C und nutzen Sie vorhandene JavaScript-Engine und die C-Compiler übersetzen, den Rest zu tun. Sie können auch die vorhandene Zwischendarstellung und Verwendung von virtuellen Maschinen.

Rekord Übersetzer

Broadcaster – ist ein Programm oder Hardware, die drei Sprachen beteiligt: die Quelle, das Ziel und die Basis. Sie können in einer T-Form geschrieben werden, unter der ursprünglichen links, rechts und Ziel-Basis platzieren.

Es gibt drei Arten von Compilern:

  • Broadcaster – ist samokompilyator, wenn es um die grundlegende Ausgangssprache entspricht.
  • Compiler, die Zielsprache ist die Basislinie, genannt samorezidentnym.
  • Broadcaster – ein Cross-Compiler, wenn er gezielt und Grund verschiedene Sprachen.

Warum ist das wichtig?

Selbst wenn Sie nie einen echten Compiler, eine gute Kenntnis der Technologie seiner Schöpfung machen, weil das Konzept für diesen Zweck verwendet häufig verwendet werden, zum Beispiel:

  • Formatieren von Text;
  • Sprachabfragen zu Datenbanken;
  • Advanced Computer-Architektur;
  • verallgemeinert Optimierungsprobleme;
  • GUIs;
  • Skriptsprachen;
  • Controller;
  • virtuelle Maschinen;
  • Maschinelle Übersetzung.

Darüber hinaus, wenn Sie Preprozessoren, Linker, Lader, Debugger und Profiler schreiben möchten, müssen Sie die gleichen Schritte wie beim Schreiben eines Compilers gehen.

Sie können auch lernen, wie man bessere Programme zu schreiben, da die Schaffung der Übersetzer für die Sprache ein besseres Verständnis für seine Feinheiten und Unklarheiten bedeutet. Die Studie der allgemeinen Grundsätze des Rundfunks ermöglicht es Ihnen auch ein guter Designer Sprache zu werden. So spielt es eine Rolle, wie steil die Sprache, wenn es nicht wirksam umgesetzt werden kann?

umfassende Technologie

Compiler-Technologie deckt viele verschiedene Bereiche der Informatik:

  • formale Theorie der Sprache: Grammatik, Parsing, Berechenbarkeit;
  • Computerarchitektur. Befehlssätze, RISC oder CISC-Pipeline-Verarbeitungskern Taktzyklen, etc;
  • Konzepte von Programmiersprachen, beispielsweise eine Ablaufsteuerung, die bedingte Ausführung, Iteration, Rekursion, funktionale Zerlegung, Modularität, Synchronisation, meta-Programmierung, Umfang, konstante Untertypen, Vorlagen, Ausgabeart, Prototypen, Annotationen, Durchfluss-, Monaden, Mailbox durchgeführt wird, weiterhin , Platzhalter für reguläre Ausdrücke, Transaktionsspeicher, Vererbung, Polymorphismus, Moduseinstellungen und so weiter etc..;
  • abstrakte Sprachen und virtuelle Maschinen;
  • Algorithmen und Datenstrukturen: reguläre Ausdrücke, Parsing – Algorithmen, Grafik – Algorithmen, dynamische Programmierung, Schulung;
  • Programmiersprachen: Syntax, Semantik (statisch und dynamisch), Unterstützung Paradigmen (strukturelle, OOP, funktional, logische, Stapel, Parallelität, meta-Programmierung);
  • Software zur Erstellung von (Compiler, in der Regel groß und komplex): Lokalisierung, Caching, componentize, API-Schnittstellen, Wiederverwendung, Synchronisation.

Compiler Design

Einige der Probleme bei der Entwicklung des realen Übersetzer aufgetreten:

  • Probleme mit der Quellsprache. Ist es einfach, es zu kompilieren? Gibt es einen Prä-Prozessor? Wie sind die Typen? Gibt es eine Bibliothek?
  • Gruppieren Compiler Pässe: single oder multi-way?
  • Der Grad der gewünschten Optimierung. Schnelle und unsauber Sendungen mit wenig oder gar keiner Optimierung können normal sein. Over-Optimierung Compiler wird sich verlangsamen, aber besser Code zur Laufzeit sein Geld wert.
  • Der erforderliche Grad der Fehlererkennung. Kann ein Übersetzer beim ersten Fehler stoppt gerade? Wann soll es aufhören? Ob der Compiler Fehlerkorrektur zu vertrauen?
  • Die Verfügbarkeit von Werkzeugen. Wenn die Originalsprache nicht sehr klein ist, werden die Scanner und Generator-Analysatoren erforderlich. Darüber hinaus gibt es Generatoren, Code-Generatoren, aber sie sind nicht so weit verbreitet.
  • Art des Zielcode erzeugt werden. Werden aus reinen ergänzten oder virtuellen Maschinencode ausgewählt. Oder nur einen Eintrittsbereich schreiben, die eine beliebte Zwischendarstellung wie LLVM schafft, RTL, oder JVM. Oder machen Sie eine Übersetzung des Originals im Quellcode in C oder JavaScript.
  • Das Format des Zielcodes. Sie können wählen , eine Assemblersprache, einen tragbaren Maschinencode, Maschinencode Speicherbild.
  • Retargeting. Wenn der Satz von Generatoren gut ist, einen gemeinsamen Einlaßabschnitt zu haben. Aus diesem Grunde ist es am besten, einen Generator für die Eingabe von vielen Teilen zu haben.

Compiler Architektur: Komponenten

Dies sind die wichtigsten Funktionskomponenten eines Compilers, die nativen Code erzeugt (wenn das Ausgabeprogramm ist ein Programm in C oder einer virtuellen Maschine, die Sie brauchen nicht so viele Stufen):

  • Das Eingabeprogramm (Fließmarkierungen) in die Scanner (lexikalischer Analysator) zugeführt, die es in einen Strom von Tokens umwandelt.
  • Parser (Parser) Konstruieren einer Pseudo-Syntaxbaum.
  • Semantic Analysator zerlegt die semantischen Informationen und prüft den Baumknoten auf Fehler. Als Ergebnis gebaut semantische Graph – abstrakten Syntaxbaum mit zusätzlichen Eigenschaften und den etablierten Links.
  • Zwischencodegenerator baut eine Flußgraph (Tupel werden in Hauptblöcke gruppiert).
  • Maschinenunabhängigen Code-Optimierer führen sowohl lokal (innerhalb der Basiseinheit) und global (für alle Blöcke) Optimierung grundsätzlich innerhalb von Routinen bleiben. Reduziert redundanten Code und vereinfacht die Berechnungen. Das Ergebnis ist ein modifiziertes Flussdiagramm.
  • Generator bindet Zielcode Basisblocks in einen geradlinigen Übertragungssteuercode, ein Objektdatei Assembler virtuellen Register zu schaffen (möglicherweise unwirksam).
  • Maschinenabhängig Optimierer ordnet Linker Speicher zwischen den Registern und macht Planungsteams. Es führt das Konvertierungsprogramm in Assembler-Sprache bei dieser Versammlung mit einer guten Verwendung von Pipelining.

Darüber hinaus ist die Verwendung von Fehlererfassungsuntersystem-Manager und Symboltabellen.

Lexikalische Analyse (scanning)

Der Scanner wandelt die Stromquelle Zeichen in einen Strom von Token, das Entfernen Leerzeichen, Kommentare und erweitert Makros.

Scanner stoßen oft Probleme, wie zum Beispiel, ob oder nicht berücksichtigen den Fall, Ränder, Zeilenumbrüche und eingebettete Kommentare.

Fehler, die während des Scannens, die so genannte lexikalischen und umfassen können auftreten:

  • Zeichen, die nicht im Alphabet sind;
  • über die Anzahl von Zeichen in einem Wort oder eine Zeile;
  • kein geschlossenes Zeichen oder ein Stringliteral;
  • Ende der Datei in Kommentar.

Parsing (Syntaxanalyse)

Der Parser wandelt die Folge von Token in einen abstrakten Syntaxbaum. Jeder Knoten im Baum wird als ein Objekt mit dem Namen Feldern gespeichert, von denen viele sind sich die Baumknoten. Zu diesem Zeitpunkt gibt es keine Zyklen. Wenn Sie einen Parser erstellen, ist notwendig, die Aufmerksamkeit auf das Niveau der Komplexität der Grammatik (LL oder LR) und herausfinden, zu zahlen, ob es irgendwelche Begriffsklärung Regeln. Einige Sprachen erfordern semantische Analyse.

Fehler in diesem Stadium gefunden werden Syntax aufgerufen. Zum Beispiel:

  • k = 5 * (7 – y;
  • j = / 5;
  • 56 = x * 4.

semantische Analyse

Während der semantischen Analyse der Zulässigkeit von Regeln und assoziierte Teile des Parsing – Baum zu überprüfen ( unter Berücksichtigung Referenznamen Operation für implizite Typumwandlungen Einfügen, und so weiter. D.) für das semantische Graphen bilden.

Offensichtlich ist die Menge der Zulässigkeit von Regeln in verschiedenen Sprachen unterschiedlich. Wenn Sie die Java-ähnliche Sprachen kompilieren kann Compiler finden:

  • mehrere variable Deklaration in ihrem Umfang;
  • ein Verweis auf eine Variable vor ihrer Erklärung;
  • Bezugnahmen auf den Namen der nicht angemeldeten;
  • Verletzung von Patentrechten;
  • übermäßige oder unzureichende Anzahl der Argumente in einem Methodenaufruf;
  • Typübereinstimmung.

Generation

Zwischencodeerzeugung erzeugt Flußgraph von Tupeln zusammengesetzt, in Basisblöcke gruppiert.

Codegenerierung erzeugt einen echten Maschinencode. In der traditionellen Compiler für die RISC-Maschinen auf dem ersten Schritt erstellen Sie einen Assembler mit einer unendlichen Anzahl von virtuellen Registern. Für CISC-Maschinen wird wahrscheinlich nicht passieren.