2GBの壁を突破:WebAssemblyにおける大規模ファイルの非同期I/O

2025-03-04
2GBの壁を突破:WebAssemblyにおける大規模ファイルの非同期I/O

筆者は以前、WebAssemblyでsetjmpを実装し、WASI libcの例外処理提案への依存を回避しました。しかし、この方法は2GB未満のファイルに制限されていました。この記事では、File APIとBlob型を利用して、大規模ファイルを処理するためのメモリベースのファイルシステムを作成する方法について説明しています。WebのI/Oは非同期である一方、システム言語は通常同期であるため、Asyncifyを使用してパラダイムを橋渡ししました。wasm-optの最適化に関する問題が発生しましたが、ダミーのwasm-optを作成することで解決しました。最終的に、volatile関数ポインタを巧みに使用することで、`asyncjmp_rt_start`関数に対するAsyncifyの誤った仮定を回避し、大規模ファイルの非同期処理を実現しました。

続きを読む
開発

PerlをWebAssemblyにコンパイルする:困難な道のり

2025-02-11
PerlをWebAssemblyにコンパイルする:困難な道のり

スタートアップを構築する中で、作者はクライアントサイドでのファイルメタデータ抽出という課題に直面しました。ExifToolは強力なツールですが、Perlベースであるため、様々なOSへの静的コンパイルとデプロイが困難でした。静的コンパイルを含む様々なアプローチを試行した結果、最終的にWebAssemblyを使用することにしました。この過程は、Perlのビルドシステム、Emscripten、WASIとの格闘、Perlソースコードの修正など、多くの困難に満ちていました。最終的に、作者はExifToolを実行できる自己完結型のWebAssembly版Perlを構築することに成功しましたが、この過程でWebAssemblyランタイムにおける例外処理のサポート不足が明らかになりました。

続きを読む
開発

WebAssemblyランタイムの制限を突破:ZeroPerlの非同期実装

2025-02-11
WebAssemblyランタイムの制限を突破:ZeroPerlの非同期実装

ほとんどのWebAssemblyランタイムでexnrefのサポートが不足しているためZeroPerlが使用できず、不満を感じていた著者は、文句を言う代わりに問題を解決することにしました。BinaryenのAsyncify機能を活用することで、setjmpの代替をスクラッチから実装し、libsetjmpの互換性の問題を回避しました。公式ライブラリを削除し、アセンブリコードを書き、wasm-optで最適化した後、ZeroPerlはWasmer、Wasmtime、その他のWebAssemblyランタイムで正常に動作するようになりました。このブレークスルーにより、完全にサンドボックス化され、自己完結型のPerl WebAssemblyモジュールが実現しました。

続きを読む
開発