Qu'est-ce que ASM.js et qu'est-ce que cela signifie pour tout le monde?

27

Je commence à entendre des rumeurs au sujet de ce projet appelé asm.js . Actuellement, leur site Web est horrible et déroutant. Voici ce que je sais de mes recherches sur le web.

  • Il s'agit d'un sous-ensemble de JavaScript qui peut être hautement optimisé. Je suppose, car cela évite les parties les plus dynamiques de la langue.
  • Les performances du code compilé en ASM.js s'exécutent à environ la moitié de la vitesse de C (pas léger).
  • L'intention est que les compilateurs fassent de leur langue cible ASM.js.
  • Firefox va être livré avec l'optimisation ASM.js intégrée.
  • Les équipes Mozilla et Unreal ont porté le moteur Unreal sur le Web avec lui et son fonctionnement dans une version de Firefox à des vitesses quasi natives.

Il ne semble pas y avoir aucune information concrète sur le web au sujet de ce que ce vraiment est ou l'utilité ou le but ultime. Est-ce que je peux compiler mes bases de code autrement côté serveur et le faire exécuter dans le navigateur à des vitesses proches de celles natives? Quelles sont les ramifications pour les développeurs?

Orties de Jarrod
la source

Réponses:

21

Vous avez déjà décrit ce qu'il est . L'utilisation est qu'il s'agit d'un langage de bas niveau qui fonctionne sur tous les navigateurs, est assez rapide dans la plupart et très rapide dans certains. Ce que vous en pensez est aussi ouvert que ce que vous faites avec n'importe quel autre langage de programmation.

Le cas d'utilisation auquel Mozilla semble le plus attaché est le suivant: Il existe déjà des moyens de compiler des langages avec des backends LLVM (principalement C et C ++) en JavaScript, via Emscripten. asm.js est très proche de ce que Emscripten émet déjà, ce qui permet au code Emscripten (qui est déjà incroyablement rapide sur les compilateurs JavaScript JIT d'aujourd'hui) de devenir encore plus rapide, ce qui contribue à l'objectif de portage des bases de code existantes sur le Web. Encore une fois, ce que vous utilisez exactement, c'est votre décision. Le portage de jeux est un cas d'utilisation (dans lequel Mozilla est apparemment activement impliqué), mais il existe d'innombrables choses écrites en C et C ++, dont beaucoup pourraient être utiles pour le site Web de quelqu'un. Certains que j'ai vus autour (plus certains de ma propre conception), sans aucune garantie de faisabilité:

  • Portage d'algorithmes à usage général (par exemple zlib, libjpeg, openssl, implémentations FFT) pour permettre à JavaScript / sites Web de faire plus, sans avoir à créer une nouvelle norme Web et en fonction des navigateurs individuels pour la mettre en œuvre.
  • Portage d'interprètes, afin que des langues autres que JavaScript puissent s'exécuter dans le navigateur, avec moins de surcharge et un effort de portage minimal.
  • Utiliser asm.js comme backend pour plus de compilateurs, en particulier ceux qui ne correspondent pas bien à JavaScript et qui n'ont pas besoin de la plupart de ses fonctionnalités et de ses frais généraux. Un exemple pourrait être un langage conçu pour un travail numérique rapide sans allocation de mémoire.
  • Utilisation de asm.js pour créer un JIT en JavaScript. Il peut implémenter n'importe quel langage - par exemple ActionScript .
  • Dans le même ordre d'idées, le portage de compilateurs JIT existants pour s'exécuter dans le navigateur (cf. interprètes de portage, avec une surcharge effectivement nulle sur JS). Cela n'est probablement possible que lorsque les compilateurs JIT sont générés automatiquement, comme avec PyPy.

la source
2
Voici une autre bonne explication: ejohn.org/blog/asmjs-javascript-compile-target
Jarrod Nettles
1
Voici une preuve de concept pour le portage d'un JIT vers asm.js. C'est un argument de vente unique, la plupart des plateformes émergentes ne sont pas compatibles avec JIT.
Tobu
Y a-t-il une explication quelque part de la façon dont asm.js prend en charge la compilation JIT? Je n'arrive pas à trouver d'informations à ce sujet. La plupart s'intéressent à la façon dont les implications en matière de sécurité sont gérées.
Roman Starkov
@romkyns Compilation JIT d'asm.js vers le code machine par les navigateurs, ou compilation JIT vers asm.js (par un programme JavaScript)? Pour le premier, au moins dans Firefox, les installations de génération de code machine des compilateurs JIT pur JS sont réutilisées. Comme asm.js ne peut appeler que JS, effectuer de l'arithmétique et lire / écrire un tableau de tas avec des vérifications d'index dans la plage, la sécurité est à peu près aussi bonne que la sécurité de l'exécution JS. Pour ce dernier, vous générez simplement le code source asm.js et laissez le navigateur l'exécuter, et il n'y a pas d'implications de sécurité supplémentaires au-delà de ce que j'ai mentionné précédemment.
(Je voulais dire ce dernier) Ooh bien sûr; en quelque sorte j'ai imaginé des compilateurs JIT émettant du code machine natif. Merci pour la clarification!
Roman Starkov
4

Imaginez ASM.js comme un grand ArrayBuffer binaire appelé un tas et un ensemble de modules JavaScript, qui commencent par une directive prologue: "use asm";et effectuent des opérations rapides de bas niveau sur des données binaires brutes, similaires aux langages d'assemblage. Ces modules pourraient être écrits à la main ou mieux compilés à partir du code LLVM par des scripts comme Emscripten. Leurs performances pourraient être améliorées grâce au moteur Mozilla OdinMonkey, mais elles sont rétrocompatibles avec la plupart des interpréteurs ECMAScript modernes.

ASM.js n'est pas limité aux jeux, vous pouvez même exécuter des applications Qt entières dans votre navigateur, comme celles-ci !

niutech
la source