Firefox web browser - Faster, more secure & customizable |
Mozilla開発者ブログに「speak.js」に関する興味深い記事が掲載された。
「speak.js」はテキストの読み上げを実現するJavaScriptライブラリ。JavaScriptとHTML5のaudio機能のみを使って動作しており、ブラウザにおける汎用的な読み上げ機能として注目される。ご存じない方は、「speak.js」のデモを試すと理解しやすい。現段階でこのデモが正しく動作するのはFirefoxだけなので、実行する場合にはFirefoxからアクセスする必要がある(Chromeでも動作するものの、ローディングに長い時間がかかる)。
「speak.js」が興味深いのは、フルスクラッチから開発されたライブラリではなく、C++で実装されたスピーチシンセサイザ「eSpeak」を移植したものだ、という点にある。
C++の「eSpeak」からJavaScriptの「speak.js」への変換には「Emscripten」が使われていると説明がある。「Emscripten」はLLVMのJavaScriptバックエンドだ。LLVMバイトコードをJavaScriptへコンパイルする機能を提供する。LLVMはこのように言語を超えた変換において要となるプロダクトとして機能しており、多種多様な言語の相互変換に活用されている。
なお、コードを変換しただけでは、eSpeakが使うopen()やread()/write()といったようなファイルシステムを操作する部分を回避できないが、ここはEmscriptenの提供する偽装ファイルシステムの機能を使って回避しているという。ファイルシステムへのアクセスがブラウザにおけるほかの処理に置き換えられている。
今回の事例で興味深いのは、LLVM変換を使って生成されたJavaScriptコードが実用的な速度でブラウザで実行されている点にある。C/C++と比較すればJavaScript版の実行速度は劣るが、それでも十分活用できるレベルに到達している。さらにブラウザのJavaScriptエンジンは高速化の取り組みが進められており、今後もユーザ体験の改善が期待できる。変換の要がLLVMであるため、C/C++以外の言語からも変換できるということであり、膨大な量の既存のソフトウェアがブラウザで動作するようになるかもしれないという可能性がある。
C/C++をLLVMで変換してブラウザで実行するという取り組みは、2008年にAdobe Labsに登場した「Adobe Alchemy」がすでに同じことを実施している。最近AdobeはAIRで開発したアプリをiOSで実行できるようにしたが、この部分にもLLVMが活用されており、LLVMが重要な技術として認識されていることがわかる。
こうした取り組みと逆の方向性となるのがGoogleがChrome 14から実現させようとしている「ネイティブクライアント」。ネイティブクライアントはC/C++でコンパイルしたコードを直接ブラウザで実行可能にしようというもの。プラグインの枠組みを拡張して実現している。
一旦JavaScriptへコードを変換して実行するか、ダイレクトにC/C++バイナリを実行できるようにするか、といった違いはあるものの、Webアプリケーションで実現できるラインが高いところまできていることは間違いなく、今後ハイレベルなアプリケーションが登場することになるのではないかとみられる。