Obtenir un moteur de jeu C ++ fonctionnant en JavaScript, en
utilisant WebGL pour le rendu, est un exploit massif et est largement due
à la chaîne d'outils que Mozilla a développé pour rendre tout cela
possible.
Depuis la sortie d'Unreal Engine 3 pour Asm.js, de nombreuses
personnes ont voulu découvrir de quoi il s'agissait réellement. Dans ce
document, je vais essayer d'être le plus bref prossible pour répondre aux
questions des développeurs de jeux, qui utilisent, sans le savoir parfois,
ce langage intermédiaire, pour la compilation de leur plateforme en
WebGL.
Jusqu'à l'heure, JavaScript était le langage incontournable et très
populaire pour le Web. Cela dit, ce langage souffre de quelques soucis de
performance par rapport aux langages de développement d'applications
natives.
Pour palier à cela, un sous-ensemble de JavaScript est né :
asm.js.
Pour comprendre asm.js et où il s'insère dans le navigateur, vous
devez savoir d'où il vient et pourquoi donc il existe ?
Asm.js vient, comme dit dans l'introduction, d'une nouvelle
catégorie d'application JavaScript. Cette dernière est conçu par les
applications C/C++ qui ont été compilées en JS. Ce tout nouveau genre
d'application à été généré par le projet Emscripten de Mozilla.
Emscripten prend le code C / C ++, le transmet par LLVM et convertit
le bytecode généré par LLVM en JavaScript et donc en particulier Asm.js,
un sous-ensemble de JavaScript.
Si le code Asm.js compilé effectue un rendu, il est probablement
manipulé par WebGL. De cette façon, l'ensemble du pipeline utilise
techniquement JavaScript et le navigateur, mais il contourne presque
totalement l'exécution réelle et normale du code et le chemin de rendu que
JavaScript-in-a-webpage prend.
Asm.js est un sous-ensemble de JavaScript qui est fortement
restreint dans ce qu'il peut faire et comment il peut fonctionner. Cela
est fait de sorte que le code compilé Asm.js peut exécuter aussi
rapidement que possible en faisant autant d'hypothèses qu'il peut, car la
conversion du code Asm.js se fait directement dans l'assemblage. Il est
important de noter que Asm.js est juste JavaScript - il n'y a pas de
plugin de navigateur spécial ou fonctionnalité nécessaire pour le faire
fonctionner (bien qu'un navigateur qui est capable de détecter et
d'optimiser le code Asm.js sera certainement plus rapide). C'est un
sous-ensemble spécialisé de JavaScript optimisé pour les performances, en
particulier pour ce cas d'utilisation d'applications compilées en
JavaScript.
La grande utilité d'asm.js est la performance. Bien que celle-ci
soit aussi dû avoir votre navigateur et à votre strucure matériel,
l'asm.js est compilé de façons à être 4 à 10 fois plus rapides que les
dernières versions Firefox et Chrome.
Initialement le code compilé en JS était 10 fois plus lent que du
code natif. Mozilla est arrivé a des performances extrèmes qui montre le
potentiel de compilé en Asm.Js Cela montre donc, qu'il y aura surement des
améliorations de performances encore plus grandes dans les prochaines
années.
Il convient de noter que presque toutes les applications qui ciblent
Asm.js en ce moment sont des applications C / C ++ compilées à Asm.js en
utilisant Emscripten. Dans cet esprit, le type d'applications qui vont
cibler Asm.js, dans un proche avenir, sont celles qui bénéficieront de la
portabilité de l'exécution dans un navigateur, mais qui ont un niveau de
complexité dans lequel une connexion direct à JavaScript est impossible.
Jusqu'à présent, la plupart des cas d'utilisation se sont centrés autour
de bases de code où la performance est de la plus haute importance: comme
dans les jeux en cours d'exécution, les graphismes, les interprètes de
langage de programmation et les bibliothèques.
Comme mentionné précédemment, la version actuelle de Firefox est
actuellement le seul navigateur qui supporte l'optimisation du code
Asm.js. Cependant, il est important de souligner que Asm.js-formaté à
partir de code JavaScript est encore justeu du code JavaScript, mais avec
un ensemble important de restrictions. C'est pour cette raison que le code
Asm.js- compilé peut encore s'exécuter dans d'autres navigateurs comme le
code JavaScript normal, même si ce navigateur ne le prend pas en charge.
L'inconvéniant a cela, est la performance de ce code: Si un
navigateur ne prend pas en charge les tableaux tapés ou ne compile pas
spécialement le code Asm.js, la performance va être bien pire. Bien sûr,
ce n'est pas spécial pour Asm.js, probablement tout navigateur qui n'a pas
ces fonctionnalités souffre également d'autres manières.
Comme vous pouvez probablement le voir à partir du code ci-dessus
Asm.js n'est pas conçu pour être écrit à la main. Il va exiger une sorte
d'outillage pour être écrire et il va exiger des changements plutôt
drastiques dans la façon dont serait normalement écrit en JavaScript. Le
cas d'utilisation le plus courant pour Asm.js en ce moment est dans les
applications C / C ++ se compilant en JavaScript.
Presque aucune de ces applications interagissent avec le DOM d'une
manière significative, au-delà d'utiliser WebGL. Pour qu'il soit
utilisable par les développeurs réguliers, il va y avoir des langages
intermédiaires qui sont plus accessibles aux utilisateurs qui peuvent
compiler en Asm.js. Le meilleur candidat, à l'heure actuelle, est LLJS
dans lequel le travail commence à faire la compilation en Asm.js. Il
convient de noter qu'un langage comme LLJS va encore être très différente
de JavaScript et sera probablement perturbant pour beaucoup d'utilisateurs
JavaScript. Même avec un langage agréable plus accessible à l'utilisateur
comme LLJS, il est probable qu'il ne sera toujours utilisé que par les
développeurs les plus hardcore qui veulent optimiser des morceaux de code
extrêmement complexes.