Was ist der Unterschied zwischen asm.js und WebAssembly?

101

Ich habe kürzlich über asm.js und WebAssembly gelesen:

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

Ich bin immer noch verwirrt über ein paar Dinge:

  1. Wird der Code von asm.js rechtzeitig kompiliert und ausgeführt? In was kompiliert?
  2. Was sind die Unterschiede zwischen den beiden, außer dass asm.js Text und wasm (Web Assembly) binär sind?
  3. Was bedeutet dies für andere Skriptsprachen, die im Browser ausgeführt werden? Nehmen wir zum Beispiel Python, wird es sein
    • Python-Code zu wasm kompiliert? oder
    • Python-Interpreter (Cpython) in Wasm kompiliert und Python interpretieren?
NeoWang
quelle

Antworten:

47

Wird der Code von asm.js rechtzeitig kompiliert und ausgeführt? In was kompiliert?

asm.js ist regulärer Javascript-Code und wird wie immer vom JS-Interpreter in Bytecode kompiliert. Ein Interpreter mit asm-Unterstützung soll jedoch vorab kompilieren und möglicherweise aufgrund der statischen Typisierung eine effizientere Codedarstellung generieren. Weitere Informationen finden Sie unter http://asmjs.org/ .

Was sind die Unterschiede zwischen asm und wasm (außer Text vs Binär)?

Im Moment keine. wasm soll abwärtskompatibel sein und zu asm kompilierbar sein (was wiederum als normales JS ausführbar ist). Es könnte jedoch in Zukunft um weitere Funktionen erweitert werden, wenn die Unterstützung dafür zunimmt.

Was bedeutet dies für andere Skriptsprachen, die im Browser ausgeführt werden?

Letzteres eher, da Python noch interpretiert werden muss. Skriptsprachen, die keinen Interpreter benötigen, können natürlich direkt zu (w) asm kompiliert werden, da es einen Compiler (eine Kette) gibt, der dies als Ziel unterstützt.

Bergi
quelle
Paar Notizen. Der erste Teil Ihrer Antwort scheint etwas mehrdeutig zu sein. Es hört sich so an, als würden Sie sagen, dass asm.js AOT zu einem "effizienteren Bytecode" kompilieren würde. Tatsächlich müssen Implementierungen nicht auf einen Bytecode abzielen, und tatsächlich zielen viele direkt auf die native ISA und AOT ab (was eigentlich eine Art Punkt ist). Sie sagen auch "kompilierbar zu asm und js". Vielleicht möchten Sie klarstellen, dass Sie "native Assembly" oder so etwas sagen wollten. Oder vielleicht meinten Sie "asm.js und js", aber das ist nicht allzu hilfreich, da eines eine Teilmenge des anderen ist.
Der
1
@tne: Danke für das Feedback, ich hoffe, ich konnte die Probleme lösen - zögern Sie nicht, sich selbst zu bearbeiten, ich würde es begrüßen. Richtig, ich war etwas nachlässig in Bezug auf den "effizienteren Bytecode", da ich mit der genauen Kompilierungsarchitektur nicht vertraut war, schließlich ist ISA nur ein weiterer "Bytecode", der vom Prozessor interpretiert wird. Bitte verzeihen Sie ungenaue Terminologie :-)
Bergi
53

asm.js ist eine Teilmenge von JS mit "hochoptimierbaren" Anweisungen. Grundsätzlich können Sie den Typ (int, float) deklarieren und die js-Engine (in den Browsern, aber auch in der node.js-Engine) führt die Anweisungen schneller aus. Es hat Vorteile, wenn Ihre App in Verbindung mit WebGL viele Berechnungen oder Grafiken ausführt.

Web Assembly ist ein Binärformat für JS, alle JS, nicht nur asm.js. Es ist kein Bytecode, sondern eine binäre Codierung des AST, die der Parser berechnet. Es hat 2 große Vorteile:

  • Die JS-Engine kann den Parsing-Schritt überspringen
  • Es ist viel kompakter als die JS-Originalquelle

Wir können bereits Code für Browser schreiben, die nicht JS sind: EMSCripten kann C ++ - Code in JS-Code kompilieren. Andere Transcompiler sind bereits verfügbar, um Ihren Code in JS zu kompilieren. Mit asm.js kann dieser Code schneller laufen, wenn er rechnet. Wenn Sie Web Assembly verwenden, wird dieser Code kompakter und der Browser kann ihn schneller verarbeiten (da er das Parsen überspringen kann). Sie müssen kein neues Plugin wie DirectX, JavaApplets, Flash oder Silverlight laden, da alles in der JS-Sandbox ausgeführt wird.

cristian v
quelle
5
Parsing überspringen? Machen Sie dort langsamer. Hardware-Support ist auf absehbare Zeit nicht auf der Karte. Was Sie damit meinen, ist, dass das Parsen zum Engpass bei asm.js wurde und wasm dies mit einem effizienten Binärformat behebt. Ihre Begründung für asm.js / wasm scheint ein bisschen minimalistisch zu sein, aber das ist in Ordnung. Requisiten für den Hinweis auf Bytecode! = AST.
Der
4
@Cristian, WASM ist kein Binärformat für JS. Es werden die gleichen Web-APIs wie JS verwendet, aber es ist viel portabler und allgemeiner als JS. Die einzigen Binärformate für JS oder Bytecodes sind diejenigen, die in Browsern implementiert sind, wie die von Firefox hier: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast
20

Wird der Code von asm.js rechtzeitig kompiliert und ausgeführt? In was kompiliert?

Verschiedene Browser kompilieren den asm.js-Code auf unterschiedliche Weise. Stand August 2015:

  • Firefox kompiliert asm.js zu Maschinencode (und speichert den Maschinencode für zukünftige Ladevorgänge derselben asm.js zwischen) [ 1 ].
  • In Windows 10 als experimentelles Flag führt Edge auch eine frühzeitige Validierung und Kompilierung von asm.js durch [ 2 ].
  • Chrome erkennt speziell die Direktive "use asm" zu Beginn von asm.js an, um den Code genauer zu analysieren und zu analysieren und die Kompilierungsheuristik zu optimieren.
  • Safari führt keine spezielle Verarbeitung von asm.js durch.

Was sind die Unterschiede zwischen den beiden, außer dass asm.js Text und wasm (Web Assembly) binär sind?

asm.js ist nur JavaScript und muss sich daher genau gemäß der JavaScript-Spezifikation verhalten. Als neuer Standard kann WebAssembly einige Eckfälle beheben, in denen das JavaScript-Verhalten nicht ideal ist (aus Sicht der Leistung oder Kompilierung) [ 3 ]. In Zukunft [ 4 ] kann WebAssembly Funktionen hinzufügen, die sonst in JavaScript nur schwer auszudrücken wären.

Was bedeutet dies für andere Skriptsprachen, die im Browser ausgeführt werden? Nehmen wir zum Beispiel Python, wird es sein

  • Python-Code zu wasm kompiliert? oder
  • Python-Interpreter (Cpython) in Wasm kompiliert und Python interpretieren?

In Version 1 besteht die einfachste Möglichkeit, Python in einem Browser auszuführen, darin, einen Python-Interpreter für wasm zu kompilieren, wie Sie sagten. Dies bedeutet beispielsweise, dass der Python GC im Wasm-Code ausgeführt wird und den linearen Wasm-Speicher manuell verwaltet. Es gab bereits experimentelle Projekte, um PyPy [ 5 ] ein asm.js-Backend hinzuzufügen (was für wasm genauso gut funktionieren könnte). Derzeit stößt es auf Einschränkungen von asm.js, die durch die zukünftige Funktion der dynamischen Verknüpfung von wasm behoben werden könnten . Wasm ist außerdem bestrebt, sowohl GC-Integration als auch JIT-Kompilierungsunterstützung bereitzustellen, die eine effizientere und natürlichere Integration in die Webplattform ermöglichen.

Luke
quelle