- JavaScriptをWebAssemblyにコンパイルするツールで、スタンドアロンのWASMバイナリを生成する点で porffor に類似。Rustで書かれている
- 実験的なツールであり、まだ本番利用の準備はできておらず、多くの言語機能や組み込み型が不足しているか不完全
- 目標は言語の100%サポートを達成すること
なぜ Jawsm なのか?
- Jawsmプロジェクトは、WebAssemblyシナリオを実行するストレステストツールである Crowst の作業中に始まった
- RustからWASMへコンパイルされたコードしかサポートしていないが、Rustは広く使われている言語ではない
- スクリプト言語をWASM上で実行するのは現在のところ理想的ではない。インタープリタを含める必要があるか、ターゲット言語の変種を使う必要がある
- 最新のWASM提案により、コンパイル済みインタープリタなしでJavaScript機能の100%実装が可能だと考えている
動作しているもの
- 言語の100%実装を目標としており、セマンティクスの実装に注力している
- 実装が難しい4つの項目: スコープ/クロージャ、try/catch、async/await、ジェネレータ
- 現在のJawsmは、クロージャを使ったコードのコンパイル、try/catch、制限付きの
Promise API と async を実装している
- 動作する機能: 変数宣言と代入、
while、文字列リテラル、数値と基本演算子、ブール値と基本的なブール演算子、配列リテラル、オブジェクトリテラル、new キーワード
ホスト要件
- Jawsmは最近のWASM提案を前提に構築されているため、生成されるバイナリはランタイム間での移植性が低い
- WASIp2を念頭に実装しており、V8を使ってWASIp2機能向けのJavaScriptポリフィルを使用している
- Jawsmが生成したバイナリを実行できるスクリプト
run.js がある
使い方
- 貢献しないのであれば使わないほうがよい
- リポジトリをクローンした後、
execute.sh スクリプトを使ってWATファイルを生成し、バイナリにコンパイルしてから Node.js で実行できる
- Rustの
cargo、最新版の wasm-tools、Node.js v23.0.0 以上が必要
次のステップ
- まず実装が難しい機能を完成させる計画で、次はジェネレータと
await キーワードのサポート
- スタック切り替え提案を使いたいが、現在はCPS変換を使って継続をシミュレートしている
- その後、構文や組み込み型、APIを実装する予定
仕組み
- このプロジェクトはJavaScript構文をWASM命令へ変換し、WASM GC、例外処理、末尾呼び出し最適化の提案を活用する
- JavaScriptのスコープとクロージャをWASM上でシミュレートするために、追加のWASMコードを書いている
1件のコメント
Hacker Newsの意見
新しい WASM GC 提案の巧妙な使い方だ。既存の JS -> WASM コンパイラは JS エンジン全体を含んでいたが、このプロジェクトは JS の構造を WASM の基本要素に直接マッピングしようとしている。
Rust を書くのは好きだが、広く使われている言語ではない。Rust は最近とても注目されていて、さまざまな場所で使われているように見える。
JavaScript 仕様の 100% をカバーできると確信している。アイデア、質問、あるいは批判を歓迎する。
プロジェクトの README.md を読んだが、想定されている使い方が何なのかよく分からない。生成された WASM コードがランタイムとどう相互作用するのか気になる。ブラウザやその他の WASM ランタイムと互換性のあるツールとして意図されているのか、それともこのプロジェクトに結び付いたランタイムでしか動かないのかが気になる。
「ブラウザランタイムなしで JS を実行」が近づいている。perforr、jaws、あるいは別のプロジェクトが最終的には成功するだろう。
文字列エンコーディングの不一致や関連ユーティリティをどう処理しているのか気になる。WASM は UTF-8 をサポートし、JS は(潜在的に不正な)UTF-16 をサポートする。
このアプローチはとても気に入っている。直接バイナリを生成しようとするのではなく、WASM 向けに直接ビルドすることで、WASM GC と WASI 0.3 の一部として期待されている非同期サポートに依存できるという意味になる。
これをコンパイラと呼ぶ人もいる。すばらしい仕事だ。
このコードが、JS で同じコードを実行するより速く動くのか、それとも他の言語との相互運用性のためのものなのか気になる。