Was ist ASM.js und was bedeutet es für alle?


27

Ich fange an, Gerüchte über dieses Projekt namens ASM.js zu hören . Derzeit ist ihre Website schrecklich und verwirrend. Folgendes weiß ich aus meinen Recherchen im Internet.

  • Es ist eine Teilmenge von JavaScript, die in hohem Maße optimiert werden kann. Ich vermute, weil es die dynamischeren Teile der Sprache vermeidet.
  • Die Leistung von in ASM.js kompiliertem Code ist etwa halb so hoch wie die von C (nicht light).
  • Es ist beabsichtigt, dass Compiler ihre Zielsprache ASM.js festlegen.
  • Firefox wird mit der ASM.js-Optimierung ausgeliefert.
  • Die Mozilla und Unreal Teams portierten die Unreal Engine auf die Bahn mit ihm und seinem Laufe in einem Build von Firefox bei nahezu nativer Geschwindigkeit.

Es scheint keine konkreten Informationen im Internet darüber zu geben, was dies wirklich ist oder welchen Nutzen oder Zweck es letztendlich hat. Kann ich meine ansonsten serverseitigen Codebasen kompilieren und im Browser mit nahezu nativer Geschwindigkeit ausführen? Was sind die Konsequenzen für Entwickler?

Antworten:


21

Sie haben bereits beschrieben, was es ist . Die Verwendung ist, dass es sich um eine einfache Sprache handelt, die in allen Browsern funktioniert , in den meisten Fällen recht schnell und in einigen Fällen sehr schnell ist. Was Sie daraus machen, ist so offen wie das, was Sie mit jeder anderen Programmiersprache machen.

Der Anwendungsfall, an dem Mozilla am meisten interessiert zu sein scheint, ist folgender: Es gibt bereits Möglichkeiten, Sprachen mit LLVM-Backends (am bekanntesten C und C ++) über Emscripten zu JavaScript zu kompilieren. asm.js kommt dem, was Emscripten bereits ausgibt, sehr nahe, so dass Emscripten-Code (der auf den heutigen JavaScript-JIT-Compilern bereits beeindruckend schnell ist) noch schneller werden kann, was das Ziel der Portierung vorhandener Codebasen ins Web fördert. Wofür genau Sie dies verwenden, ist Ihre Entscheidung. Das Portieren von Spielen ist ein Anwendungsfall (an dem Mozilla offenbar aktiv beteiligt ist), aber es gibt unzählige in C und C ++ geschriebene Dinge, von denen einige für die Website von jemandem nützlich sein könnten. Einige, die ich herumgeschleudert gesehen habe (und einige, die ich mir ausgedacht habe), ohne Gewähr für die Machbarkeit:

  • Portierung von Allzweckalgorithmen (z. B. zlib, libjpeg, openssl, FFT-Implementierungen), um JavaScript / Websites zu ermöglichen, mehr zu tun, ohne einen neuen Webstandard erstellen zu müssen und abhängig von den einzelnen Browsern, um ihn zu implementieren.
  • Portierung von Interpretern, damit andere Sprachen als JavaScript mit geringerem Aufwand und minimalem Portierungsaufwand im Browser ausgeführt werden können.
  • Verwenden von asm.js als Backend für mehr Compiler, insbesondere für solche, die JavaScript nicht gut zuordnen können und die die meisten Funktionen und den Overhead nicht benötigen. Ein Beispiel könnte eine Sprache sein, die für schnelles numerisches Arbeiten ohne Speicherzuweisung entwickelt wurde.
  • Verwenden von asm.js zum Erstellen einer JIT in JavaScript. Es kann jede Sprache implementieren - zum Beispiel ActionScript .
  • Ebenso die Portierung bestehender JIT-Compiler für die Ausführung im Browser (vgl. Portierung von Interpretern mit praktisch keinem Overhead über JS). Dies ist wahrscheinlich nur möglich, wenn JIT-Compiler wie bei PyPy automatisch generiert werden.

2
Hier ist eine weitere gute Erklärung: ejohn.org/blog/asmjs-javascript-compile-target
Jarrod Nettles

1
Hier ist ein Proof-of-Concept für die Portierung einer JIT nach asm.js. Dies ist ein Alleinstellungsmerkmal. Die meisten aufstrebenden Plattformen sind nicht JIT-freundlich.
Tobu

Gibt es eine Erklärung dafür, wie asm.js die JIT-Kompilierung unterstützt? Kann anscheinend keine Informationen dazu finden. Am meisten interessiert, wie mit den Sicherheitsaspekten umgegangen wird.
Roman Starkov

@romkyns JIT-Kompilierung von asm.js zu Maschinencode durch Browser oder JIT-Kompilierung zu asm.js (durch ein JavaScript-Programm)? Für erstere werden zumindest in Firefox die Maschinencode-Generierungsfunktionen der pure-JS JIT-Compiler wiederverwendet. Da asm.js nur JS aufrufen, arithmetisch arbeiten und ein Heap-Array mit Index-in-Range-Prüfungen lesen / schreiben kann, ist die Sicherheit ungefähr so ​​gut wie die Sicherheit der JS-Ausführung. Bei letzterem generieren Sie einfach den Quellcode von asm.js und lassen ihn vom Browser ausführen. Es gibt keine zusätzlichen Sicherheitsrisiken, die über die zuvor genannten hinausgehen.

(Ich meinte letzteres) Oh, natürlich. Irgendwie stellte ich mir JIT-Compiler vor, die nativen Maschinencode ausgeben. Danke für die Klarstellung!
Roman Starkov

4

Stellen Sie sich ASM.js als einen großen binären ArrayBuffer vor, der als Heap und eine Reihe von JavaScript-Modulen bezeichnet wird und mit einer Prolog-Direktive beginnt. Führen Sie "use asm";schnelle Operationen auf niedriger Ebene mit binären Rohdaten aus, ähnlich wie in Assemblersprachen. Diese Module könnten von Hand geschrieben oder besser mit Skripten wie Emscripten aus LLVM-Code kompiliert werden. Ihre Leistung konnte dank der Mozilla OdinMonkey-Engine gesteigert werden, sie sind jedoch mit den meisten modernen ECMAScript-Interpreten abwärtskompatibel.

ASM.js ist nicht auf Spiele beschränkt, Sie können sogar ganze Qt-Apps in Ihrem Browser ausführen, wie diese !

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.