asm.js ist ein Zwischencode, der entworfen wurde, um Software, die in Sprachen wie C geschrieben wurde, in Webanwendungen zu nutzen, dabei aber eine bessere Performance zu erzielen als mit gewöhnlichem JavaScript, das für solche Anwendungen verwendet wird.
asm.js besteht aus einer Teilmenge von JavaScript und wendet einige zusätzliche Konventionen an, sodass Code, der in statisch typisierten Sprachen mit manueller Speicherverwaltung (wie etwa C) geschrieben ist, durch Transcompiler wie Emscripten übersetzt werden kann. Durch die Beschränkung der Syntax kann der Code durch einen Ahead-of-time-Compiler oder auf andere Weisen optimiert werden.
Aufbauend auf asm.js wurde das Binärformat WebAssembly entwickelt.
asm.js wird in der Regel nicht direkt von Hand geschrieben, sondern durch einen Transcompiler aus Code erzeugt, der in Sprachen wie C oder C++ geschrieben ist.
Ausgangspunkt ist daher meist Code wie die folgende in C geschriebene Funktion:
int f(int i) {
return i + 1;
}
Emscripten übersetzt dies in folgenden JS-Code:
function f(i) {
i = i|0;
return (i + 1)|0;
}
Da JavaScript keinen echten Integer-Datentyp besitzt, wird für eine interne Konvertierung ein bitweises Oder durch das angefügte |0
durchgeführt. In asm.js wird dieses Suffix als Hinweis für den Datentyp erkannt, sodass der AOT-Compiler die ursprünglich im C-Code genutzten Datentypen feststellen und den Code entsprechend optimieren kann. Während JavaScript eigentlich dynamisch typisiert ist, verwendet asm.js-Code statische Typisierung. Dadurch werden die Konvertierungen zur Laufzeit des Codes überflüssig, was die Geschwindigkeit des Codes deutlich steigern kann.
Das Emscripten-Projekt stellt Werkzeuge zur Verfügung, um aus C und C++ (oder jeder anderen Sprache, die nach LLVM konvertiert werden kann) asm.js zu erzeugen.
Alle Browser mit aktueller JavaScript-Unterstützung können asm.js-Code ausführen. Durch eine spezielle Implementierung kann asm.js-Code jedoch deutlich schneller ausgeführt werden. Dies findet unter anderem in folgenden Browsern statt: