Thursday, September 29, 2011
■ [Metro][WinRT]HTML+CSS+JavaScriptで動くMetro style appsの話(実行環境周り)

Windows 8ではHTML+JavaScriptでネイティブ機能を使ったアプリケーションを開発できるようになるわけですが、どんな仕組みになっているのか調べたので簡単に書いてみようと思います。はじめはWinRTとは…WinMDが云々…といった感じで細かく書こうかと思ったのですがややこしいので(まとめてると調べるのが終わらない)おおざっぱに、です。
あ、当たり前ですがWindows Developer Previewという名の通り今後変更される可能性は多いにあるのでそこはご理解とご協力とお察しください。
Metro style apps
HTML+JavaScriptで作ることのできるアプリケーションはMetro style appという新しいMetro UIに対応したアプリケーションのみで、従来型のデスクトップアプリケーションを作ることはできません。
ちなみに従来型のデスクトップアプリケーションはDesktop appsと呼ばれ、Metro style appのことはまれにImmersiveアプリケーションと呼ばれたりします。"Immersive"は「没入型の」ということですね。Building Windows 8のブログにしばしば出てきますし、APIの名前などは大体MetroではなくImmersiveと書かれています。
そんなMetro style appはHTML+JavaScriptであろうと、C++であろうと、C#であろうと…WinRTと呼ばれるWindowsの新しいAPIセットの上で動きます。というよりMetro style appはWinRTの上以外では動きませんし、逆にWin32 APIも(一部を除いて)利用できません。
実行環境
さて、HTML+JavaScriptでもMetro style appを作れるということですがどんな形で動くのかというとこんな感じになっています。
HTML+JavaScriptでアプリケーションが作れて動く、といったところでいきなりWindowsが直接解釈できる実行形式になるわけではありません。
WWAHost.exeというWindowsの実行アプリケーションがあり、その中にInternet ExplorerのTrident(レンダリングエンジン)とChakra(JavaScriptエンジン)が組み込まれています。そしてWWAHost.exeがHTML+CSS+JavaScriptを読み込んでレンダリングエンジンとJavaScriptエンジンを使ってアプリケーションとして動かすという形になっています。
WWAHost.exeはただInternet Explorerのエンジンを組み込むだけでなく、JavaScriptエンジンと協調してWinRTのクラスライブラリをJavaScript側へ公開してくれます。その結果JavaScriptからWinRTつまりWindowsのネイティブな機能などを扱うことができるようになっているという感じです。
たとえばwindowオブジェクト(グローバル)にWindowsなどが生えていて、Windows.Storage.KnownFolders.picturesLibrary.createFileAsync(...)
といった感じで呼び出すことができるようになっています。
アプリケーションの構成的はだいぶおおざっぱですがこんな感じですね。これに加えて周辺技術にWinRTをはじめとしてパッケージングのAppXやWinJSなどがあるのですがまあそれはまた後で書くかもしれません。
WinRTってなに
今までのWindowsではアプリケーションを作るためのAPIとしてWin32 APIというものが提供されていましたが、Metro style appのために新たにWindows Runtime(WinRT)というAPIというかライブラリが提供されています。
WinRTはファイルやデバイス、ネットワークなどへのアクセスといった様々なOSネイティブな機能をオブジェクト指向的に整理して構築し直したものです。さらにネイティブライブラリでありメタデータを持つ規約のようなものでもあるので、C++やC#、JavaScriptなどさまざまな言語に公開できるようになっているのが特徴です。
Windows Runtimeという名前ですが.NETのCLR(Common Language Runtime)のような仮想マシン実行環境を持っていません。その意味では実装形態は問わずさまざまな言語から使うことを考慮した点など従来のCOMにだいぶ近いものといえそうです。