Mozillaは、WebブラウザでPythonインタプリタや数値計算ライブラリのNumPyなど、Pythonの標準的なデータサイエンス環境をほぼそのまま実行可能にする「Pyodide」（パイオダイドと発音されているようです）を開発中です。

Mozilla Hacksのブログに投稿された記事「Pyodide: Bringing the scientific Python stack to the browser」で、このPyodideの詳細と現状が報告されています。

Pyodideは、データサイエンス環境をWebブラウザ上で実現しようというMozillaのプロジェクト「Iodide（アイオダイド、と発音されているようです）の関連プロジェクト。

Pyodideの最大の特徴は、標準のPythonインタプリタのフル機能をWebブラウザ上で実現しようとしている点にあります。下記はブログから。

Pyodide gives you a full, standard Python interpreter that runs entirely in the browser, with full access to the browser’s Web APIs. Pyodideはフル機能の標準Pythonインタプリタをブラウザ上で提供し、Web APIへのフルアクセスも実現する。

つまりWebブラウザ上でPython言語およびデータサイエンス関連のPythonライブラリ、例えばNumPy、Pandas、Scipy、Matplotlibなどをそのまま使ってプログラミングできて、さらにWebGLのような高速なグラフィック描画なども呼び出せるようにする、というわけです。

上記のWebページに表示されているグラフィックは、実際にPyodide環境上のPythonで計算された3DモデルをWebGLでアニメーションとして表示したものをGIFアニメで再現したもの。クリックしてぜひ実際のWebページをご覧ください。

CPythonインタプリタをWebAssemblyへコンパイル

これまでWebブラウザ上でPythonインタプリタを実現しようとさまざまな試みが行われてきましたが、いずれも課題を抱えているとMozillaは指摘します。

例えばPythonをJavaScriptへトランスパイルする「 Transcrypt」、PythonインタプリタをJavaScriptで実装しようとする「Brython」「Skulpt」、PyPyをEmscriptenを用いたJITコンパイルで実行しようとした「PyPyJs」など。

Emscriptenとは、C/C++のプログラムからWebAssemblyの生成に使えるコンパイラです。Pyodideは、このEmscripten用のPythonインタプリタを基盤としていると説明されています。

After a discussion with some of Mozilla’s WebAssembly wizards, we saw that the key to building this was emscripten and WebAssembly: technologies to port existing code written in C to the browser. That led to the discovery of an existing but dormant build of Python for emscripten, cpython-emscripten, which was ultimately used as the basis for Pyodide. 何人かのMozillaにいるWebAssemblyウィザードらと議論した結果、私たちはこれを実現するカギはEmscriptenとWebAssembly、つまりCで書かれた既存のコードをブラウザに移植する技術であると考えました。その結果、既存の、しかし休止中であったEmscripten用のPythonのビルドであるcpython-emscriptenの発見につながり、これが最終的にPyodideの基盤となったのです。

CPythonのソースコードに最小限の変更を行いEmscriptenでWebAssemblyへコンパイルしているため、標準のPythonインタプリタがWebブラウザ上で実現されると。さらにNumPy、Scipy、Matplotlib、Pnadasなどのライブラリもバンドルしているようです。

ただし、LinuxなどのOS上で実行されるPython環境と異なり、Webブラウザ環境ではファイルシステムなどへはアクセスできないなどの相違点はあります。

OS環境と同様の機能をWASIで実現へ

こうしたOS環境とWebブラウザ環境の違いを埋めようとしているのが、Mozillaが現在中心となって策定しようとしている標準仕様の「WASI」（WebAssembly System Interface）です。

参考：WebAssemblyをWebブラウザ以外の実行環境へ。システムインターフェイスへのアクセスを可能にする「WASI」の策定開始。Mozillaが呼びかけNode.jsらが賛同

WASIが具体的に目指しているのは、WebAssemblyにファイルやネットワーク、メモリなどのシステムリソースへ安全にアクセス可能にするAPIの標準仕様を備えること。これによってWebブラウザ上で実行されるWebAssemblyのアプリケーションからこれらのリソースへアクセス可能になるのです。

WASIは最初から必要なAPIをすべて策定するのではなく、モジュール形式で拡張していく方針をとると説明されています。まず最初に策定されるwasi-coreは、POSIXの基本的な要素にならってファイル、ネットワーク接続、クロック、ランダム番号などが含まれる予定。

その後、非同期I/O、ファイルウォッチ、ファイルロックなどの策定へと進む見通しとされています。

またスレッド機能もWebAssemblyでの実装も一部で始まっており、将来的にはこれも取り込んでいくことになるだろうと説明されています。

将来こうした仕様や実装が揃えば、現在OS上で利用しているさまざまな機能がWebブラウザで実行されているWebAssemblyアプリケーションからも利用可能になります。Pyodideもその恩恵を受けることになるわけです。