WebAssemblyとはなんぞや
きっかけ
しかし結局WebAssemblyとはなんぞや。
というところから始まるいつもの勉強
WebAssemblyとはなんぞや
WebAssemblyはJSの代替品、ということではありません。どちらかというと、JavaScriptを高速化・エンハンスするためのエンジンです。LLVMのバックエンドとしてWebAssemblyをはく、といったようなイメージですので、何かしらあたらいい言語が登場するということではないです。
LLVMとは?
LLVMは非常に優れていて、ハックしやすく、C言語やC++のような”ネイティブ”言語向けの、時代の先端を行くコンパイラです。
LLVMは素晴らしいコンパイラですが、コンパイラの研究をしていない人にとっては興味がないですよね。
コンパイラ基盤とは、プログラムを使って何かをする時に役立つものです。私の経験からすれば、大変大きな役割を果たします。プログラムを分析し、何らかの処理の頻度を調べたり、システムとの整合性を向上させるための変更を行ったりできます。また、新しいアーキテクチャやOSを仮想的に使用するための変更を行えるので、実際に新しいチップを組み入れ、カーネルモジュールを記述する必要もありません。多くの人が支持するツールよりも、大学院生にとってはコンパイラ基盤が適切なツールであると言えます。他に正当な理由がない限り、下記のようなツールをハックするのではなく、最初からLLVMを試してみることをお勧めします。
LLVMは、コンパイラを作成するための基盤です。2000年にChris Lattnerによって作成され、2003年にリリースされました。それ以来、LLVMリンカlldやLLVMデバッガlldbなど幅広いツール群を持つ包括的なプロジェクトに発展してきました。
ほうほう。だがそれがどうWebAssemblyと関わっているのかいまいちよくわからない。
コンパイルの手順
次のような流れでコンパイルします。
Cのコードをclangを用いてLLVM IRにコンパイル LLVM IRをアセンブリを経由してWebAssemblyのテキスト形式までコンパイル テキスト形式のWebAssemblyをバイナリにコンパイル この3つでそれぞれ使うものを順番に導入していきます。
他の言語で作ったcodeをweb assemblyの形式ににまで落としてあげればbrowserに投げてjsにinjectionできるという感じ?(ふわっとした理解
asm.jsはMozillaが研究開発したJavaScriptのサブセットで、2013年に発表されました。現在はFirefoxとGoogle Chromeによって実装が行われ、EdgeやSafariも対応を表明しています。その特徴はなんといっても動作の高速さです。
いろんな話を見る限りやはり動作の速さがpickupされているっぽい。
ただ一方で、JavaScriptはその名の通りスクリプト言語であり、処理の度に必要なソースをインタープリタに通したりコンパイルしたりするため、ゲームなどに不可欠なリアルタイム性は保証されていません。 このような背景で、「どのブラウザーでもプラグインなしで、高速かつ高度な処理ができる環境」というニーズが出てきました。そしてこれを解決してくれるのがWebAssemblyです。
前述のように、JavaScriptはスクリプト言語であり、インタープリタによる処理を必要とします。それに対してWebAssemblyは、C/C++で記述し、コンパイルされたものをブラウザーに送ります。コンパイル済みなので、(ほぼ)マシン語であり、ブラウザーは受け取ったらすぐに実行することができます。 これまで、「コンパイル済みの実行ファイル」は実行環境に大きく依存していました。たとえばiOS向けに作成したアプリをAndroidやWindowsで動かすことはできませんし、CPUのアーキテクチャが変わると動かないなんていうこともあります。FlashはWindowsやmacOSで実行できましたが、iOSには結局対応せずでした。 しかしWebAssembly向けにコンパイルされた実行ファイルは、OS等の環境に依存せず、ただブラウザーが対応していれば動かすことができます。理論上はAndroidやiOSのモバイルブラウザーでも実装でき、実際開発が進められているようです。
んー。ああ。そういう位置づけか。 browserがvm環境みたいになってきたな。chromiumosを思い出させる。あれは早すぎたんだ……。
まとめ
ここの資料を見てみるのが最初から一番わかりやすかった気がする。