読者です 読者をやめる 読者になる 読者になる

ムラサメ研究ブログ

主にゲームやプログラミングのログ

WebAssembly 調査!

WebAssembly

新年一発目は WebAssembly

今年(会社自体は6月はじまりなので 2016年度下期)に、会社の方針として C++アセンブラの高度な技術を一番の武器に活動することを決めました もちろん今までのようにゲームが主軸になると思いますが ゲーム&ビジネス限定せず 今まで以上にC++を頑張ろうとおもいます

そんな中で気になるものが WebAssembly

今までJavaScriptしか動かなかったブラウザにおいて、ネイティブに近いバイナリフォーマットが制定されたようです 一言でいうと とても速くなるらしいですが、ほかにも色々な似たテクノロジがあるので 簡単にまとめます。 間違ってる部分あったらごめん

最初のJavaScript

元来ブラウザは静的な表現しか出来なかったが、JavaScriptの登場により、動的に変更する事ができるようになった Mozillaが開発したが、すぐさま IESafariと追従し、後にGoogleChromeを作った際も対応していた 当初は 個人のホームページで遊び要素程度に思っていたが、ブラウザを使ったビジネスアプリやサービスが増え JavaScriptは主役になったが、インタプリタ実行のため非常に遅かった

Flash(ShockWave)

Adobe ブラウザ上でネイティブのように動くVMの先駆け 息が長くほとんどのブラウザでサポートされていたが、突然Macが対応を終了しHTML5

JavaApplet

Sun ブラウザ上で動くJavaVM

ActiveX

Microsoft。 他のブラウザが対応しなかったため IEの特定バージョンでしか動かない COMテクノロジ(.netの前身)VM上で動く

v8エンジン

GoogleJavaScriptを高速実行するためのエンジンを開発 JITコンパイルにより ロード時にネイティブコードに変換されるため 実行速度は非常に速い また サーバサイドにJavaScriptを使った node.jsも作られる

HTML5WebGL

HTMLが色々と見直され 色々と高速かつ便利になり、Flash等のVMが不要になった ブラウザ上で高速な描画が可能に。 OpenGLES2.0とほぼ同機能がJavaScriptで提供された。

ES6

JavaScriptは、小さなものを作るには楽だが、大規模開発には色々と問題がある 変数は基本的に全部グローバルであり、ネームスペースの概念がない オブジェクト指向に慣れている人には Classが存在しないのも使い勝手が悪い それらの問題を解決するために、JavaScriptの新しい規格が登場した しかも Babelなどを使い、ES5にトランスパイル可能なので 古いブラウザでも実行可能に

NaCl

Googleが作った。 LLVM技術を使い、Emscripten等で C++からブラウザ用のネイティブバイナリを作り、ブラウザ上でネイティブ実行される ネイティブなので当然とても速い ただし、対応していないブラウザでは実行することができない WebAssemblyと同じ思想のように思えるし、WebAssemblyよりも速いかもしれないが Chrome以外に搭載されず 消える運命に。

Asm.js

Mozilla製。 NaClに対抗して作られた 型情報付きのJavaScriptサブセット JITコンパイルにより劇的に高速になったJavaScriptだが、型情報がないためネイティブには全く歯が立たなかった。 型情報を追加することで、ネイティブのおよそ1.5倍程度の速度まで迫ることができた しかも 非対応ブラウザでも普通のJavaScriptとして動作する ただし、人間が手で書くには困難なため、C++等からEmscriptenを使い変換する

WebAssembly

GoogleMozillaMicrosoftApple が共同開発!! NaClに似た思想で、JavaScriptバイナリにする おそらく NaClと違い完全にネイティブコードにせず、中間言語にとどめ 各社ブラウザがJITコンパイル しやすくしている Asm.jsと同じく 型情報も持っている。ネイティブと比較し1.1~1,2倍程度らしい ここで勘違いしてはいけないのは、バイナリになったから実行速度が上がるわけではない事。 元々JITコンパイルされているので、JavaScriptは実行速度は速い 速くなるのは バイナリコードになりデータ量が少なくなったことと、中間言語なのでコンパイル時間が劇的に向上する事によるものである おそらく、ロード時以外はあまりAsm.jsと変わりがないと思われる 今現在は C++からLLVM経由でコンパイルする事しかできないが 順次色々な言語で対応される Rustが対応開始したらしい

まとめると

今まで色々とJavaScriptの高速化や ネイティブアプリの実行があったが、ブラウザ各社の足並みが揃わず終了したが WebAssemblyはほぼすべてのブラウザメーカーが共同開発しているため、期待がもてる JavaScriptはAsm.jsで 型付け可能になり十分高速化されたが 中間言語バイナリ化することで データロード速度、コンパイル速度が向上した 現在は C++からコンパイルする必要がある

現状出来る事

C++で出来ることはだいたい出来るようです STL、pthread、OpenGLSDL・・・ などなど

今後追加予定

共有メモリを使った高度なスレッド ゼロコスト 例外処理 fixed-width SIMD GC/DOM などなど 新機能が追加予定のようです

現状でも色々できそう

次はWindowsでビルド環境つくるぞ

今度記事かくけど、Macやめましたので Windows10で環境構築しようとおもいます

http://webassembly.org/getting-started/developers-guide/

The instructions on this page are applicable to Linux and Mac OS X systems. Similar instructions for Windows systems are forthcoming.

公式ページでは LinuxMacでの手順はあるが、Windowsは また今度ね! とのことだが おそらくWindowsでも問題ないので 挑戦する!