2011年2月19日土曜日

Chromeはゆくゆく「Native Client」で脱Flashするつもりなのだろうか・・・

Webアプリとネイティブを結ぶ真の橋, GoogleのNative Clientがいよいよリリース間近 - Tech Crunch Japan

・・・Native Clientを使うとデベロッパは、ブラウザの中からネイティブコードを実行するWebアプリケーションを作れる。つまりブラウザが、従来からあるWebベースの言語、JavaScriptなどを実行できるだけでなく、CやC++で書かれたコードも実行できるようになる。・・・この新しいSDKは“Arctic Sea”と呼ばれ、Chrome 10以上を必要とする・・・

GoogleがNetscapeのPlugin API(NPAPI)の仕組みを応用して、ブラウザ内でプラグインなしでネイティブコード(C、C++)を実行できるようにするSDKを出したらしい。

ブラウザ内でネイティブコードを実行する方法としてはFlashのAlchemyがある。しかし、これはもちろん、Flashがインストールされている環境でしか実行できない。しかも自分が知る限り、ポーティングはかなり面倒で、必ずしも高速とは限らない。

このSDKがリリースされた背景にはそういった問題意識があるのだろうか。つまり、Googleはゆくゆくプラブインなしのブラウザ内で高速なネイティブコードを実行する環境を整えたい。ようするに、脱Flashを狙っているのかもしれない。ChromeはFlashを統合しているにも関わらず・・・

おもしろそうなので、とりあえず動かしてみることにした。

ここに書いてあるインストラクションに従う。
C Tutorial: Getting Started - Native Client SDK - Google Code

Chrome10が必要なので、BetaチャンネルのChromeをダウンロードしてインストールする。
Early Access Release Channels - The Chromium Projects

Chrome10を起動してアドレスフィールドで「about:flags」して「Native Client」機能を有効にする。


ここでSDKをダウンロードして適当な場所に展開。
Downloading the SDK - Native Client SDK - Google Code

コンソールで展開したSDKの「examples」フォルダに行き「python httpd.py 5103」としてポート5103でhttpサーバーを起動。

http://localhost:5103/に行くとサンプルアプリケーションのリストが出る。


ここでは「Sine Wave Synthesizer」を見てみる。


「Play」するとポーっとサイン波の音が鳴った。「440」は周波数で、これを変えると音程が変わった。この音の生成にネイティブコードを使っているらしい。

このサンプルのフォルダに行ってみると、こんな感じ。


まずHTMLを見ると、embedタグがみつかった。これでネイティブコードを埋め込んでいるらしい。

<embed name="nacl_module"
         id="sineSynth"
         width=0 height=0
         nacl="sine_synth.nmf"
         type="application/x-nacl"
         onload="moduleDidLoad();" />

ここで参照されている「sine_synth.nmf」の中身はテキストで、実際のバイナリはnexeという拡張子を持っているファイルらしい。

{
  "nexes": {
    "x86-64": "sine_synth_x86_64.nexe",
    "x86-32": "sine_synth_x86_32.nexe",
  }
}

で、バイナリコードのパラメータ操作には、HTMLのインターフェースとJavaScriptを使っている。

なるほど。確かに動いている。

きっとUI部分はHTML5で組んで、ビデオコーデック、サウンドコーデック、画像のエンコーダー・デコーダーなど高速な処理が必要なコア部分をネイティブコードで実装してJavaScript経由で利用するということなのだと思う。

ChromeはJavaScriptの実行エンジンの高速化に相当な力を入れているけれど、やはりそれでもネイティブコードの速度にはかなわないという結論なのかもしれない。

しかし、たったこれだけの事をするのにバイナリコードは1MB以上。これで実用になるのだろうか。さらに、この実行環境はオープンソースだとはいえ、今のところChromeにしかない。今後、他のブラウザに移植される可能性はどれくらいあるだろうか。この2点が今後の課題だろうと思った。

しかし、技術としては非常におもしろい。Chromeはこの技術をもって将来、脱Flashできるだろうか。