2015-07-19 10 views
57

Ich habe über asm.js und Web-Montage Lesen kürzlich:Was ist der Unterschied zwischen asm.js und Web Assembly?

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: kompilierte

  1. Ist asm.js Code in Zeit und Lauf? Zusammengestellt in was?
  2. Anders als asm.js Text und Wasm (Web Assembly) binär sein, was sind die Unterschiede zwischen den 2?
  3. Was bedeutet das für andere Skriptsprachen, die im Browser ausgeführt werden? Nehmen wir Python zum Beispiel, wird es sein
    • Python-Code zu Wasm kompiliert? oder
    • Python-Interpreter (Cpython) in Wasm kompiliert und Python interpretieren?

Antwort

25

Ist asm.js Code in der Zeit kompiliert und ausgeführt? Zusammengestellt in was?

asm.js ist normaler JavaScript-Code und wird wie immer vom JS-Interpreter in Bytecode kompiliert. Ein Interpreter mit asm-Unterstützung soll jedoch die Kompilierung vor der Zeit durchführen und möglicherweise wegen der statischen Typisierung eine effizientere Codedarstellung erzeugen. Einzelheiten finden Sie unter http://asmjs.org/.

Was sind die Unterschiede zwischen asm und wasm (anders als text vs binary)?

Keine, für jetzt. Wasm soll abwärtskompatibel sein, compilable to asm (was wiederum als normales JS ausführbar ist). Es könnte jedoch mit more features in der Zukunft erweitert werden, da die Unterstützung dafür wächst.

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

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

+0

Paar Notizen. Der erste Teil Ihrer Antwort erscheint ein wenig mehrdeutig; es klingt wie du sagst, dass asm.js AOT in einen "effizienteren Bytecode" kompilieren würde. Eigentlich müssen Implementierungen nicht auf einen Bytecode zielen, und in der Tat zielen viele direkt auf das native [ISA] (https://en.wikipedia.org/wiki/Instruction_set) und AOT ab (was wirklich der Punkt ist, wirklich) . Sie sagen auch "compilable zu asm und js". Vielleicht möchten Sie klarstellen, dass Sie "native Assembly" oder so etwas sagen wollten. Oder vielleicht meintest du "asm.js und js", aber das ist nicht sehr hilfreich, da man eine Untermenge der anderen ist. – tne

+0

@tne: Danke für das Feedback, ich hoffe, ich könnte die Probleme lösen - fühlen Sie sich frei (vorschlagen) Sie selbst, ich würde es zu schätzen wissen. Richtig, ich war ein wenig nachlässig auf dem "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

17

Ist asm.js Code in der Zeit kompiliert und ausgeführt? Zusammengestellt in was?

Verschiedene Browser kompilieren asm.js Code auf verschiedene Arten. Ab August 2015:

  • Firefox kompiliert asm.js in Maschinencode (und speichert sie zwischen den Maschinencode für zukünftige Lasten der gleichen asm.js) [1].
  • In Windows 10 als ein experimentelles Flag wird Edge auch einige Ahead-of-Time-Validierung und Kompilierung von asm.js [2].
  • Chrome erkennt speziell die „Verwendung asm“ Richtlinie zu Beginn des asm.js es den Code mit Spannung zu analysieren und zu analysieren und Zusammenstellung Heuristik zwicken.
  • Safari führt keine spezielle Verarbeitung von asm.js.

Anders als asm.js Text und wasm (Web-assembly) ist binär sein, was sind die Unterschiede zwischen den 2?

asm.js ist nur JavaScript und muss sich daher genau nach der JavaScript-Spezifikation verhalten. Als neuer Standard ist Webassembly der Lage, einige Ecke Fälle, in denen JavaScript Verhalten (von Leistung oder Kompilation Perspektive) nicht das Ideal ist, zu beheben [3]. In der Zukunft [4] wird WebAssembly in der Lage sein, Funktionen hinzuzufügen, die sonst in JavaScript schwer zu beschreiben wären.

Was bedeutet dies für andere Skriptsprachen, im Browser ausgeführt wird? Python zum Beispiel, wird es

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

In v.1, der einfachste Weg, Python in einem Browser ein Python-Interpreter wasm zu kompilieren laufen, wie Sie gesagt haben. Dies bedeutet beispielsweise, dass der Python-GC in einem Wasm-Code läuft und den linearen Wasm-Speicher manuell verwaltet. Es gab bereits ein experimentelles Projekt, um ein Pyjm-Backend von asm.js [5] hinzuzufügen (was genauso gut für Wasm funktionieren könnte). Es läuft derzeit auf Einschränkungen von asm.js, die von der dynamic linking future feature von Wasm adressiert werden könnte. Weiter zu gehen, wasm sucht sowohl GC integration und JIT compilation support die beide mit der Web-Plattform effiziente und natürliche Integration erlauben würde, zu schaffen.

33

asm.js ist eine Teilmenge von JS mit "hoch optimierbaren" Anweisungen. Grundsätzlich können Sie den Typ (int, float) deklarieren und die js-Engine (in den Browsern aber auch die node.js) wird die Anweisungen schneller ausführen. Es hat Vorteile, wenn Ihre App eine Menge Berechnungen oder Grafiken durchführt, wenn sie zusammen mit WebGL verwendet werden.

Web-Assembly ist ein Binärformat für JS, alle JS, nicht nur asm.js. Es ist kein Bytecode, es ist eine Binärcodierung des AST, die der Parser berechnet. Es verfügt über 2 große Vorteile:

  • die JS-Engine das Parsen Schritt
  • überspringen kann es viel kompakter als die JS ursprüngliche Quelle ist

Wir können bereits Code für Browser schreiben, die nicht JS ist : 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 ausgeführt werden, wenn er Mathematik ausführt. dass Code Bahnanordnung verwenden wird kompakte und der Browser wird es verarbeiten schneller sein kann (weil es in der Lage sein wird, die Analyse zu überspringen). Sie werden nicht ein neues Plugin haben wie DirectX, Javaapplets, Flash oder Silverlight zu laden, weil alles in der JS-Sandbox ausgeführt wird.

+1

Skip parsing? Verlangsamen, dort. Hardware-Unterstützung ist in absehbarer Zukunft nicht in Sicht. Was Sie meinen, ist, dass das Parsen mit asm.js zum Engpass wurde, und wasm mit einem effizienten Binärformat behebt. Ihr Grundprinzip für asm.js/wasm scheint ein bisschen minimalistisch zu sein, aber das ist in Ordnung. Requisiten zum Hinweis auf Bytecode! = AST. – tne