C 言語で書かれたソフトウェアが Flash で動くようになるかもしれない
Running C and Python Code on The Web によると、Adobe の Scott Petersen 氏が大変興味深いツールを開発中のようだ。このツールを使うと、C 言語で書かれたソフトウェアを Flash Player で実行できるようになる。また、このツールはオープンソースで公開されるとのこと。
LLVM, Tamarin
ソフトウェアを Flash Player で実行可能な形式に変換するためには、ソフトウェアのソースコードが必要になる。変換の手順は以下のとおり。
- C 言語で書かれたソースコードを llvm-gcc で LLVM のアセンブリにコンパイルする
- LLVM のアセンブリを ActionScript で実装した独自 VM 向けの命令群に変換する
ActionScript で実装された独自 VM は、Flash Player の Tamarin VM で実行される、というカラクリだ。
先進的な最適化を備えたバックエンドとして注目を集める LLVM プロジェクトだが、その成果物を、フロントエンドとして利用しているのが面白い(もちろん、LLVM アセンブリの段階でも、定数畳み込みやデッドコード削除といった従来の最適化は施されているはずなので、フロントエンドとしてのみ利点があるわけではない)。
Quake, Nintendo
もっとも、命令単位の変換はそれほど難しいものでもないし、実用的なアプリケーションが動作するのかどうか、気になるところだ。そこで、コンパイラだけではなく、インフラも整備されている。
- POSIX API
- Flash のマルチメディア機能を操作するためのライブラリ
- ネイティブのバイト配列など、Tamarin VM への機能追加
結果として、さまざまな種類のソフトウェアが、実用的な速度で動作するらしい。
Mozilla で行われたデモでは、Quake や、C 言語で書かれたエミュレータでゼルダが動いていた、しかも、ゲームは操作でき BGM も再現されていた、というのでなかなかのインパクトだ(ただ、2. のライブラリを使うために、ソースコードを書き換える必要があるんじゃないの? という疑問は湧くが…)。
ゲームだけではない。デモでは同様に、Lua, Ruby, Perl, そして Python といった LL 言語の処理系が動作していた、という。改めて書くが、これらはすべて、Flash Player 上での出来事だ。
Python, JavaScript, NestedVM
元記事ではこのあと、
- この技術が Python に与える影響をセキュリティ的観点、PyPy プロジェクトとの比較から考察
- ActionScript でも動くのなら、ブラウザの JavaScript でも動くんじゃない? という当然の飛躍
- まだ、不完全だけど Firefox の JavaScript エンジンには Tamarin VM が搭載されるしね
といった話題に移っていく[1]。
Adobe も LLVM を採用することを検討くらいはしているはずなので、これは LLVM 採用に向けた過渡的な実験の成果なのではないか、と個人的には思っている。
[1] なお、C 言語で書かれたソフトウェアを別言語の処理系で動かす、というテーマには NestedVM という先行事例がある。GCC の出力した MIPS コードを Java のバイトコードに変換することで、C や FORTRAN などで書かれたソフトウェアを Java VM で実行できるようにしている。