Windows Runtime (WinRT)はWindows上で柔軟でセキュアなアプリケーションエクスペリエンスを提供するために作られた。WinRTは.NET、C++、そしてJavaScriptから影響を受けている。WinRTはCLRやWin32に置き換わるものではなく、異なる言語で書かれたMetro UIを持つアプリケーションのための統一的なサポートを提供するものである。
Microsoftは、優れたIntellisenseやデバッグツールを使うことができる一方で、使用する言語やライブラリは自由に選択する事ができ、高速かつ柔軟で、信頼性の高いアプリケーションの作成を可能にする開発プラットフォームを構築すべく、2年前からWinRTに取り組んできた。その結果、アーキテクチャと.NET言語(C#やVB.NET、F#)やC++、HTML/JavaScriptから呼び出し可能なAPIのセットが仕上がった。それらの全ての言語が、WinRTの設計に影響を与えた。
WinRTは.NETやWin32によって提供される機能を全て置き換えるものではなく、Metroスタイルのユーザーインターフェースを持ったアプリケーションを異なる言語で書くための共通プラットフォームである。ハイブリッドなC#アプリケーションでは、LINQクエリを実行しつつ、Metro UIの作成やストレージ、ネットワーク、アプリケーションセキュリティなどはWinRTに頼る、といったことも可能である。以下にWinRTのアーキテクチャの全体像を示す。
Language Projectionは、各言語サポートが持っているWinRT APIのビューを表す。Metroアプリケーションを構築するために推奨されるAPIは、“Windows”名前空間以下に配置されている(Visual Studio 11のIntellisenseではそれらを表示させることが可能だ)。
Martyn Lovell氏(WinRTの開発マネージャ)はBUILDカンファレンスのセッション(“Windows Runtime一巡り”)において、WinRTの背後にある設計原理についてプレゼンテーションを行った。
- 柔軟で高速なアプリケーションエクスペリエンスを保証するため、50ミリ秒以上かかる処理はAsyncを使って非同期呼び出しすべきである。多くの開発者は、同等の機能を持った非同期版があるにも関わらず、同期APIを使う傾向がある。よって、開発者に非同期呼び出しを強制するため、AsyncはWinRTの奥深くに構築された。
- アプリケーションを適切に分離すれば、あるアプリケーションのパフォーマンスが他に影響することがなくなり、セキュリティ上も望ましい。あるアプリケーションに属するWinRTオブジェクトは、Windows Contractsが介在する標準のOSコミュニケーションチャネルを経由する場合を除き、他のアプリケーションに公開する事ができない。
- アプリケーションがWindowsの異なるバージョン上でうまく動作することを保証する、プラットフォームベースバージョニング。バージョニングはWinRTのメタデータに含まれ、Intellisenseによってアプリケーションのターゲットとなっているバージョンの機能だけが表示される。そのため、開発者は特定のバージョンのWindowsで利用可能なクラスやメソッドを、ドキュメントを調べることなく知ることができる。
型に関して言えば、WinRTは言語に依存しない型(整数や列挙型、構造体、配列、インターフェース、ジェネリックインターフェース、ランタイムクラス)を提供しなければならなかった。HSTRINGと呼ばれる新しい文字列型は、データをコピーすることなくアプリケーションとランタイムの間の文字列転送を可能にするために導入された。
それぞれのWinRTオブジェクトは多くのインターフェースを持つが、それらのインターフェースの内の2つは、どのオブジェクトにも属する。1つはIUnknownであり、COMインターフェースでお馴染みのものだ。もう1つはIInspectableで、オブジェクトがベースとしているメタデータについての情報を発見するために使われる。オブジェクトはインターフェース経由で他の機能を提供するが、それらのインターフェースはランタイムクラスを通して公開される。例えば、FileInformationオブジェクトは、FileInformationクラスを通して公開される、IStorageItemInformation、IStorageItem、IStorageFileインターフェースを持つ。
WinRTオブジェクトは、コンパイル時にC++アプリケーションに公開される。C#やVB.NETアプリケーションの場合は、一部はコンパイル時に、一部は実行時にバインドされる。HTML/JavaScriptアプリケーションは実行時のみ、WinRTオブジェクトを参照することができる(メタデータが動的に生成される)。
Metro UIは再入不可能なシングルスレッドで実行されるが、アプリケーションの他の部分はマルチスレッドにすることができる。
Windows RuntimeエクスペリエンスチームのHarry Pierson氏と、共通言語ランタイムチームのJesse Kaplan氏は、BUILDカンファレンスの別のセッション(“C#やVisual BasicからのWindows Runtimeの利用”)で、.NET言語を使ったWinRTプログラミングの詳細についてプレゼンテーションを行った。
Pierson氏によれば、.NETはWinRTに大きな影響を与え、多くの設計ガイドラインは.NETのものが参考にされているようだ。例えば、WinRTライブラリは.NETのメタデータフォーマットの更新版をベースにしたメタデータで補強されている。また、WinRTはSilvelightのように、Metroアプリケーション作成のためにXAMLフレームワークを使用する。WinRTと.NETのダイレクトマッピング(プリミティブ、クラス、インターフェース、プロパティ、メソッドなど)があり、実際の差異が隠蔽されるため、.NETアプリケーション開発者はWinRTを使うのに違和感がないだろう。
また、Pierson氏によれば、一連のルール(構造体はpublicなデータフィールドだけを持つ、継承はXAMLコントロールにのみ利用できる、他の全ての型はシールされていなければならない、システムが提供しているジェネリック型のみをサポートする)を順守することで、C++やJavaScriptで作ったWinRTアプリケーションから、C#のWinRTコンポーネントを利用することも可能である。
Windows 8やその後のWindowsはおそらく、クラシックアプリケーションと、タッチと親和性の良いMetroスタイルのアプリケーションの混在環境を提供するだろう。将来のMetroベースのWindowsアプリケーションは、WinRTが提供する共通インフラの恩恵を受けることができ、開発者は言語の違いから来るわずかに異なるビューを持った、統一的APIを使ってプログラムを書くことになるだろう。これは、過去の互換性を維持しつつ、将来のために新機能を提供しようという、Microsoftの最大限の努力である。