Visual Studio 2015 Update 2 の .NET Native コンパイラおよびランタイムの新機能

 

本記事は、マイクロソフト本社の The Visual Studio Blog の記事を抄訳したものです。【元記事】 What’s new for the .NET Native Compiler and Runtime in Visual Studio 2015 Update 2 2016/4/18

 

 

先週、ユニバーサル Windows アプリ (UWA) 向け Visual Studio 2015 ツール (英語) の更新プログラムをリリースしました。今回のリリースでは、ライブラリ、ランタイム、コンパイルなどに関する改良を行っています。この更新によって開発作業がさらにスピードアップし、アプリケーションの応答性が上がり、保守も容易になりました。NCAA March Madness Live (英語)TuneIn Radio など、新しい .NET Native ツールを使用して開発されたアプリも既にストアで提供され始めています。

 

ユニバーサル Windows プラットフォーム (UWP) ツールの入手

UWA 向け Visual Studio 2015 ツールの最新バージョンは、Visual Studio 2015 Update 2 の更新プログラムとしてリリースされています。入手するには、Visual Studio 2015 Update 2 をインストールするか、インストール済みの Visual Studio 2015 Update 2 を変更します。インストールする機能のリストが表示されたら、[Tools (1.3.1) and Windows 10 SDK (10.0.10586)] が選択されていることを確認してください。この機能は [Universal Windows App Development Tools] セクションにあります。UWA 向け Visual Studio 2015 ツールの更新プログラムをインストールした後、既存のプロジェクトを再コンパイルすることで、最新のコンパイラとランタイムが適用されるようになります。

 

Visual Studio 2015 Update 2 の変更

次の手順を実行すると、Visual Studio 2015 Update 2 を変更し、最新の UWA ツールをインストールできます。

  • コントロール パネルの [プログラムと機能] から「Visual Studio 2015」を見つけてセットアップ ウィザードを開きます。
  • [Modify] をクリックします。
  • [Universal Windows App Development Tools] セクションの [Tools (1.3.1) and Windows 10 SDK (10.0.10586)] が選択されていることを確認します。

clip_image002

  • [Next] をクリックし、選択されている機能に過不足がないか確認します。
  • [Update] をクリックします。

 

.NET Core ライブラリの更新

.NET Core ライブラリは NuGet パッケージとして NuGet.org で配布されています。以下に、最新の .NET Core パッケージの入手方法を紹介します。

  • [Tools]、[NuGet Package Manager]、[Manage NuGet Packages for Solution] の順にクリックして、NuGet Package Manager に移動します。
  • [Updates] タブをクリックします。
  • 画面左で [Microsoft.NETCore.UniversalWindowsPlatform] NuGet パッケージ (.NET Core 用 UWP メタパッケージ) を選択し、アップグレードするプロジェクトのチェック ボックスをオンにします。
  • バージョンの欄に、「Latest Stable 5.1.0」と表示されていることを確認します。
  • [Install] をクリックします。

clip_image004

 

.NET Native コンパイラとランタイムの新機能

リフレクションのサポートの強化 ジェネリックのユニバーサルな共有

.NET アプリでは、さまざまな状況でリフレクションが使用され、アプリに直接組み込まれている場合もあれば、使用するライブラリに含まれている場合もあります。今回の更新によって、より多くのアプリでリフレクションが “標準で” サポートされるようになりました。皆様と同じように私たちもよく使用しているリフレクションを、.NET Native でもぜひ活用してください。

リフレクションを使用すると、型の確認またはインスタンス化の際に、(たとえば、new を使用せずに) 遅延バインディングが可能になります。これは、疎結合されたアーキテクチャや動的なシナリオで非常に便利な方法です。コンパイル時にはすべてのコードが明らかになっていなくてはならないため、動的なプログラムはネイティブコードへのコンパイルのネックとなる要素です。そのため 1 つのやり方として、動的なシナリオでは実行時に新たなジェネリック型を作成します。

List<T> は、引数 T の型が定義されていないとオープン型になります。一方 List<MyValueType> は、引数が定義済みなのでクローズ型になります。プログラム内では、こうしたクローズ型のジェネリックをインスタンス化します。List<MyValueType> は、List<T> でも MyValueType でもない、言うなれば第 3 の型であり、両方の要素を持ったジェネリックのインスタンスです。

ジェネリック型は、形 (メンバー) と動作 (メソッド本体) との組み合わせで構成されます。この 2 つが合わさって、ネイティブコードにコンパイルされます。List<MyValueType> と List<MyReferenceType> のネイティブ コードは同じではありません。つまり、.NET Native コンパイラでは、すべてのジェネリック インスタンスが区別され、各ジェネリックの実行時に実行すべきコードが用意されます。リフレクション API は多彩な表現が可能な反面、すべてのジェネリックインスタンスを静的な分析で見分けることが困難になります。特に、Type.MakeGenericType と MethodInfo.MakeGenericMethod を使用したコードは、際限なく複雑化しかねません。

マイクロソフトはこうした課題に対処するために、ジェネリックのネイティブ コンパイルについて新しい考え方を採用することにしました。そして、実行時にジェネリックを作成するためのより汎用的な方法が必要だという結論に達したのです。この新たな機能は、Universal Shared Generics (USG) と名付けられました。ほとんどのジェネリックでは、それぞれの作成に特化したきわめて最適化されたコードを引き続き使用します。ただし、型固有のコードが生成されなかった場合に、今後は USG バージョンを適用します。

 

HockeyApp によるスタックトレースの強化

今回のリリースと HockeyApp (英語) を併用すると、運用中のアプリケーションに関して、その後の処置に役立つスタック トレースをきわめて正確に入手できるようになります。今回の更新では、クライアント側の情報収集をさらに安定させると共に、HockeyApp のバックエンドで、人に理解可能なスタックを適切に生成できるように改良しました。この機能は、//build (英語) で発表した内容を正式にリリースしたものです。UWP 向けの HockeyApp はこちらのページ (英語) から簡単に利用を開始できます。

 

WinRT の相互運用機能の高速化

WinRT の相互運用機能を高速化した結果、UWP 1.2 のツールと比べて、ラボ テストでは 8 倍ものスピードを達成しました。この改良は、多数の XAML 要素が使用されたページを含むアプリケーションや、IoT ストリームを処理するシナリオで特に効果を発揮します。

 

ネイティブコードの高速化

今回のリリースには、コード品質に関する多くの拡張や機能レベルでの改良点が含まれています。以下はそうした改良点の一例です。

.NET Native コンパイラの以前のリリースでは、CLR JIT コンパイラと同じインライン展開オプティマイザーを利用していました。JIT コンパイラはコード生成のスピードを重視してチューニングされているため、どのメソッドをインライン展開するかが、該当箇所のみで判断されます。一方、.NET Native コンパイラでは、コンパイルをあらかじめ実行しておくことで、アプリケーション全体を考慮しながらインライン展開するかどうかを判断します。バージョン 1.3.1 では、こうしたプログラム全体の分析が、ハイ パフォーマンスな C++ アプリケーションに使用されるのと同じインライン展開エンジンで実行されるようになり、多くのシナリオで大幅なパフォーマンス改善が期待できます。

ガイド付き最適化のプロファイル (PGO) は、コード生成の際にコンパイラによって適切な選択がなされるよう、アプリケーションの実行時に何が起こるかについて情報を提供する役割を果たします。マイクロソフトでは、さまざまな UWP アプリケーションから収集したデータに基づいて、SharedLibrary コンポーネントに対して PGO の最適化を適用しています。この最適化の優れた効果を、UWP ツールの今後のバージョンで一般提供できるのを楽しみにしています。

.NET Native では、C++ コンパイラと同じ最適化バックエンドを採用することで、ハイ パフォーマンスな C++ コード用に開発された、高度な最適化テクノロジを使用できるようになりました。この融合がもたらす利点については、改めてご紹介していきたいと思います。

 

コンパイラの処理時間の改善

.NET Native コンパイラの内部データ構造とアルゴリズムの多くが、大幅に効率化されました。ほとんどのアプリについてコンパイラで使用されるメモリの量が減り、コンパイル時間が少しばかり短縮されます。こうした改良の積み重ねが、一部のアプリケーションとライブラリにとってはスムーズにコンパイルされるか、構築に何時間もかかる (英語) かの違いにつながります。私たちは今後も継続的に最適化と改良に努め、成長を続ける UWP エコシステムの多彩なコードに幅広く対応してまいります。

 

フィードバックのお願い

皆様からお寄せいただくフィードバックはいつもありがたく拝見させていただき、今後の方向性を決める際の参考としています。これまで同様、dotnetnative@microsoft.com まで質問やご提案をお寄せください。皆様のご意見やすばらしい開発の成果が聞けるのを楽しみにしています。

この記事は、.NET チームのソフトウェア エンジニアである Matthew Whilden とプログラム マネージャーを務める Stacey Haffner が執筆しました。