Wie kann man C ++ - Code mit asm.js im Browser ausführen?

21

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

Bildbeschreibung hier eingeben

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

Aber wie ist es möglich, eine in C ++ zu schreiben, sie in LLVM-Code umzuwandeln 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?

LO kaka
quelle
3
Das Teilen Ihrer Forschung hilft allen. Sagen Sie uns, was Sie versucht haben und warum es nicht Ihren Bedürfnissen entsprach. Dies zeigt, dass Sie sich die Zeit genommen haben, um sich selbst zu helfen, es erspart uns, offensichtliche Antworten zu wiederholen, und vor allem hilft es Ihnen, eine spezifischere und relevantere Antwort zu erhalten. Siehe auch Wie man fragt
Mücke
Diese Drittanbieter - Tutorial erscheint einige dieser Fragen zu beantworten: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Antworten:

36

Ich glaube , dass Sie in Ihrem Verständnis der irrt asm.js .

Zunächst einmal aus ihren FAQ

Frage: Ist asm.js eine neue Sprache?
A. Nein, es ist nur (eine Teilmenge von) JavaScript.

Und Sie baten um 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 Ziel 1 zum Kompilieren Ihres C ++ - Codes.

Dieser Artikel von John Resig enthält eine Reihe von Details, die möglicherweise die Verwendung von asm.js besser erläutern.

Mit diesem Bild beginnen:
C ++ => clang / LLVM => emscripten => JS-Engine

Sie können sehen, dass asm.js ein Übersetzungsziel von emscripten ist . Emscripten übersetzt den LLVM- Bytecode in JavaScript, und asm.js ist eine Teilmenge von JavaScript. Durch die Einhaltung der eingeschränkten JavaScript-Untermenge 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 die js API-s benutzt

Auch hier verpassen Sie den Punkt. Mit Asm.js können vorhandene C / C ++ - Anwendungen in JavaScript portiert und in einem Browser ausgeführt werden. Normalerweise können Sie in Ihrem C / C ++ - Code keine JS-APIs verwenden, und das lässt sich durch nichts Magisches an asm.js ändern.

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

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

Die Art von Anwendungen, die in naher Zukunft auf Asm.js abzielen werden, sind solche, die von der Portierbarkeit der Ausführung in einem Browser profitieren, jedoch 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 dazu gedacht, von Hand geschrieben zu werden. ... Der derzeit am häufigsten verwendete 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 erforderlichen JS-APIs aufruft und das C ++ aufruft, das Sie mit JavaScript kompiliert haben. In diesem emscripten-Tutorial erfahren Sie , wie Sie C ++ - Code aus JavaScript aufrufen.


Für zusätzliche Recherchen bietet emscripten ein Lernprogramm , mit dessen Hilfe Sie lernen können , wie Sie C ++ - Code verwenden, ihn über LLVM ausführen und dann asm.js als Ziel festlegen.

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

TehShrike
quelle
ASM.js ist ein Kompilierungsziel für C / C ++. Also nein, Sie schreiben kein C ++ in asm.js. Sie kompilieren C ++ in asm.js.
Calvin
Nur eine Erwähnung kommt für Anwendungen in Frage, die von Grund auf neu gestartet wurden. Bei Spielen kann es hilfreich sein, den Code in C ++ für die Bereitstellung auf mehreren Plattformen zu haben.
Vlad Nicula
6

Ja, Sie können C ++ - Code schreiben und mit emscripten in die Datei asm.js kompilieren. Ich habe es nicht selbst ausprobiert und bin mir nicht sicher, wie bereit es für die Prime Time 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 . Wenn man sich das Tutorial ansieht, scheint es ziemlich einfach, C ++ - Code zu kompilieren:

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

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html
jdm
quelle
4
Das ist eigentlich C-Code. Ein C ++ - Compiler ist etwa zwei oder drei Größenordnungen komplexer. Glücklicherweise vermeidet emscripten dieses schwierige Problem, indem es LLVM kompiliert, und es gibt einen vorhandenen C ++ - zu-LLVM-Compiler.
MSalters
3
@MSalters: Es ist auch gültiger C ++ - Code. Stell dir das vor! Wow!
Thomas Eding
@ThomasEding: Du hast den Punkt verpasst. Je kleiner die zu unterstützende Sprache ist, desto einfacher ist es, diese Sprache zu kompilieren. Der Schnittpunkt von C und C ++ ist notwendigerweise nicht größer als einer dieser beiden.
MSalters
Nehmen wir an, dass dieser Code reines C ++ war, dass ein C-Compiler nicht handhaben würde, wäre die Verwendung von emccgültig?
Hamza Ouaghad
@ HamzaOuaghad - ja. Eine einfache Hallo Welt mit C ++ 's Cout & String Klassen funktioniert gut mit dieser Emcc Kommandozeile. mit der Version 1.35.0.
Orion Elenzil
0

Am einfachsten ist 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

Brandon Dyer
quelle