asm.js ist ein striktes Teilset von JavaScript, das 2013 von Alon Zakai bei Mozilla eingeführt wurde. Es entstand aus dem Emscripten-Projekt (seit 2010), das C- und C++-Programme in JavaScript übersetzt. asm.js-Code trägt das Pragma "use asm"; und beschränkt sich auf typisierte Variablen und Zahlenoperationen — dadurch kann die Engine (SpiderMonkey) den Code vorab in nativen Maschinencode übersetzen (AOT) und fast native Geschwindigkeit erreichen. asm.js ist der direkte Vorläufer von WebAssembly, das 2017 im Browser Einzug hielt und asm.js seither weitgehend ablöste.
Modulaufbau
Ein asm.js-Modul ist eine normale Funktion mit drei Parametern: dem globalen Objekt, fremden Importen und dem Heap (einem ArrayBuffer):
function asmModule(global, foreign, heap) {
"use asm";
function add(a, b) {
a = a | 0; // Typannotation: 32-Bit-Integer
b = b | 0;
return (a + b) | 0;
}
return { add: add };
}
Typannotationen
Jede Zahl wird explizit typisiert, damit die Engine keine dynamischen Checks ausführen muss:
x | 0kennzeichnet einen 32-Bit-Integer+xkennzeichnet eine 64-Bit-Gleitkommazahl (double)x >>> 0kennzeichnet einen vorzeichenlosen 32-Bit-Integer- Der Heap ist ein
ArrayBuffer, der über typisierte Sichten (Int32Array,Float64Array) angesprochen wird
Aufruf aus JavaScript
var module = asmModule(global, foreign, new ArrayBuffer(65536));
var result = module.add(2, 3); // 5
Befehle und Werkzeuge
asm.js wurde kaum von Hand geschrieben, sondern von Compilern erzeugt. Die Werkzeuge stammen aus der Emscripten-Toolchain:
emcc main.c -s ASM_JS=1 -o module.js # klassische asm.js-Ausgabe
emcc main.c -o module.wasm # heute: WebAssembly statt asm.js
emcc --minify 0 main.c -o module.js # lesbare Ausgabe zum Debuggen
Bedeutung
asm.js zeigte, dass Browser-Code nahe an nativer Geschwindigkeit laufen kann, und ebnete den Weg für WebAssembly. Seit 2017 ist Wasm die bevorzugte Zielplattform; asm.js wird von den Engines weiterhin unterstützt, hat aber praktisch nur noch Bedeutung als Fallback für alte Browser.
Verwandte Einträge: WebAssembly-Befehle, WAT — WebAssembly-Textformat, WebAssembly, C/C++-Befehle, Rust-Befehle.