Zwischenvertretung - Intermediate representation

Eine Zwischendarstellung ( IR ) ist die Datenstruktur oder der Code, der intern von einem Compiler oder einer virtuellen Maschine verwendet wird , um Quellcode darzustellen . Eine IR ist so konzipiert, dass sie für die weitere Verarbeitung wie Optimierung und Übersetzung förderlich ist . Eine „gute“ IR muss genau sein – den Quellcode ohne Informationsverlust darstellen können – und unabhängig von einer bestimmten Ausgangs- oder Zielsprache sein. Ein IR kann eine von mehreren Formen annehmen: eine speicherinterne Datenstruktur oder ein spezieller tupel- oder stapelbasierter Code, der vom Programm gelesen werden kann . Im letzteren Fall wird sie auch als Zwischensprache bezeichnet .

Ein kanonisches Beispiel findet sich in den meisten modernen Compilern. Zum Beispiel wandelt die CPython Interpreter den linearen Menschen lesbaren Text , ein Programm in eine Zwischen darstellt Graphenstruktur , die ermöglicht Flussanalyse und Umordnung vor der Ausführung. Die Verwendung einer Zwischendarstellung wie dies ermöglicht Compiler Systeme wie die GNU Compiler Collection und LLVM zu von vielen verschiedenen Quellsprachen verwendet werden , um Code zu generieren für viele verschiedene Zielarchitekturen .

Zwischensprache

Eine Zwischensprache ist die Sprache einer abstrakten Maschine, die bei der Analyse von Computerprogrammen helfen soll . Der Begriff kommt von ihrer Verwendung in Compilern , bei denen der Quellcode eines Programms in eine Form übersetzt wird, die besser für codeverbessernde Transformationen geeignet ist, bevor er zum Generieren von Objekt- oder Maschinencode für eine Zielmaschine verwendet wird. Das Design einer Zwischensprache unterscheidet sich typischerweise in drei wesentlichen Punkten von dem einer praktischen Maschinensprache :

Ein beliebtes Format für Zwischensprachen ist der Drei-Adress-Code .

Der Begriff wird auch verwendet, um sich auf Sprachen zu beziehen, die von einigen höheren Programmiersprachen als Zwischenstufen verwendet werden, die selbst keinen Objekt- oder Maschinencode ausgeben, sondern nur die Zwischensprache ausgeben. Diese Zwischensprache wird einem Compiler für eine solche Sprache vorgelegt, der dann den fertigen Objekt- oder Maschinencode ausgibt. Dies geschieht normalerweise , um den Optimierungsprozess zu vereinfachen oder die Portabilität zu erhöhen , indem eine Zwischensprache verwendet wird , die Compiler für viele Prozessoren und Betriebssysteme enthält , z. B. C . Die hierfür verwendeten Sprachen fallen in der Komplexität zwischen Hochsprachen und Niedrigsprachen , wie beispielsweise Assemblersprachen .

Sprachen

Obwohl C nicht explizit als Zwischensprache konzipiert wurde, hat es seine Natur als Abstraktion der Assemblierung und seine Allgegenwart als de-facto- Systemsprache in Unix-ähnlichen und anderen Betriebssystemen zu einer beliebten Zwischensprache gemacht: Eiffel , Sather , Esterel , einige Dialekte von Lisp ( Lush , Gambit ), Haskell ( Glasgow Haskell Compiler ), Quietschen ‚s Smalltalk-Subset Abkürzung, Cython , Seed7 , SystemTap , Vala , V, und andere Verwendung von C als Zwischensprache zu machen. Varianten von C wurden entwickelt , C-Funktionen als tragbare bereitzustellen Assemblersprache , einschließlich C-- und der C Intermediate Language .

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

Die GNU Compiler Collection (GCC) verwendet intern mehrere Zwischensprachen, um die Portabilität und Cross-Compilierung zu vereinfachen . Zu diesen Sprachen gehören

  • die historische Register Transfer Language (RTL)
  • die Baumsprache GENERIC
  • das SSA- basierte GIMPLE. (Untere Ebene als GENERIC; Eingabe für die meisten Optimierer; hat eine kompakte "Bytecode"-Notation.)

GCC unterstützt die Generierung dieser IRs als letztes Ziel:

Das LLVM- Compiler-Framework basiert auf der LLVM IR- Zwischensprache, deren kompakte, binäre serialisierte Darstellung auch als "Bitcode" bezeichnet wird und von Apple produziert wurde. Wie GIMPLE Bytecode ist LLVM Bitcode bei der Optimierung der Verbindungszeit nützlich. Wie GCC zielt auch LLVM auf einige IRs ab, die für den direkten Vertrieb gedacht sind, darunter Googles PNaCl IR und SPIR . Eine Weiterentwicklung innerhalb von LLVM ist die Verwendung von Multi-Level Intermediate Representation (MLIR) mit dem Potenzial, Code für verschiedene heterogene Ziele zu generieren und die Ausgaben verschiedener Compiler zu kombinieren.

Die Zwischensprache ILOC wird in Klassen zum Compilerdesign als einfache Zielsprache verwendet.

Sonstiges

Statische Analysewerkzeuge verwenden häufig eine Zwischendarstellung. Zum Beispiel radare2 ist eine Toolbox für binäre Dateien Analyse und Reverse-Engineering. Es verwendet die Zwischensprachen ESIL und REIL, um Binärdateien zu analysieren.

Siehe auch

Verweise

Externe Links