WebAssembly/WebAssemblyって何?
WebAssemblyのことを調べる
WebAssemblyのことを調べるとはいっても前身のasm.jsから気にしてはいたので、ザックリとは知っているつもりでいました。ザックリした理解ではJavaScriptは冗長的な設計でとっつきやすい反面、スピードがでないので大量の処理をやらせるのに時間や電力のコストが大きいので代替案が欲しいよねってってところがスタートだと思っています。企業や個人の広報用WebサイトではJavaScriptで必要十分なので、WEB屋さんが業務でWebAssemblyを必要とする機会はまだそんなにないのかもしれません。将来的にはJavaScriptほどとっつきやすくない部分を誰かが何とかしてくれて、みんな利用するかもしれないけど鬼に笑われそう。
WebAssemblyは確か中間表現となるバイトコードで構成された拡張子.wasmのファイルをWEB上で読み込んで使う、という利用形態になると思います。(おいおい試してみよう。)CPUの差を中間表現で埋めるのはJavaなんかと一緒ですかね。ついでに調べた感じでは、GPUを叩く場合はまた別のAPIが出来上がるみたいで、そっちはおあずけ状態みたいです。
WebAssemblyはJavaScriptと協調して動かすこともできるようなので、得意な分野をそれぞれが担当するというのが実際の使われ方であるようです。UIはjavaScript、数値計算はWebAssembly、みたいな感じでしょうか?気になるところでは「DOMの操作はどっちでやるのがいいのか?」みたいなジワジワとスピード改善が処理求められがちな処理はどうするんだろうという疑問があります。いろいろ試してみたい。
実際にプログラムを書くにあたって、WebAssemblyをカバーしている言語が複数あるので、どれを使うのがいいのか悩ましいところです。私はRustが面白そうなのでそこを入り口にするつもりですが、Goなんかの躍進も目覚ましそうです。KotlinなんかはAndroidアプリを書くのに使っている人も多くて入っていきやすそうにも見えますし、JavaScriptから派生したTypeScriptからさらに派生したWebAssembly用の言語なんてものも登場しているみたいですね。中間表現にさえ変換できればいいわけですから、言語はとっつきやすそうなものを選べばいいんだろうなと思います。JavaScriptみたいな動的型付け言語しか触ったことがない人には、少しだけ障害ができるかもしれませんが、そこを人間の手でやってあげることでコンピューターは大事な計算に専念できると思えば、やってみるかという気になるかもしれません。(最近の言語だとある程度、型を推定してくれるものもあるとのことですが、書く手間が省けるだけで、内部的にはどう動いているのか知らないと思わぬ挙動にあわてることになりそうなイメージがあります。)
Rustについて
Rustに関しては本を一冊読んだだけの付け焼刃な状態なので、WebAssemblyと一緒に学んでいくつもりです。C++に近そうなイメージなのですが、メモリの割り当てに起因するバグを抑えるために言語側からアプローチしてくれる、というのが特徴らしいです。具体的にはビルド時に安全性に問題がないかチェックが入るみたいですね。所有権とかいう新しい概念を導入したところに新規性があって、それがメモリリーク防止に大きく寄与しているとか。その上、C++と比較しても実行速度に遜色がないような設計になっているらしいので、本当だったら素晴らしい話ですね。C++に近いので過去のライブラリ遺産も引継ぎやすそうです。またクレートというライブラリみたいなものが急速に充実してきているとも聞きました。最近の開発スタイルだと目的にかなうモジュールやらAPIをまず探すっていうことも多そうで、開発者の数が自分の開発にもかなり影響を与えそうです。そういう意味でも人気が出てきているRustは良さそうに見えます。
とにかく、まずは動くものを作ってみましょう。