web-dev-qa-db-fra.com

Comment exécuter du code C ++ dans le navigateur en utilisant asm.js?

Une application asm.js est très rapide (proche de la vitesse native C++):

enter image description here

http://kripken.github.io/mloc_emscripten_talk/micro4b.png

Mais comment est-il possible d'en écrire un en C++, de le convertir en code LLVM, puis de faire un tour avec emscripten/asm.js? Je n'ai trouvé aucun tutoriel à ce sujet.

Et si j'écris le code en C++, alors comment utiliser les API js, par exemple XMLHttpRequest, WebSockets, Canvas ou WebGL?

21
LO kaka

Je crois que vous vous trompez dans votre compréhension de asm.js .

Tout d'abord, à partir de leur FAQ

Q. asm.js est-il une nouvelle langue?
UNE. Non, c'est juste (un sous-ensemble de) JavaScript.

Et tu as demandé  clarification ajoutée  :

Mais comment est-il possible d'en écrire une [une application asm.js] en C++

Vous n'écrivez pas une "application asm.js", plutôt asm.js est une cible1 pour compiler votre code C++.

Cette article de John Resig fournit un certain nombre de détails qui pourraient mieux expliquer comment asm.js serait utilisé.

En commençant par cette image:
C++ => clang / LLVM => emscripten => JS engine

vous pouvez voir que asm.js est une cible de traduction de emscripten . Emscripten gère la traduction du bytecode LLVM en JavaScript, et asm.js est un sous-ensemble de JavaScript. Rester dans le sous-ensemble restreint de asm.js de JavaScript permet d'optimiser le code et de l'exécuter plus rapidement.

Vous avez également demandé:

Et si j'écris le code en C++, alors comment utiliser les API js

Encore une fois, vous manquez le point. Asm.js permet de porter des applications C/C++ existantes en JavaScript afin qu'elles puissent être exécutées dans un navigateur. Normalement, vous ne pourriez pas utiliser les API JS dans votre code C/C++, et il n'y a rien de magique dans asm.js pour permettre cela.

Si vous avez une nouvelle application à écrire qui a besoin d'API JS, vous devez écrire l'application en JS et non futz en essayant d'écrire en C++, puis de la porter en JavaScript.

Et pour revenir à l'article de Resig, il y a deux citations clés pour votre question:

le type d'applications qui cibleront Asm.js, dans un avenir proche, 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 un port direct vers JavaScript serait irréalisable

et

Comme vous pouvez probablement le voir dans le code ci-dessus, Asm.js n'est pas conçu pour être écrit à la main. ... Le cas d'utilisation le plus courant pour Asm.js est actuellement dans les applications conformes de C/C++ à JavaScript. Presque aucune de ces applications n'interagit avec le DOM de manière significative, au-delà de l'utilisation de WebGL et similaires.

Ce que vous voudrez peut-être envisager à la place, c'est d'avoir un programme JavaScript qui appelle les API JS dont vous avez besoin, ainsi que des appels au C++ que vous avez compilé en JavaScript. Jetez un oeil à ce tutoriel emscripten pour voir comment appeler le code C++ à partir de JavaScript.


Pour quelques recherches supplémentaires, emscripten a un tutoriel qui pourrait vous aider à comprendre comment prendre le code C++, l'exécuter via LLVM, puis cibler asm.js.

1Strictement parlant, ce n'est pas vrai. Le code C/C++ ne sait pas à quoi il va être compilé, donc je ne peux pas vraiment appeler asm.js une cible. Un autre outil (emscripten) prend la sortie LLVM puis traduit en JavaScript compatible asm.js. Mais je vais appeler cela un objectif car il est plus facile à comprendre.

36
user53019

Oui, vous pouvez écrire du code C++ et le compiler dans asm.js, en utilisant emscripten. Je ne l'ai pas essayé moi-même et je ne sais pas à quel point c'est prêt pour les heures de grande écoute. Il semble cependant être assez bon pour exécuter un tas de jeux.

Voici un tutoriel: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . En regardant le tutoriel, il semble assez facile de compiler du code C++:

// hello.cpp
#include<stdio.h>

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html
6
jdm

La façon la plus simple serait d'utiliser WCPP , un package qui vous permet d'importer C++ presque directement dans votre projet Node.

Notre C++

// addTwo.cpp 

export int addTwo(int a, int b) {
  return a + b;
}

Dans le terminal (pour compiler notre C++)

$ wcpp

Notre JavaScript

const ourModule = await require('wcpp')('./addTwo.cpp')

console.log(ourModule.addTwo(2, 3))

Pour plus d'informations, consultez NPM Package ou Git Repo

0
Brandon Dyer