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