it-swarm.com.de

Wie führe ich C ++ - Code im Browser mit asm.js aus?

Eine asm.js-Anwendung ist sehr schnell (nahezu native C++ - Geschwindigkeit):

enter image description here

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

Aber wie ist es möglich, einen in C++ zu schreiben, ihn in LLVM-Code zu konvertieren und dann einen Trick mit emscripten/asm.js zu machen? Ich habe kein Tutorial dazu gefunden.

Und wenn ich den Code in C++ schreibe, wie verwende ich dann die js-APIs, zum Beispiel XMLHttpRequest, WebSockets, Canvas oder WebGL?

21
LO kaka

Ich glaube, Sie irren sich in Ihrem Verständnis von asm.js .

Zunächst einmal von ihre FAQ

F. Ist asm.js eine neue Sprache?
EIN. Nein, es ist nur (eine Teilmenge von) JavaScript.

Und du hast gefragt  Klarstellung hinzugefügt  ::

Aber wie ist es möglich, eine [asm.js-Anwendung] in C++ zu schreiben?

Sie schreiben keine "asm.js-Anwendung", sondern asm.js ist ein Ziel1 um Ihren C++ - Code zu kompilieren.

Dieser Artikel von John Resig enthält eine Reihe von Details, die möglicherweise besser erklären, wie asm.js verwendet werden würde.

Beginnend mit diesem Bild:
C++ => clang / LLVM => emscripten => JS engine

sie können sehen, dass asm.js ein Übersetzungsziel von emscripten ist. Emscripten behandelt die Übersetzung des Bytecodes LLVM in JavaScript, und asm.js ist eine Teilmenge von JavaScript. Durch die Einhaltung der eingeschränkten JavaScript-Teilmenge von asm.js kann der Code optimiert und schneller ausgeführt werden.

Sie haben auch gefragt:

Und wenn ich den Code in C++ schreibe, wie man dann die js API-s verwendet

Auch hier verpassen Sie den Punkt. Mit Asm.js können vorhandene C/C++ - Anwendungen in JavaScript portiert werden, damit sie in einem Browser ausgeführt werden können. Normalerweise können Sie keine JS-APIs in Ihrem C/C++ - Code verwenden, und asm.js hat nichts Magisches, um dies zuzulassen.

Wenn Sie eine neue Anwendung zum Schreiben haben, die JS-APIs benötigt, sollten Sie die Anwendung in JS schreiben und sich nicht mit dem Versuch beschäftigen, in C++ zu schreiben und dann auf JavaScript zu portieren.

Und zurück zu Resigs Artikel, es gibt zwei wichtige Zitate für Ihre Frage:

die Art von Anwendungen, die in naher Zukunft auf Asm.js abzielen werden, sind diejenigen, die von der Portabilität der Ausführung in einem Browser profitieren, aber eine Komplexität aufweisen, bei der ein direkter Port auf JavaScript nicht möglich wäre

und

Wie Sie wahrscheinlich aus dem obigen Code ersehen können, ist Asm.js nicht dafür ausgelegt, von Hand geschrieben zu werden. ... Der derzeit häufigste Anwendungsfall für Asm.js sind Anwendungen, die von C/C++ bis JavaScript ausgeführt werden. Fast keine dieser Anwendungen interagiert auf sinnvolle Weise mit dem DOM, abgesehen von der Verwendung von WebGL und dergleichen.

Möglicherweise möchten Sie stattdessen ein JavaScript-Programm verwenden, das die benötigten JS-APIs aufruft und das C++ aufruft, das Sie mit JavaScript kompiliert haben. Schauen Sie sich dieses emscripten Tutorial an, um zu sehen, wie man C++ - Code aus JavaScript aufruft.


Für einige zusätzliche Nachforschungen emscripten hat ein Tutorial , das Ihnen helfen kann, zu verstehen, wie man C++ - Code nimmt, ihn über LLVM ausführt und dann asm.js als Ziel auswählt.

1Genau genommen stimmt das nicht. Der C/C++ - Code weiß nicht, wohin er kompiliert werden soll, daher kann ich asm.js nicht wirklich als Ziel bezeichnen. Ein anderes Tool (emscripten) nimmt die LLVM-Ausgabe und übersetzt sie dann in asm.js-kompatibles JavaScript. Aber ich werde es ein Ziel nennen, weil es leichter zu verstehen ist.

36
user53019

Ja, Sie können C++ - Code schreiben und mit emscripten in asm.js kompilieren. Ich habe es selbst nicht ausprobiert und bin mir nicht sicher, wie bereit dies für die Hauptsendezeit ist. Es scheint jedoch gut genug zu sein, um eine Reihe von Spielen zu spielen.

Hier ist ein Tutorial: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Im Tutorial scheint es recht einfach zu sein, C++ - Code zu kompilieren:

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

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

Am einfachsten wäre es, WCPP zu verwenden, ein Paket, mit dem Sie C++ fast direkt in Ihr Node - Projekt importieren können.

Unser C++

// addTwo.cpp 

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

Im Terminal (um unser C++ zu kompilieren)

$ wcpp

Unser JavaScript

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

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

Weitere Informationen finden Sie im NPM-Paket oder im Git Repo

0
Brandon Dyer