Suchen

Definition „Emscripten (Compiler)“ Was ist Emscripten?

Autor / Redakteur: Egoloizos / Stephan Augsten

Emscripten ist der Name eines Compilers, der die LLVM-Sprache großteils in JavaScript übersetzt. Damit ermöglicht er die Ausführung des Codes verschiedenartiger Programmiersprachen in aktuellen Browsern.

Firma zum Thema

Emscripten dient dazu, die maschinennahe Sprache LLVM in eine Hochsprache zu kompilieren.
Emscripten dient dazu, die maschinennahe Sprache LLVM in eine Hochsprache zu kompilieren.
(Bild: Emscripten.org)

Emscripten hat die Aufgabe, verschiedene Sprachen in jeweils andere zu kompilieren. Hierbei besteht die wesentliche Herausforderung darin, eine maschinennahe Quellsprache (LLVM) in eine andere Art von Sprache (Hochsprache) zu übersetzen. Damit steht Emscripten vor der umgekehrten Aufgabe, die ein Compiler normalerweise übernimmt.

Emscripten ist ein quelloffenes Projekt. Verfügbar ist es unter Lizenz des MIT sowie unter Lizenz der University of Illinois / NCS Open Source (UIUC-Lizenz). Hauptentwickler des Projekts ist Alon Zakai, der auch für seine Arbeit für Mozilla bekannt ist. Emscripten ist als Begriff ein Neologismus aus dem Kunstwort embiggen. Dieses stammt ursprünglich aus der Serie „Die Simpsons“.

Herausforderungen und Besonderheiten

Die Übersetzung einer maschinennahen Sprache in eine Hochsprache ist mit einigen Herausforderungen verbunden, die sich von anderen Compilern unterscheiden.

JavaScript-Engines sind typischerweise auf einen natürlichen Codefluss ausgelegt. Dieser ist in manuellem Quellcode vorhanden. In der maschinennahen LLVM-Infrastruktur fehlt er hingegen. An Stelle der in handgeschriebenem Quellcode vorhandenen Verzweigungen und Schleifen wird der Programmablauf durch Sprünge und Sprungmarken bestimmt.

Eine der Aufgaben ist es folglich, die ursprüngliche Hochsprache wieder herzustellen. Nur auf diese Weise kann ein performantes JavaScript entstehen. Andere Compiler können Hochsprachen-Konstrukte unmittelbar übernehmen. Ihr Nachteil besteht jedoch darin, nur eine einzige Quellsprache unterstützen zu können.

Zusätzlich besteht eine weitere Herausforderung darin, die Semantik des Ausgangs-Codes genau umzusetzen und dabei dennoch ein performantes JavaScript hervorzubringen. Nicht alle Operationen der LLVM-Sprache lassen sich direkt in JavaScript umsetzen.

Zusammenhang zur LLVM Compiler Infrastruktur

LLVM ist eine Eigenbezeichnung für das Projekt und stand ursprünglich als Abkürzung für Low Level Virtual Machine. Inzwischen hat es mit der ursprünglichen Version einer virtuellen Maschine nicht mehr viele Gemeinsamkeiten. Das Projekt LLVM definiert die LLVM assembly language.

Hierbei stellt die LLVM IR (LLVM intermediate representation) eine Abstraktion der Maschinensprache für aktuelle Prozessoren dar. Der Code einer bestimmten Programmiersprache lässt sich durch ein Frontend in die LLVM Sprache übersetzen. Ein Backend kann die LLVM anschließend in den Code der Zielplattform übersetzen

Emscripten übernimmt in diesem Zusammenhang die Rolle des Backends. Auf diese Weise lässt sich eine große Anzahl an ursprünglichen Quell-Programmiersprachen in die Sprache der Zielplattform (in diesem Falle JavaScript) übersetzen. Emscripten kann weiterhin von den Optionen zur Optimierung des Codes Gebrauch machen, die LLVM-Werkzeuge bereits ab Werk beinhalten.

Ausführung der Sprachen und Möglichkeiten

Grundsätzlich sind zwei Optionen denkbar, um eine Sprache unter der Nutzung von Emscripten im Internet auszuführen. Der von einem vorhandenen Frontend erzeugte LLVM-Zwischencode lässt sich entweder direkt in JavaScript übersetzen. Oder aber die gesamte zur Ausführung der Sprache genutzte Laufzeitumgebung wird zu JavaScript portiert.

Hierbei gilt die erstgenannte Methode als die effizientere Variante. Auf diese Weise lassen sich zahlreiche beliebte und verbreitete Sprachen in JavaScript übersetzen. Sollte jedoch noch kein Frontend für eine bestimmte Sprache vorhanden sein, findet sich in der zweiten Methode ein alternativer Ansatz.

Sofern die Laufzeitumgebung der Sprache in einer Sprache geschrieben wurde, die von einem LLVM-Frontend unterstützt wird, ist eine komplette Übersetzung nach JavaScript möglich. Damit besteht die Möglichkeit zur Ausführung im Web. Der Code lässt sich unmittelbar im Browser analysieren. Ebenso kann er in der Laufzeitumgebung ausgeführt werden, die innerhalb der JavaScript-Engine läuft.

Emscripten und seine innere Funktionalität

Emscripten ist als Compiler selbst innerhalb von JavaScript entwickelt worden. Damit gehen einige Nutzungsvorteile einher. Emscripten ist beispielsweise imstande, numerische Ausdrücke durch eine direkte Auswertung mit eval() zu vereinfachen. Ebenso stellt der Compiler bestimmte konstante Strukturen des LLVM-Maschinencodes intern als JavaScript-Objekt dar.

Die Kompilierungsarbeit Emscriptens lässt sich in idealtypischen Phasen betrachten. Zunächst kommt es zur Übertragung des LLVM-Codes in die interne Repräsentation des Codes durch Emscripten. Dies geschieht über den so genannten intertyper.

Anschließend kommt es zur Untersuchung dieser internen Repräsentation durch den analyzer. Dieser generiert Informationen und Daten, die sich anschließend für Optimierungen nutzen lassen. In der letzten Phase kommt es zur Konvertierung der internen Daten-Repräsentation zum gewünschten JavaScript-Code durch den jsifier.

Anwendungsbereiche und Werkzeuge

Emscripten lässt sich sowohl unter Microsoft Windows als auch unter Max OS X und Linux anwenden. Voraussetzungen zur vollumfänglichen Nutzung des Compilers sind die Komponenten LLVM, Python und Node.js. Es existieren weitere Tools, die Anwendern die Nutzung erleichtern. Damit soll die Übersetzung bestehender Projekte (beispielsweise in C und C++) nach JavaScript mit Emscripten besonders leicht fallen.

Dazu gehört emcc, eine Art Ersatz für den gcc-Compiler. Dieser verfügt über weitgehend identische Aufrufkonventionen. In einfachen Anwendungsfällen können Nutzer einfach emcc an Stelle des gcc-Compilers zur Projekt-Erstellung nutzen. Emcc sorgt hierbei für die Erzeugung des LLVM-Bitcodes, wobei es die in Emscripten vorhandenen Schnittstellen nutzt.

Die Ausgabe kann in JavaScript-Code erfolgen oder auch in einem ein ein HTML-Dokument eingebettetes JavaScript. Weiterhin bietet Emscripten Tools für Projekte die über ./configure oder über Makefile entwickelt werden. Die Werkzeuge übernehmen die Aufrufe dieser Tools und können sie dabei konfigurieren.

(ID:46578011)