web-dev-qa-db-ja.com

asm.jsを使用してブラウザーでC ++コードを実行する方法

Asm.jsアプリケーションは非常に高速です(ネイティブC++の速度に近い):

enter image description here

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

しかし、どのようにC++で記述し、それをLLVMコードに変換して、emscripten/asm.jsでトリックを行うことができるのでしょうか。それに関するチュートリアルは見つかりませんでした。

また、コードをC++で記述した場合、JSAPI-s(XMLHttpRequest、WebSockets、Canvas、WebGLなど)の使用方法を教えてください。

21
LO kaka

asm.js の理解が間違っていると思います。

まず、 the FAQ から

Q. asm.jsは新しい言語ですか?
A。いいえ、それは単なるJavaScript(のサブセット)です。

そしてあなたは尋ねました 説明を追加 :

しかし、どのようにして1つの[asm.jsアプリケーション]をC++で作成することができますか

「asm.jsアプリケーション」ではなく、asm.jsがターゲットです。1 C++コードをコンパイルします。

この John Resigによる記事 は、asm.jsがどのように使用されるかをよりよく説明できる多くの詳細を提供します。

この画像から:
C++ => clang / LLVM => emscripten => JS engine

asm.jsが emscripten の翻訳ターゲットであることがわかります。 Emscriptenは [〜#〜] llvm [〜#〜] バイトコードのJavaScriptへの変換を処理し、asm.jsはJavaScriptのサブセットです。 asm.jsの制限されたJavaScriptサブセット内に留まることで、コードを最適化してより高速に実行できます。

あなたも尋ねました:

そして、コードをC++で書く場合、js API-sの使用方法

繰り返しますが、あなたは要点を見逃しているようです。 Asm.jsは、既存のC/C++アプリケーションをJavaScriptに移植して、ブラウザー内で実行できるようにします。通常、C/C++コード内でJS APIを使用することはできません。また、それを可能にするasm.jsに魔法のようなものはありません。

JS APIを必要とする新しいアプリケーションを作成する場合は、アプリケーションをJSで記述し、C++で記述してJavaScriptに移植しようとするのはやめましょう。

Resigの記事に戻ると、質問には2つの重要な引用があります。

asm.jsをターゲットとするアプリケーションの種類は、近い将来、ブラウザーで実行することによる移植性の恩恵を受けるが、JavaScriptへの直接ポートが実行不可能なレベルの複雑さを持つアプリケーションです。

そして

上記のコードからおそらくわかるように、Asm.jsは手動で作成するようには設計されていません。 ...現在Asm.jsの最も一般的な使用例は、C/C++からJavaScriptに準拠したアプリケーションです。これらのアプリケーションのほとんどは、WebGLなどを使用する以外に、有意義な方法でDOMと対話しません。

代わりに検討したいのは、JavaScriptにコンパイルしたC++を呼び出すとともに、必要なJS APIを呼び出すJavaScriptプログラムを用意することです。 JavaScriptからC++コードを呼び出す方法については、 このemscriptenチュートリアル を参照してください。


追加の調査については、 emscriptenにチュートリアルがあります これは、C++コードを取得してLLVMで実行し、asm.jsをターゲットにする方法を理解するのに役立つ場合があります。

1厳密に言えば、それは真実ではありません。 C/C++コードは、コンパイル先を認識していないため、asm.jsをターゲットと呼ぶことはできません。別のツール(emscripten)はLLVM出力を受け取り、asm.js準拠のJavaScriptに変換します。しかし、理解しやすいので、これをターゲットと呼びます。

36
user53019

はい、C++コードを記述して、emscriptenを使用してasm.jsにコンパイルできます。私は自分で試したことがありませんし、これがプライムタイムにどれだけ準備ができているかはわかりません。たくさんのゲームを実行するのに十分なようです。

これがチュートリアルです: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html 。チュートリアルを見ると、C++コードをコンパイルするのは非常に簡単に思えます。

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

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

最も簡単な方法は、 [〜#〜] wcpp [〜#〜] を使用することです。これは、C++をほぼ直接Nodeプロジェクト。

私たちのC++

// addTwo.cpp 

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

ターミナル(C++をコンパイルするため)

$ wcpp

JavaScript

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

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

詳細については、 NPMパッケージ または Git Repo を参照してください

0
Brandon Dyer