Zwischendarstellung

Ein Zwischendarstellung (Ir) ist der Datenstruktur oder Code, der intern von a verwendet wird Compiler oder virtuelle Maschine zu repräsentieren Quellcode. Ein IR ist so konzipiert, dass er für die weitere Verarbeitung förderlich ist, wie z. Optimierung und Übersetzung.[1] Ein "guter" IR muss sein genau - in der Lage, den Quellcode ohne Informationsverlust darzustellen[2] - und unabhängig einer bestimmten Quelle oder Zielsprache.[1] Ein IR kann eine von mehreren Formen annehmen: ein In-Memory Datenstruktur, oder eine besondere Tupel- oder Stapel-basierend Code Lesbar durch das Programm.[3] Im letzteren Fall wird es auch als als bezeichnet Zwischensprache.

Ein kanonisches Beispiel findet sich in den meisten modernen Compilern. Zum Beispiel verwandelt der CPython-Interpreter den linearen menschlich-lesbaren Text, der ein Programm darstellt Grafikstruktur das erlaubt Durchflussanalyse und neu zu arrangieren vor der Ausführung. Verwendung einer Zwischendarstellung wie diese ermöglicht Compiler -Systeme wie die GNU Compiler -Sammlung und Llvm von vielen verschiedenen Quellsprachen verwendet werden Code generieren für viele verschiedene Ziele Architekturen.

Zwischensprache

Ein Zwischensprache ist die Sprache eines abstrakte Maschine entwickelt, um die Analyse von zu unterstützen Computerprogramme. Der Begriff kommt von ihrer Verwendung in Compiler, wobei der Quellcode eines Programms in ein Formular übersetzt wird, das eher für Code-Improving-Transformationen geeignet ist, bevor sie zum Generieren verwendet werden Objekt oder Maschine Code für eine Zielmaschine. Das Design einer Zwischensprache unterscheidet sich typischerweise von der eines praktischen Maschinensprache Auf drei grundlegende Weise:

  • Jede Anweisung repräsentiert genau eine grundlegende Operation; z.B. "Shift-Add" Adressierungsmodi häufig in Mikroprozessoren sind nicht vorhanden.
  • Steuerfluss Informationen werden möglicherweise nicht in den Anweisungssatz aufgenommen.
  • Die Anzahl der Prozessorregister Erhältlich kann groß, sogar grenzenlos sein.

Ein beliebtes Format für Zwischensprachen ist Dreiadress-Code.

Der Begriff wird auch verwendet, um Sprachen zu beziehen, die von einigen als Zwischenprodukte verwendet werden hochrangige Programmiersprachen die selbst kein Objekt oder Maschinencode ausgeben, sondern nur die Zwischensprache ausgeben. Diese Zwischensprache wird einem Compiler für eine solche Sprache übermittelt, die dann das fertige Objekt oder Maschinencode ausgibt. Dies geschieht normalerweise, um den Prozess von zu erleichtern Optimierung oder zu erhöhen Portabilität Durch die Verwendung einer Zwischensprache mit Compilern für viele Prozessoren und Betriebssysteme, wie zum Beispiel C. Sprachen, die für diesen Herbst in der Komplexität zwischen Sprachen auf hoher Ebene verwendet werden niedriger Ebene Sprachen wie z. Assemblersprachen.

Sprachen

Obwohl nicht ausdrücklich als Zwischensprache konzipiert, CNatur als Abstraktion von Montage und seine Allgegenwart als de facto Systemsprache in Unix-artig und andere Betriebssysteme haben es zu einer beliebten Zwischensprache gemacht: Eiffel, Sather, Esterel, etwas Dialekte von Lispeln (Üppig, Gambit), Haskell (Glasgow Haskell Compiler), QuietschenSlang SmallTalk-Subset, Cython, Samen7, Systemtap, Vala, V und andere nutzen C als Zwischensprache. Es wurden Varianten von C entwickelt, um C -Funktionen als tragbare Funktionen zu liefern Montagesprache, einschließlich C-- und die C Zwischensprache.

Jede Sprache, die auf a abzielt virtuelle Maschine oder P-Code-Maschine kann als Zwischensprache angesehen werden:

Das GNU Compiler -Sammlung (GCC) verwendet mehrere Zwischensprachen intern, um die Portabilität zu vereinfachen und Cross-Compilation. Unter diesen Sprachen sind

GCC unterstützt die Erzeugung dieser IRS als endgültiges Ziel:

Das Llvm Der Compiler -Framework basiert auf dem LLVM IR Zwischensprache, von der die kompakte, binäre serialisierte Darstellung ebenfalls als "Bitcode" bezeichnet wird und von Apple produziert wurde.[4][5] Wie Gimple-Bytecode ist LLVM-Bitcode bei der Optimierung der Link-Time nützlich. Wie GCC zielt LLVM auch auf einige IRS ab, die für die direkte Verteilung bestimmt sind, einschließlich Google's PNACl Ir und Spirale. Eine weitere Entwicklung innerhalb von LLVM ist die Verwendung von Multi-Level-Zwischendarstellung (MLIR) mit dem Potenzial, Code für verschiedene heterogene Ziele zu generieren und die Ausgänge verschiedener Compiler zu kombinieren.[6]

Die ILOC -Zwischensprache[7] wird in Klassen zum Compiler -Design als einfache Zielsprache verwendet.[8]

Sonstiges

Statische Analyse Tools verwenden häufig eine Zwischendarstellung. Zum Beispiel, Radare2 ist eine Toolbox für Binärdateien-Analyse und Reverse-Engineering. Es verwendet die Zwischensprachen ESIL[9] und Reil[10] Binärdateien analysieren.

Siehe auch

Verweise

  1. ^ a b Walker, David. "CS320: Compiler: Zwischendarstellung" (Vorlesungsfolien). Abgerufen 12. Februar 2016.
  2. ^ Chow, Fred (22. November 2013). "Die Herausforderung der Interoperabilität des Verfahrens". ACM -Warteschlange. 11 (10). Abgerufen 12. Februar 2016.
  3. ^ Toal, Ray. "Zwischendarstellungen". Abgerufen 12. Februar 2016.
  4. ^ "Bitcode (iOS, watchos)". Hacker News. 10. Juni 2015. Abgerufen 17. Juni 2015.
  5. ^ "LLVM -Bitcode -Dateiformat". llvm.org. Abgerufen 17. Juni 2015.
  6. ^ "Mlir".
  7. ^ "Ein ILOC -Simulator" Archiviert 2009-05-07 im Wayback -Maschine von W. A. ​​Barrett 2007, Paraphrasing Keith Cooper und Linda Torczon, "Engineering a Compiler", Morgan Kaufmann, 2004. ISBN1-55860-698-x.
  8. ^ "CISC 471 Compiler Design" von Uli Kremer
  9. ^ Die Radare2 -Mitwirkenden. "Essil". Radare2 -Projekt. Archiviert von das Original am 18. August 2015. Abgerufen 17. Juni 2015. {{}}: |author= hat generischen Namen (Hilfe)
  10. ^ Sebastian Porst (7. März 2010). "Die Reil -Sprache - Teil I". Zynamics.com. Abgerufen 17. Juni 2015.

Externe Links