61 votes

Est-il possible de convertir du code JavaScript classique en asm.js ou uniquement pour accélérer les langages de bas niveau statiques?

J'ai lu la question Comment faire pour tester et développer avec asm.js?, et l'on a accepté la réponse donne un lien vers http://kripken.github.com/mloc_emscripten_talk/#/.

La conclusion de ce diaporama est que "Statiquement typé langues et en particulier C/C++ peuvent être compilées de manière efficace, JavaScript", de sorte que l'on peut "s'attendre à la vitesse de compilation C/C++ pour obtenir juste 2X plus lent que le code natif, ou mieux, plus tard cette année".

Mais qu'en est non statiquement typé langues, telles que des JavaScript lui-même? Peut-il être compilé asm.js?

34voto

Bergi Points 104242

Peut JavaScript lui-même être compilé asm.js?

Pas vraiment, en raison de sa nature dynamique. C'est le même problème que lorsque j'essaie de le compiler en C ou même en code natif - vous vraiment besoin d'expédier une VM avec elle, de prendre soin de ceux non-aspects statiques. Au moins, telle une machine virtuelle est possible:

js.js est un interpréteur JavaScript dans le code JavaScript. Au lieu d'essayer de créer un interprète à partir de zéro, SpiderMonkey est compilé dans LLVM et puis emscripten se traduit par la sortie en JavaScript.

Mais si asmjs code est plus rapide que régulier de JS, alors il est logique de le compiler en JS pour asmjs, non?

Pas de. asm.js est un sous-ensemble restreint de JS qui peuvent être facilement convertis en bytecode. Pourtant, vous premier besoin de briser toutes les fonctionnalités avancées de JS pour ce sous-ensemble pour l'obtention de cet avantage - assez compliqué de l'omi. Mais JavaScript, les moteurs sont conçus et optimisés pour traduire toutes ces fonctionnalités avancées directement en bytecode - alors, pourquoi s'embêter à propos d'une étape intermédiaire comme asm.js? Js.js créances à environ 200 fois plus lent que "natif" de JS.

Et que dire de la non-statiquement typé langues en général?

Le diaporama parle que de ...Juste C/C++? partir de. Plus précisément:

Les Langages Dynamiques

Ensemble de C/C++ temps de fonctionnement peut être compilé et la langue d'origine interprété avec une bonne sémantique, mais ce n'est pas léger

Source-à-source compilateurs de ces langues à JavaScript ignorer des différences sémantiques (par exemple, les types numériques)

En fait, ces langues dépendent spécial VMs pour être efficace

Source-à-source compilateurs pour eux de perdre les optimisations effectuées dans ces machines virtuelles

11voto

abergmeier Points 2249

Quelques faits au sujet de asm.js, qui nous l'espérons rendre le concept plus clair:

  1. Oui, vous pouvez écrire à l' asm.js le dialecte à la main.

    Si vous n'avez regarder les exemples de asm.jsils sont très loin d'être convivial. Évidemment, le Javascript n'est pas l'extrémité avant de la langue pour la création de ce code.

  2. La traduction de vanille Javascript pour asm.js le dialecte est pas possible.

    Pensez - y, si vous avez déjà pu le traduire Javascript standard dans un statiquement manière, pourquoi y aurait-il un besoin pour asm.js? La seule existence de asm.js signifie que le Javascript JIT personnes à certaines personnes ont donné leur promesse que Javascript obtenir plus rapidement, sans aucun effort de la part du développeur.

    Il y a plusieurs raisons à cela, mais disons que ça serait vraiment dur pour l'équipe de comprendre un langage dynamique comme bon comme statique compilateur. Et puis, sans doute pour les développeurs afin de comprendre pleinement le JIT.

En fin de compte, ça revient à utiliser le bon outil pour la tâche. Si vous voulez statique, très performant d'un code, C / C++ ( / Java ) - si vous voulez un langage dynamique, l'utilisation de Javascript, Python, ...

3voto

luiseduardohd Points 47

asm.js a été créé par la nécessité de disposer d'un petit sous-ensemble de javascript qui peut être facilement optimisé. Si vous pouvez convertir le javascript en javascript / asm.js, asm.js n'est plus nécessaire, cette méthode peut être inséré dans les interprètes js directement.

1voto

CocoOS Points 523

cochez cette http://badassjs.com/post/43420901994/asm-js-a-low-level-highly-optimizable-subset-of

fondamentalement, vous devez vérifier que votre code serait asm.js compatible (pas de coercition ou de la conversion de type, vous avez besoin pour gérer la mémoire, etc). L'idée derrière cela est d'écrire votre code en javascript, de détecter le col de la bouteille et faire les changements dans votre code pour utiliser asm.js et aot compilation au lieu jit et la compilation dynamique...c'est un peu PITA, mais vous pouvez toujours utiliser javascript ou d'autres langages comme c++ ou mieux..dans un proche avenir, lljs.....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X