WebAssemblyシリーズ(六)WebAssemblyの現在と未来


作者:Lin Clark编辑:ヒゲ大ハ
原文:huziketang.com/blog/posts/...英文原文:Where is WebAssembly now and what’s next?
転載は出典を明記して、原文のリンクと作者の情報を保留してください
本文はWebAssemblyシリーズに関する6番目の文章(本シリーズは全部で6つの文章)であり、本シリーズの終わりの文章でもある.前の文章を読んでいない場合は、まずここを読むことをお勧めします.WebAssemblyについて概念がない場合は、まずここ(中国語の文章)を読むことをお勧めします.
2017年2月28日、4つの主要ブラウザはWebAssemblyのMVPバージョンが完了したことを発表し、ブラウザが搭載できる安定したバージョンであることに合意した.
WebAssembly組織が計画しているすべての特徴を含んでいないブラウザに搭載できる安定したコアを提供し、WebAssemblyを安定的に動作させるための基本バージョンを提供します.
これで開発者はWebAssemblyコードを使用することができます.古いバージョンのブラウザでは、開発者はasm.jsはコードを下に互換化するasm.jsはJavaScriptのサブセットで、すべてのJSエンジンで使用できます.また、Emscriptenツールを使用すると、WebAssemblyまたはasmにアプリケーションをコンパイルできます.js.
最初のバージョンにもかかわらず、WebAssemblyはすでにその優位性を発揮しており、将来的には新しい特徴を絶えず改善し、溶け込むことで、WebAssemblyはより速くなります.
ブラウザでのWebAssemblyのパフォーマンスの向上
各ブラウザが独自のエンジンでWebAssemblyをサポートするようになるにつれて、速度の向上は自然になり、現在、各ブラウザメーカーが積極的に推進しています.
JavaScriptとWebAssemblyの間で呼び出される中間関数
現在、JSでWebAssemblyを呼び出す速度は、本来達成すべき速度よりも遅い.これは、真ん中に「トランポリン」が必要だからです.JITはWebAssemblyを直接処理することができないので、JITはまずWebAssembly関数をそれを知っている場所に送信します.この過程はエンジンの中で比較的遅い場所です.
本来、JITがWebAssembly関数を直接処理する方法を知っていれば、速度は100倍に向上します.
WebAssemblyモジュールに単一のタスクを渡す場合は、このオーバーヘッドを心配する必要はありません.1回の変換だけで、比較的速いからです.しかし、WebAssemblyとJavaScriptを頻繁に切り替える場合は、このオーバーヘッドを考慮しなければなりません.
クイックロード
JITは、高速ロードと高速実行のバランスをとる必要があります.コンパイルと最適化の段階で多くの時間を費やした場合、実行は必然的に速くなりますが、起動は遅くなります.現在、プリコンパイル時間とプログラムの実際の実行時間のバランスをどのようにするかを検討している作業がたくさんあります.
WebAssemblyは変数タイプを最適化する必要がないので、エンジンは実行時の変数タイプにも関心がありません.これにより、コンパイルと実行の2つのプロセスを並列に実行できるなど、効率の向上により多くの可能性が得られます.
加えて、最新のJavaScript APIでは、WebAssemblyのストリームコンパイルが許可されており、バイトストリームがダウンロードされている間にコンパイルが開始されます.
FireFoxは現在、2つのコンパイラシステムを開発しています.1つのコンパイラが先に起動し、コードを部分的に最適化します.コードがすでに実行されている場合、2番目のコンパイラはバックグラウンドでコードをフル最適化し、フル最適化プロセスが完了すると、コードをフル最適化バージョンに置き換えて実行します.
WebAssembly規格に後続のプロパティを追加するプロセス
WebAssemblyの発展は,事前にすべてを設計するのではなく,小さなステップ反復方式を採用し,テストしながら開発することである.
これは多くの機能がまだおむつの中にあり、徹底的な思考と実際の検証を経ていないことを意味している.標準に書き込むには、すべてのブラウザメーカーの積極的な参加が必要です.
これらの特性は、将来の特性と呼ばれます.ここにいくつか挙げます.
ダイレクトオペレーションDOM
現在、WebAssemblyではDOMと直接対話する方法はありません.つまり、element.innerHTMLのような方法でノードを更新することはできません.
DOMを操作するには、JSを通らなければなりません.WebAssemblyでJavaScript関数を呼び出す必要があります(WebAssemblyモジュールでは、WebAssembly関数もJavaScript関数も導入できます).
いずれにしてもJSで実現しなければならないので、直接DOMにアクセスするよりもはるかに遅いので、将来必ず解決しなければならない問題です.
共有メモリの同時性
コードの実行速度を向上させる方法の1つは、コードを並列に実行することですが、異なるスレッドが同期するときにより多くの時間を費やす可能性があるため、逆効果になることもあります.
このとき,異なるスレッドでメモリを共有できれば,このオーバーヘッドを低減できる.この機能を実装WebAssemblyはJavaScriptのSharedArrayBufferを使用し、この機能の実装によりプログラムの実行効率が向上します.
SIMD(シングルコマンド、マルチデータ)
WebAssemblyに関する内容を知っていれば、SIMDを聞いたことがあるかもしれませんが、フルネームはSingle Instruction、Multiple Data(単一命令、マルチデータ)で、これは並列化のもう一つの方法です.
SIMDは大量のデータを格納するデータ構造を処理する上で独自の利点がある.例えば、多くの異なるデータを格納したvector(コンテナ)は、同じ命令で同時にコンテナの異なる部分を処理することができます.この方法はゲームやVRなどの複雑な計算の効率を大幅に向上させる.
これは一般的なウェブアプリケーション開発者にとって重要ではありませんが、マルチメディア、ゲーム開発者にとって非常に重要です.
例外処理
多くの言語はC++式の例外処理を模倣しているが,WebAssemblyには例外処理は含まれていない.
Emscriptenでコードをコンパイルすると、例外処理をシミュレートすることがわかりますが、このプロセスは非常に遅く、「DISABLE_EXCEPTION_CATCHING」マークで例外処理をオフにしたいほど遅いです.
異常処理がWebAssemblyに加わると,シミュレーションは不要となる.異常処理は開発者にとって特に重要であるため,これも将来の大きな機能点である.
その他の改良:開発者がより簡単に開発できるようにする
いくつかの将来の特性は、パフォーマンスではなく、開発者がWebAssemblyを開発するのに便利です.
  • 一流の開発者ツール.現在、ブラウザでWebAssemblyをデバッグすると、アセンブリをデバッグするように、自分のソースコードとアセンブリコードを手動で対応できる開発者は少ない.開発者がソースコードをデバッグするのに適したツールの開発に取り組んでいます.
  • ごみ回収.変数タイプを事前に決定できれば、TypeScriptコードなどのWebAssemblyにコードをコンパイルすることができます.しかし、現在の問題はWebAssemblyがゴミ回収を処理できないという問題で、WebAssemblyのメモリ操作は手動です.だからWebAssemblyは開発者が使いやすいように便利なGC機能を提供することを考えています.
  • ES 6モジュール統合.現在、ブラウザはscriptタグでJavaScriptモジュールをロードすることを徐々にサポートしています.この機能が完全に実行されると、のようなタグが され、ここでのurlはWebAssemblyモジュールに き えることができる.

  • まとめ
    WebAssemblyはより に され、ブラウザがWebAssemblyのさまざまな を にサポートするにつれて、WebAssemblyはより になります.
    は 『React.js 』を いています.React.jsが を っている 、ご を します.