Red Hat arbeitet an Zwischencode für JIT-Compiler

Das MIR-Projekt soll eine Basis für schnelle und schlanke Just-in-Time-Compiler bilden.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 3 Beiträge
Von

Innerhalb kurzer Zeit kündigt Red Hat zum Jahresstart bereits das zweite Projekt an, das vorhandene Techniken optimieren soll. Nach der Ankündigung von Goal zum Verbessern des Buildmanagement-Werkzeugs Make hat ein Entwickler des Unternehmens nun mit MIR (Medium Internal Representation) ein Projekt zum Erstellen eines schlanken JIT-Compilers (Just-in Time) vorgestellt.

Die Bezeichnung "Medium Internal Representation" hat der Entwickler Vladimir Makarov dem Buch "Advanced Compiler Design and Implementation" von Steven Muchnick entnommen. Das Akronym könnte zu Verwechslungen führen, da das Rust-Team es ebenfalls für den Einsatz von Zwischencode verwendet, auch wenn es dort für "Mid-Level Intermediate Represenation" steht.

In einem Blogbeitrag zum MIR-Projekt betont Makarov, dass er sich der doppelten Verwendung des Akronyms bewusst ist und es trotzdem verwendet, schon weil das russische Wort "мир" ("Mir") sich mit "Frieden" und "Welt" übersetzen lässt – auch die bekannte russische Raumstation verwendete den Namen. Eine Verwechslungsgefahr mit Canonicals Display-Server-Protokoll Mir für Linux ist dagegen kaum gegeben.

Der derzeitige Stand von MIR setzt auf Ein- und Ausgabe von C-Code.

(Bild: Red Hat)

Makarov war in den vergangenen Jahren an der Entwicklung des JIT-Compilers für CRuby beteiligt und übernimmt die dabei gewonnene Erkenntnis in das MIR-Projekt. Die Motivation ist vor allem die vergleichsweise schlechte Performance und Umsetzung der JIT-Ansätze mit GCC und LLVM, die deutlich größeren Source- beziehungsweise Maschinencode erzeugen. Der Blogbeitrag zeigt konkrete Benchmarks zu Größe und Kompiliergeschwindigkeit.

MIR hat vor allem schlanken Code im Fokus. Auch wenn der ursprüngliche Ansatz auf Ruby zielt und der Compiler mit dem Method-based JIT-Compiler MJIT zusammenspielen soll, ist er auf eine generelle Anwendung ausgelegt, um auch mit anderen Programmiersprachen zu arbeiten.

MIR ist streng typisiert und kann Instruktionen für unterschiedliche Architekturen mit 32-bit und 64-bit repräsentieren. Die Sprache setzt auf Module, von denen jedes Funktionen sowie Deklarationen und Daten mitbringen kann. Jede Funktion hat eine über ihre Parameter und Typen definierte Signatur und verwendet lokale Variablen. Außerdem bietet sie Instruktionen für den eigentlichen Code.

Der Blogbeitrag und das GitHub-Repository von MIR zeigen die Umsetzung über den Code zum Sieb des Eratosthenes, eines Algorithmus zum Bestimmen von Primzahlen bis zu einer gegebenen Zahl, und stellt den C-Quellcode der Textrepräsentation in MIR gegenüber. Das Beispiel zeigt, dass Letztere durchaus recht gut lesbar ist.

Derzeit lässt sich mit dem Projekt MIR-Code in textueller und binärer Form über eine API sowie aus C beziehungsweise LLVM-IR-Code erstellen. Außerdem kann das Tool den Zwischencode interpretierend ausführen und Maschinencode für x86-64 erzeugen.

Langfristig soll MIR auch Java Bytecode und WebAssembly verarbeiten.

Langfristig ist eine Erweiterung der Zielplattformen für Maschinencode ebenso geplant wie die Anbindung weiterer Eingabesprachen: Rust und C++ sollen über LLVM IR einfließen, und das Tool soll Java Bytecode sowohl in der Ein- als auch der Ausgabe verarbeiten. Dasselbe gilt für WebAssembly.

Weitere Details zu MIR lassen sich dem Blogbeitrag und dem GitHub-Repository entnehmen. Das Projekt befindet sich in einer sehr frühen Phase. Der derzeit veröffentlichte Code dient laut dem Readme im GitHub-Repository lediglich dazu, MIR kennenzulernen. (rme)