WebAssemblyとは?
- WebAssemblyは、Webブラウザ上で信頼できないクライアント側コードをほぼネイティブ速度で実行するために設計された、標準化された命令セットおよびバイトコード形式である。
- EmscriptenはC/C++からJavaScriptへのコンパイラとして発展し、当初はLLVM IRをJavaScriptに変換することで、Web上でCおよびC++コードを実行できるようにしていた。
- 時間が経つにつれ、ブラウザ開発者たちはEmscriptenプロジェクトと協力して、性能最適化のためのJavaScriptの単純なサブセットを作り上げ、これはasm.jsとして標準化された。
- その後、JavaScriptのオーバーヘッドを避けるために独立したバイトコード形式が設計され、これがWasmである。
- 最近では、WebAssemblyはブラウザ外でも人気を集めており、FastlyとShopifyはWebAssemblyエンジンを基盤としてEdge ComputeやFunctions製品を構築している。
- WebAssemblyは、さまざまなソース言語からターゲットにできるという特性により、プラグインエコシステムを構築するうえで魅力的なプラットフォームである。
なぜWebAssemblyインタプリタなのか?
- 多くのソフトウェアエンジニアと同じように、新しいサイドプロジェクトを始めては数週間後に興味を失うというパターンにはまっていた。
- 継続的に努力を注げる大きなプロジェクトが必要であり、それによってコンピューティングスタックの低レイヤーに触れられるようにしたかった。
- WebAssemblyの盛り上がりに関心を持つようになり、カスタムシステムコールを設計できるプラットフォームエンジニアリングのツールとして魅力的に見えた。
Semblance
- WebAssembly Core Specificationに慣れるため、WebAssemblyインタプリタを書くことにした。
- このプロジェクトの目的は学習だったため、すべてのopcodeを実装したり、コアテストスイートに合格したりするつもりはなかった。
- "Hello, World!" を実行できれば満足だった。
結果
- このプロジェクトは大きな成功だったと考えている。opcodeのカバレッジは完全ではないが、簡単な "Hello, World!" プログラムを実行できる。
- コードは散らかっていて遅く、メモリリークもあり、悪意のあるモジュールに対して脆弱かもしれないが、それでも動作する。
- WebAssemblyのコア仕様について多くを学び、エンジニアとしての自分のコンフォートゾーンから抜け出すことができた。
- 今では、Wasmtimeのような産業向けランタイムに貢献できるだけのWebAssemblyの知識を得られたと感じている。
1件のコメント
Hacker Newsのコメント
WasmインタープリタをSchemeで書いたことがあるので、ほかの人が自分で書いているのを見るのはうれしい。Wasmは思ったほど難しくなく、すべての命令を実装しなくても、楽しめる範囲だけ試してみることを勧めたい
初心者の質問:
WASMの直接解釈に関する興味深い記事を見つけた
興味深いアプローチで、素晴らしい仕事
Wasm-C-APIを標準インターフェースとして採用するのは良いアイデアだったと思う
議論の余地がある点:
Orcaを見てみることを勧める。貢献できる良い機会になるはず: https://orca-app.dev
WebAssemblyを深く掘り下げ、インタープリタをゼロから構築する過程を見るのは本当にすごい
素晴らしい記事で、WASM実装に戻りたくなる動機を与えてくれる
本当に素晴らしい仕事