Windowsランタイム
Windowsランタイム (Windows Runtime、略称:WinRT) はマイクロソフトによる新しいプログラミングモデルであり、Modern UIスタイルのアプリケーションを作成するバックボーンとなるAPIである。Windows 8以降のオペレーティングシステムで実装されている。
WinRTはネイティブ言語拡張であるC++/CX (C++ Component Extensions)、マネージ言語であるC#およびVB.NET、そしてスクリプト言語であるJavaScriptおよびTypeScriptによる開発に対応する。Windows SDKバージョン 10.0.17134.0 以降は、C++/WinRTを選択することもできる。
WinRTはx86/x64/ARM/ARM64をネイティブサポートし、またサンドボックス環境内で動作することで従来のデスクトップアプリケーションよりもセキュリティや安定性を高めることができるWindows 8.xの時点ではx86/x64/ARMのみだったが、Windows 10のユニバーサルWindowsプラットフォームでは64ビットARMすなわちARM64のサポートも追加された。。
WinRTはC++言語によって実装された、オブジェクト指向設計にもとづく近代的なAPIである(なお前身となる旧来のWin32 APIは、C言語のインターフェイスを持つAPIとして設計され、C/C++両方から利用することができた)。また、COMに基づいたネイティブ(アンマネージ)APIであり、COMのように複数の言語から利用することができる。
従来のCOMとの違いのひとつとして、WinRT APIの定義は".winmd"ファイルに格納されており、ECMA 335メタフォーマットでエンコードされている。同じフォーマットはいくらかの改変を加えた形で.NETでも用いられている。この共通のメタフォーマットにより、従来のP/Invokeと比較して非常に小さなオーバーヘッドでWinRTを.NETアプリケーションから呼び出すことが可能になる。また従来のCOMコンポーネントを.NET言語から直接利用するためには、.NET用にCOMタイプライブラリをインポートするか、COMインターフェイス定義を.NET言語で明示的に記述してラッパーを作成する必要があったが、WinRTではその必要がなくなり、ラッパーを作成することなくWinRTコンポーネントを.NET言語から直接利用できるようになる。また、その逆もしかりであり、.NET言語で作成したWinRTコンポーネントをC++/CXで直接利用することも可能である。文法もよりシンプルになる。
新しいC++/CX (Component Extensions) 言語はC++/CLIの文法をいくつか借用しており、C++によるクラシックなCOMプログラミングよりも少ないグルーコードでWinRTコンポーネントの作成や利用が可能である。また、C++/CLIと比較して、純粋C++型(class/struct)とWinRT型(ref class/ref struct/value class/value struct)が混在する場合において課される制約がほとんどないC++/CLIにおいては、ガベージコレクションにかかわることから、ネイティブ型にマネージ型のインスタンスを含める場合、gcrootクラステンプレートによるラップが必要になるなどの制約がある。。ただし、C++/CXは常用するべきものではなく、純粋なC++言語で書かれたコードをWinRTアプリケーションで再利用するためにラップする場合など、境界面においてのみ使用することが推奨されている。例えばC++/CXによるコンポーネント拡張はABI境界でのみ使用されることが勧められている。通常の(COM準拠の規約つきの)C++も、新しいテンプレートライブラリであるWindows Runtime C++ Template Library (WRL) で補助することでWinRTコンポーネントをプログラミングする際に利用可能である。目的としては、WRLはCOM用にATLが提供しているものに似ているが、いくつかの機能が省略されている。なお、のちに標準C++17をベースとした言語プロジェクションとしてC++/WinRTが開発され、C++/CXおよびWRLの代替として推奨されるようになった。
例えば従来のデスクトップアプリケーションの場合、C#コードからC++コードを再利用するときや、あるいはC++コードからC#コードを再利用するときは、いずれもP/Invoke、COM相互運用、もしくはマネージ言語であるC++/CLIによるラッパーを介する必要があったが、WinRTの場合はネイティブ拡張であるC++/CXまたはC++/WinRTを介することで相互運用可能なコンポーネントを作成・利用できるため、明示的にP/Invokeやマネージ言語を介する必要がなくなる。
WinRTは、2011年9月12日のMicrosoft Buildカンファレンスで明らかになり、Windows 8の開発者プレビューに含まれていた。また、最初のC++/CXとWinRT開発環境のサポートは、Visual Studio 2012のプレビュー版であるVisual Studio 11に含まれていた。正式版となったVisual Studio 2012にはWindows 8向けのWinRT開発環境が、そして後継のVisual Studio 2013にはWindows 8.1向けのWinRT開発環境が含まれている。Visual Studio 2013ではWindows 8向けのWinRTアプリケーションを開発することはできないが、Visual Studio 2012と2013は共存可能である。
Visual Studio 2015にはWindows 10(Universal Windows Platform, UWP)向けのWinRT開発環境が含まれている。Visual Studio 2015では、引き続きWindows 8.1向けのWinRTアプリケーション開発もサポートされる。
WinRTコンポーネントは、ネイティブ、マネージコード、スクリプティングを含む複数の言語とABIの間の相互運用性を視野に入れて設計されている。
WinRTアプリケーションはサンドボックス内で実行される。そのため、従来のデスクトップアプリケーションと比べてインストールや動作に関する制約が設けられるものの、セキュリティ面での安全性は向上する。WinRT APIは、従来のデスクトップ版Win32 APIと一部を共有するWin32 APIサブセットの上に構築されており、Win32 APIの代替というよりはむしろ高レベルのラッパーであるといえる。これは内部実装にWin32 APIを利用しているMicrosoft .NET Frameworkで使われているのと同じアプローチである。
WinRTメタデータはWinRTに対して書かれたコードを補足する。プログラミング言語にかかわらずオブジェクト指向的なプログラミングモデルを定義し、リフレクションなどの機能も提供する。
マイクロソフトのC++専門家であるハーブ・サッターは、BUILDカンファレンスにおいて、WinRTメタデータは.NETメタデータと同じものであると説明している。ネイティブコードにはメタデータを含めることはできず、別にWINMDファイルとして保存される。その場合でもリフレクションは.NETアセンブリ同様に動作する。
.NETメタデータと同じものなので、WinRTに対してネイティブ言語で開発されたコードは.NET上のプログラミング言語からも利用することができる。
WinRTはメタデータに基づいた、リッチなオブジェクト指向のクラスベース型システムを持っている。WinRTは.NET Frameworkにみられるような、クラス、メソッド、プロパティ、デリゲートおよびイベントといった構成概念に対応するものをサポートする。
COMと比較して、WinRTに追加された主要なもののうちのひとつは、クロスABIで.NETスタイルのジェネリクスである。C++/CXにおいて、ジェネリクスはgenericキーワードを用いて宣言され、templateキーワードを用いた構文と非常によく似た構文を持つ。WinRTのクラス (ref class) は、C++のテンプレートを用いてジェネリック化することもできるが、.winmdメタデータにエクスポートすることはできない。つまり、privateな可視性を持つWinRTクラスのみをテンプレートとすることができ、またテンプレートを特殊化した型はWinRTクラスのprivateなメンバーとしてのみ利用可能である。一方WinRTのジェネリクスはジェネリック性 (genericity) をメタデータ内に保存する。WinRTはまた、ジェネリックなコンテナ(コレクション)のライブラリを提供する。これは標準C++ライブラリのSTL (Standard Template Library) コンテナと似たものであり、C++/WinRTではSTLコンテナとWinRTコンテナとの相互変換機能もいくつか用意されている。.NET言語(例えばC#やVB.NET)およびJavaScriptにおけるWinRTコレクションの利用は、C++の場合よりも透過的である。これは暗黙的に行なわれる、各言語における等価な型への自動的なマッピングによって実現される。マネージ言語でWinRTコンポーネントを記述するとき、COMとよく似たスタイルの規則に従う必要がある。例えば、公開されたメソッドやプロパティの戻り値およびパラメータとして宣言することができる型は、WinRT型またはWinRT互換型に限られるため、.NETコレクション型を直接使用することができない。同様に、C++では内部的なコードに関してはSTLやその他の型を自由に使用できるが、ABI境界を超える場合はWinRT型を使用する必要がある。
WinRTの文字列はHSTRING型として実装されているが、詳細は公開されていない不透明な型 (opaque type) である。HSTRINGは、C++/CXではPlatform::Stringに、C++/WinRTではwinrt::hstringに、.NETではSystem.Stringに、JavaScriptでは組み込みのStringオブジェクトにマッピングされる。
WinRTを対象とするようにコンパイルされたクラスは、WinRTコンポーネントと呼ばれる。これらはサポートされている任意の言語およびプラットフォームで使用できる自己完結型のクラスである。これらのクラスにはメタデータが定義されており、多くの言語からコンポーネントを呼び出すことが可能となる。ランタイムでは、定義済みのインターフェイスタイプまたは.NETタイプのインターフェイスを使用するために.NET Frameworkで構築されたWinRTコンポーネントが必要となる。これらのインターフェイスは、デフォルト名に自動的にマップされる。継承は、XAMLクラスを除いて、マネージドWinRTコンポーネントではまだサポートされていない。
WinRTランタイムを対象としたプログラムとライブラリは、多くのプラットフォームとプログラミング言語から作成および使用できる。C/C++(WinRTの概念をファーストクラスでサポートする言語拡張機能、または標準のC ++でコードを記述できる低レベルのテンプレートライブラリ)、 .NET(C#およびVB.NET)、およびJavaScriptなどから使用できる。これはメタデータによって可能となる。
WinRTの文脈では、言語バインディングは言語プロジェクションと呼ばれる。
C++は、WinRT自体の開発言語であり、当然最も自然な形で利用することができる。C++からWinRTを使用する方法には、2つの選択肢があり、一つはWRL(ATLスタイルのテンプレートライブラリ)であり、もう一つはC++/CLIに似たC++/CX (コンポーネント拡張機能を備えたC ++)である。
違いとしては設計上WRLには例外が存在せず、実行結果の如何に関わらずCOMと同様のHRESULTベースの戻り値が返る。その一方で、C++/ CXは、WinRTへの呼び出しに対してエラーチェックを実行し、必要に応じて例外をスローするラッパーとなっている。
また、C++/CXでは、プラットフォームとその型システムとの統合を可能にする多くの拡張機能が実装されている。構文はC++/ CLIの構文に似ているが、ランタイムと統合するネイティブコードとメタデータを生成する。例えば、WinRTオブジェクトはref newでインスタンス化できるが、これはC++/CLIのgcnewに相当する。ハンドル宣言子(^)の用法は変わらないが、呼び出し元と呼び出し先の両方がC++で記述されており、同じプロセスに存在する場合、ハット参照は単にvtableへのvptrポインタを返す。
WinRTはネイティブプラットフォームであり、任意のネイティブC++コードをサポートする。C ++開発者は、ランタイムとインターフェイスするコードを作成するときに言語拡張機能を使用するだけで、既存のネイティブC /C++ライブラリを再利用することができる。
.NETFrameworkと共通言語ランタイム(CLR)は、サブプラットフォームとしてWinRTに統合されている。また、メタデータ形式やライブラリの設計など、WinRTプラットフォームの設計や実装の随所にその影響がみられる。.NETにおけるWinRTはマネージドオブジェクトとして実装されており、Win32APIのようにユーザーがハンドルなどを管理する必要はない。
WinRTは、主にC#およびVB.NETで記述されたXAMLベースの.NET Metroスタイルのアプリケーションをサポートする。正式なサポートとはされていないが、当然他の.NET言語から使用することもできる。
WinRTはJavaScriptからの利用も想定されている。MicrosoftはHTML5とJavaScriptをWindows 8の開発エクスペリエンスの一部として統合するとしており、InternetExplorer9用に開発された「Chakra」JavaScriptエンジンはWinRTと統合されていた。
JavaScriptでのWinRTの利用においては、WinRTの機能をJavaScriptの命名規則に従って適応させるなど、内部でいくつかの特殊な処理を行っている。
名前空間はJavaScriptオブジェクトにマップされており、いくつかの特別なメンバーを追加するなどの対応がなされている。
メトロインターフェースは、コードビハインドでHTML5とCSSおよびJavaScriptを使用して構築されている。
現在のバージョンはJavaScript5です。
WinRTは、Modern UI(旧称:Metro UI)のような、Windows 8の機能を開発者に公開するクラスライブラリの形でApplication Programming Interface (API) を搭載している。WinRTはサポート対象となるあらゆる言語から利用可能である。
Windowsクラスは、WinRTによって公開されるネイティブな(アンマネージドな)低レベルのC/C++ライブラリである。XAMLパーサーからカメラ機能までの すべての機能へのアクセスを提供する。
APIのコンポーネント(クラスおよびその他のメンバー)の命名規則は、キャメルケースを使用しているが、JavaScriptのように異なる命名規約を持つ言語ではその言語の命名規則に沿った形で提供されている。