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


21

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

ここに画像の説明を入力してください

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

しかし、どのようにしてC ++で作成し、LLVMコードに変換し、emscripten / asm.jsでいくつかのトリックを行うことができますか?私はそれについてのチュートリアルを見つけていません。

そして、C ++でコードを作成する場合、たとえばXMLHttpRequest、WebSockets、CanvasまたはWebGLなどのjs API-sを使用する方法は?


3
あなたの研究を共有することは皆に役立ちます。試したことと、それがニーズに合わなかった理由を教えてください。これは、あなたが時間をかけて自分自身を助けようとしていること、明白な答えを繰り返すことから私たちを救うこと、そして何よりもあなたがより具体的で関連性のある答えを得ることを助けることを示しています。参照してください掲載する方法
GNAT

このサードパーティのチュートリアルは、これらの質問のいくつかに対処しているようです:devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

回答:


36

asm.jsの理解に誤りがあると思います。

まず、FAQから

Q. asm.jsは新しい言語ですか?
A.いいえ、JavaScript(の一部)にすぎません。

そして、あなたは説明を追加することを求めました

しかし、C ++で1つの[asm.jsアプリケーション]を作成する方法はありますか

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

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

この画像から開始:
C ++ => clang / LLVM => emscripten => JSエンジン

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を必要とする新しいアプリケーションを作成する場合、C ++で作成してからJavaScriptに移植しようとするのではなく、JSでアプリケーションを作成する必要があります。

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に変換します。しかし、理解しやすいので、これをターゲットと呼びます。


ASM.jsは、C / C ++のコンパイルターゲットです。だから、何あなたは、C ++でasm.jsあなたのコンパイルC ++ asm.jsに書き込みを行っていないではない
カルバン

最初から始めたアプリケーションについては、1つだけ言及します。ゲームの場合、C ++でコードを保持すると、複数のプラットフォームに展開するのに役立ちます。
Vlad Nicula

6

はい、emscriptenを使用してC ++コードを記述し、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

4
これは実際にはCコードです。C ++コンパイラは、約2〜3桁複雑です。幸いなことに、emscriptenはLLVMをコンパイルすることでその困難な問題を回避します。既存のC ++からLLVMへのコンパイラがあります。
MSalters

3
@MSalters:有効なC ++コードでもあります。想像してみろ!うわー!
トーマスエディング14

@ThomasEding:ポイントを逃しました。サポートする言語が小さいほど、その言語をコンパイルするのが簡単になります。CとC ++の共通部分は、必然的にこれら2つのいずれかより大きくありません。
MSalters 14

このコードが純粋なC ++であり、Cコンパイラが処理しないと仮定すると、使用はemcc有効でしょうか?
ハムザウアガド

@HamzaOuaghad-はい。c ++のcoutクラスと文字列クラスを使用した単純なhello worldは、このemccコマンドラインで問題なく機能します。バージョン1.35.0を使用します。
オリオンelenzil 16年

0

最も簡単な方法は、WCPPを使用することです。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リポジトリを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.