.NET 2015とは何か:特集:.NET大変革(3/3 ページ)
オンラインイベント「Connect();」で、マイクロソフトが明らかにした.NET 2015構想。本稿では、.NET 2015を構成する主要素について概観していく。
.NET Framework 4.6
.NET Framework 4.6は従来の.NET Frameworkを進化させたバージョンだ。こちらには上述したASP.NET 5に加えて、ASP.NET 4.6、WPF、Windowsフォームが要素として挙げられている。これまでのASP.NETアプリや、WindowsフォームやWPFなどのデスクトップアプリを開発する上では欠かすことのできない機能はこちらでサポートが続けられると考えてよいだろう。
.NET Framework 4.6で行われた機能追加をいくつか下にまとめておこう。
- ASP.NET 4.6: 従来のASP.NET 4.5.xの進化バージョン。WebフォームでのHTTP 2サポート/非同期でのモデルのバインディングのサポートなどが行われている
- WPF: WPFのパフォーマンス向上/DirectXとの相互運用性/タッチデバイスや高解像度デバイスなど新たな種類のデバイスへの対応/開発ツールの強化などを将来的に行う予定であり、.NET Framework 4.6では複数画像のマウスカーソル/子ウィンドウの透明化/ダブルタップ操作における認識性やテキスト選択のしやすさの向上/コンボボックスに対するスタイラスでの入力操作の信頼性向上などが実現される予定だ
- Windowsフォーム: システムのDPI設定を使用しての一部コントロールのサイズ調整機能の追加(.NET Framework 4.5.2でも同様な機能追加が行われている)。これは高解像度デバイスへのWindowsフォームの対応の一環だ
- 基本クラスライブラリ: 基本クラスライブラリに多数の機能追加が行われた(Stack<T>/Queue<T>クラスなどのコレクションクラスでのIReadOnlyCollection<T>インターフェースの実装/タスクベースの非同期パターンへのメンバーの追加/暗号APIの追加など)
最後に、.NET Framework 4.6と.NET Core 5に共通の機能について見ていく。
.NETコンパイラープラットフォーム:Roslyn
Roslynは、C#とVisual Basicを対象とした新たなコンパイラープラットフォームだ。
これまでのコンパイラーとはソースコードを入力として受け取り、これをコンパイル/リンクして、最終的にオブジェクトファイルやアセンブリを出力するものだった。もちろん、外部から見ている分にはこれで問題はない。
だが、VSのような高機能なIDEが広く使われるようになると、無駄が生じることになる。つまり、IntelliSenseや各種のリファクタリング機能などで使われる高度な構文解析機能をIDEが実装する一方で、コンパイラーもその内部で構文解析を行っているのだ。そして、コンパイラーが行った解析の結果は最終結果の生成のためだけに使われ、IDEへとフィードバックされることはなかった。
Roslynはこうした部分にメスを入れ、コンパイラーがソースコードをコンパイルする過程で得られるさまざまな知見をIDE、そしてIDEのユーザーに対して解放しようという野心的な試みである。そのためにRoslynはコンパイルにおける解析/宣言/バインド/エミットの各フェーズをコンパイラーAPIとして公開する(この他にもワークスペースAPI/フィーチャーズAPIなどのAPIレイヤーが存在する)。
VS 2015 PreviewのIDEではC#およびVisual Basicでのコード編集でRoslynが使われるようになっている。また、前述の通り、ASP.NET 5プロジェクトではRoslynを使用することで、デザイン時にコンパイルが行われるようになっている(ビルドを明示的に指定した場合にはデザイン時の結果がそのまま出力される)。また、VS 2015 PreviewではTypeScriptのコード編集でもRoslynが活用されている。
なお、Roslynについての詳細な説明とそのAPIを使用したプログラミング例については、Build Insiderの連載「次世代コンパイラー“Roslyn”概説」を参照していただきたい。
RyuJIT
.NET Frameworkの64bit JITコンパイラー(JIT64)はもともと、サーバー上で動作するプログラムを対象としていた。ここでいうサーバー上で動作するプログラムとは長期間にわたって動作し、起動時間よりも全体的な速度が重要なものである。すなわち、JIT64はコード生成(プログラムの起動まで)に時間がかかってもよいので、プログラムの動作速度を高速化することに主眼が置かれていた。
これに対してクライアントサイドでは、32bitのマシンが使われるのが以前は一般的だった。クライアントサイドで実行されるプログラムでは、その起動時間はユーザビリティに直結する問題だ。そのため、32bit JITコンパイラー(JIT32)ではコード生成の高速性に主眼が置かれていた。
つまり、JITコンパイラーが「どのようなコードをどのようにして生成すべきか」がサーバーとクライアントで大きく異なっていた。JIT64は生成されるコードの品質を、JIT32はコード生成の時間を重要視していたのだ。
だが、現代ではサーバー上で動作するコードといってもさまざまである。特にWebアプリのように起動時間が重要なファクターとなるコードが今ではサーバー上でごく普通に動作している。ということは、この状況に合わせた新たなJITコンパイラーが必要になるということだ。そして、生まれたのがRyuJITである。
RyuJITはJIT32をベースとすることで高速なコード生成を可能としながら(以前はC++チームの最適化コンパイラーがベースだった)、JIT64が持つ高品質な(高速に実行される)コードの生成が可能となった。また、SIMD(Single Instruction, Multiple Data)処理をサポートすることで、大量のデータの並列処理にも対応できるようになっている。
RyuJITはJIT32をコードベースとしている。コードベースが統一されたことで、RyuJITは将来的にx86コードやARMコードの生成もサポートし、これが.NET Framework/.NET Coreにおける標準的なJITコンパイラーとなる予定だ。
現在、RyuJITはPreview版が配布されている(インストーラーのファイル名「RyuJIT-CTP5.msi」となっている)。
RyuJIT CTP 5のインストール画面
インストール後は、「RyuJIT: The next-generation JIT compiler for .NET」の手順に従って環境変数を「COMPLUS_AltJit=*」と設定するか、あるいはレジストリで「HKLM\SOFTWARE\Microsoft\.NETFramework」に文字列値「AltJit」を作成し、その値を「*」に設定して、RyuJITを有効化する。
本稿では.NET 2015を構成する主要な要素について、その概要を見てきた。.NET 2015は2つのフレームワークを含み、中でも.NET Core 5はその設計が大幅に刷新され、モジュール性やクロスプラットフォーム性が高まっている。これはモバイルファースト/クラウドファーストな時代に向けて、.NETが大きな変貌を遂げようとしていることを示している。
その一方で、.NET Framework 4.6はこれまでのフレームワークを正当進化させ、(意外なことに)WindowsフォームやWPFへの投資も継続して行われている。従来の資産が無駄になることはない。これはマイクロソフトが常に気を使っていることであり、彼らの美徳の1つだろう。
変革と継続。両者をバランスよく実現できるかが.NET 2015の成功を決定する。だが、それは変革の波に乗るグループと、継続性を重要視するグループへの二極化をさらに進めることになるかもしれない。新技術への緩やかな(あるいは急速な)移行をいかに進めるかが今後は重要になるだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.