Quelle est la différence entre asm.js et WebAssembly?

101

J'ai lu récemment sur asm.js et WebAssembly:

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

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

Je suis encore confus sur certaines choses:

  1. Le code asm.js est-il compilé à temps et exécuté? Compilé en quoi?
  2. A part asm.js étant du texte et wasm (web assembly) étant binaire, quelles sont les différences entre les 2?
  3. Qu'est-ce que cela signifie pour les autres langages de script, exécutés dans le navigateur? Prenons python par exemple, est-ce que ça va être
    • code python compilé en wasm? ou
    • interpréteur python (Cpython) compilé dans wasm et interpréter python?
NeoWang
la source

Réponses:

47

Le code asm.js est-il compilé à temps et exécuté? Compilé en quoi?

asm.js est du code javascript régulier, et est compilé en bytecode par l'interpréteur JS comme toujours. Cependant, un interpréteur prenant en charge asm est censé effectuer une compilation à l'avance, et éventuellement générer une représentation de code plus efficace en raison du typage statique. Voir http://asmjs.org/ pour plus de détails.

Quelles sont les différences entre asm et wasm (autre que texte vs binaire)?

Aucun, pour l'instant. wasm est censé être rétrocompatible, compilable en asm (qui est encore une fois exécutable comme JS normal). Il pourrait cependant être étendu avec plus de fonctionnalités à l'avenir à mesure que sa prise en charge augmentera.

Qu'est-ce que cela signifie pour les autres langages de script, exécutés dans le navigateur?

Ce dernier, plutôt, comme Python doit encore être interprété. Les langages de script qui n'ont pas besoin d'un interpréteur peuvent bien sûr être directement compilés vers (w) asm, étant donné qu'il existe un compilateur (chaîne) qui le prend en charge en tant que cible.

Bergi
la source
Notes de couple. La première partie de votre réponse semble un peu ambiguë; il semble que vous disiez qu'asm.js compilerait AOT en un "bytecode plus efficace". En fait, les implémentations n'ont pas à cibler un bytecode, et en fait beaucoup ciblent directement l' ISA natif et AOT (ce qui est un peu le point, vraiment). Vous dites aussi "compilable en asm et js". Vous voudrez peut-être préciser que vous vouliez dire "assemblage natif" ou quelque chose comme ça. Ou peut-être que vous vouliez dire "asm.js et js", mais ce n'est pas très utile car l'un est un sous-ensemble de l'autre.
tne le
1
@tne: Merci pour les commentaires, j'espère pouvoir résoudre les problèmes - n'hésitez pas à (suggérer) modifier vous-même, je l'apprécierais. Bon, j'étais un peu laxiste sur le "bytecode plus efficace" car je n'étais pas familier avec l'architecture de compilation exacte, après tout ISA est juste un autre "byte code" qui est interprété par le processeur. Veuillez pardonner la terminologie inexacte :-)
Bergi
53

asm.js est un sous-ensemble de JS avec des instructions "hautement optimisables". En gros, vous pouvez déclarer le type (int, float) et le moteur js (dans les navigateurs mais aussi celui de node.js) exécutera les instructions plus rapidement. Cela présente des avantages si votre application effectue beaucoup de calculs ou de graphiques si elle est utilisée avec WebGL.

l'assembly web est un format binaire pour JS, tous JS, pas seulement asm.js. Ce n'est pas un bytecode, c'est un encodage binaire de l'AST que l'analyseur calcule. Il présente 2 grands avantages:

  • le moteur JS peut sauter l'étape d'analyse
  • c'est beaucoup plus compact que la source d'origine JS

Nous pouvons déjà écrire du code pour les navigateurs qui ne sont pas JS: EMSCripten peut compiler du code C ++ en code JS. D'autres transcompilateurs sont déjà disponibles pour compiler votre code en JS. En utilisant asm.js, ce code peut s'exécuter plus rapidement lorsqu'il fait des calculs. En utilisant l'assembly Web, ce code sera plus compact et le navigateur pourra le traiter plus rapidement (car il pourra ignorer l'analyse). Vous n'aurez pas de nouveau plugin à charger comme DirectX, JavaApplets, Flash ou Silverlight car tout fonctionnera dans le sandbox JS.

Cristian V
la source
5
Ignorer l'analyse? Ralentissez, là. Le support matériel est hors de la carte dans un avenir prévisible. Ce que vous voulez dire, c'est que l'analyse est devenue le goulot d'étranglement avec asm.js, et wasm corrige cela avec un format binaire efficace. Votre justification pour asm.js / wasm semble un peu minimaliste, mais ce n'est pas grave. Accessoires pour signaler le bytecode! = AST.
tne le
4
@Cristian, WASM n'est pas un format binaire pour JS. Il utilisera les mêmes API Web que JS, mais il est beaucoup plus portable et généralisé que JS. Les seuls formats binaires pour JS, ou bytecodes, sont ceux implémentés dans les navigateurs, comme Firefox ici: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast
20

Le code asm.js est-il compilé à temps et exécuté? Compilé en quoi?

Différents navigateurs compilent le code asm.js de différentes manières. Depuis août 2015:

  • Firefox compile asm.js en code machine (et met en cache le code machine pour les futurs chargements du même asm.js) [ 1 ].
  • Dans Windows 10 en tant qu'indicateur expérimental, Edge effectuera également une validation anticipée et une compilation de asm.js [ 2 ].
  • Chrome reconnaît spécialement la directive "use asm" au début de asm.js pour analyser et analyser le code avec plus d'empressement et peaufiner l'heuristique de compilation.
  • Safari n'effectue aucun traitement spécial de asm.js.

A part asm.js étant du texte et wasm (web assembly) étant binaire, quelles sont les différences entre les 2?

asm.js est juste du JavaScript et doit donc se comporter exactement selon les spécifications JavaScript. En tant que nouveau standard, WebAssembly est capable de résoudre certains cas de coin où le comportement JavaScript n'est pas idéal (du point de vue des performances ou de la compilation) [ 3 ]. Dans le futur [ 4 ], WebAssembly pourra ajouter des fonctionnalités qui seraient autrement difficiles à exprimer en JavaScript.

Qu'est-ce que cela signifie pour les autres langages de script, exécutés dans le navigateur? Prenons python par exemple, est-ce que ça va être

  • code python compilé en wasm? ou
  • interpréteur python (Cpython) compilé dans wasm et interpréter python?

Dans la v.1, le moyen le plus simple d'exécuter Python dans un navigateur sera de compiler un interpréteur Python vers wasm, comme vous l'avez dit. Cela signifie, par exemple, que le GC Python fonctionne en code wasm et gère manuellement la mémoire linéaire wasm. Il y a déjà eu un projet expérimental pour ajouter un backend asm.js à PyPy [ 5 ] (qui pourrait tout aussi bien fonctionner pour wasm). Il se heurte actuellement à des limitations de asm.js qui pourraient être résolues par la future fonctionnalité de liaison dynamique de wasm. Pour aller plus loin, wasm cherche à fournir à la fois une intégration GC et un support de compilation JIT, ce qui permettrait une intégration plus efficace et naturelle avec la plate-forme Web.

Luke
la source