2010年前半ごろのリリースが予想される次期Visual Studio 2010と.NET 4。それらに搭載予定の主な新機能や機能強化を紹介する。
本稿では、次期Visual Studio 2010(以降、VS 2010)および.NET Framework 4.0(以降、.NET 4)の新機能を概観する。C# 4.0、Visual Basic 10については、本稿では紹介しない。
なお、本稿はPDC(Professional Developers Conference) 2008の内容をベースにしており、製品版が必ずしもこのとおりになるとは限らないことは注意してほしい。本稿で紹介した機能が、実際の製品では搭載されないことはあり得る。
それでは基本ライブラリそして.NETアプリケーションの実行エンジンである.NET 4の新機能から見ていこう。
※以降、「アプリケーション」はすべて「アプリ」と短く記述する。
次期.NET 4における機能群を簡単にまとめると、以下の構成図のようになる。
既存の.NET Framework 3.5 SP1までと比較し、この図で目新しいのは、次の4点だ。これらが.NET 4で追加される。
まずは注目すべき.NET 4での機能強化についていくつか紹介し、その後、上記の4点をそれぞれ紹介する。
●WPF(Windows Presentation Foundation)の強化
.NET 4のWPFでは、マルチタッチ機能(Multi-Touch APIとコントロール群)がサポートされる。また、(Silverlight 2ですでにサポートされている)Deep Zoomもサポートされる。
また、現在DataGrid/DatePicker/Calendarコントロールや、(Silverlight 2にはすでに搭載されている)VisualStateManager(=視覚情報を管理する機能)が「WPF Toolkit」として試験的に提供されているが、これらが正式にWPFに組み込まれる。
さらに、(Office 2007で搭載されたような)Ribbon(リボン)コントロールが使えるようになる(詳しくは「特集:次期Windows 7とOffice 14はどう進化するのか?」を参照してほしい)。次の画面は実際にRibbonコントロールやDataGridコントロールを利用しているWPFのサンプル・アプリだ。
●複数のCLRのロード
.NET 4では、基礎エンジン部分にも改良が加えられ、同じプロセスに(.NET 2〜3.5の)「CLR 2」と(.NET 4の)「CLR 4」の両方をロードできるようになる。
つまり例えば、CLR 2向けに作成したアドインなどのプログラムがあったとして、これをロードするには、従来、最新のCLR上で実行できるようにアップデートしなければならなかったが、次期.NET 4では同時にそれぞれのCLRをロードして同じアプリ内で異なるCLRを利用できる。
●Dynamic Language Runtime(DLR)
.NET 4は前掲の図で分かるように、コアに「Dynamic Language Runtime」(動的言語ランタイム。以降、DLR)を含んでいる。これにより、IronPython(アイアンパイソン)やIronRuby(アイアンルビー)やJavaScriptのような動的言語が.NET Framework上で使えるようになる。
●Managed Extensibility Framework(MEF)
.NET 4には、アプリの実行時に動的に機能を追加・拡張できる「Managed Extensibility Framework」(以降、MEF)が搭載される。これにより、アプリに標準的なプラグイン・モデルを簡単に実装できるようになる。クライアント・アプリ、サーバ上のWebアプリ、Silverlightアプリなどで利用可能だ。
以下の画面はMEFの(プレビュー版に含まれる)サンプル・アプリである。このアプリ(XFileExplorer)は、Windowsエクスプローラのようなフォルダ/ファイルを操作するためのもので、WPFで作られている。
このアプリでは、「Addins」フォルダにプラグインである「XFileExplorerComponents.dll」ファイルを追加すると、その場で次の画面のように[Size Pane]タブが表示され、その機能が実行できる。これはMEFで行えることの一例である。
●Parallel Extensions(並列プログラミング)
近年のCPUの性能向上は目覚ましいが、それに加えて最近はCPUのプロセッサ・コアを複数にして並列動作させるマルチコア(2つのデュアル・コアや、4つのクアッド・コア)が発達してきている。最近はさらにその勢いが増しており、「Multi」(複数)から「Many」(たくさん)へと進化しようとする動きがある。
このようなハードウェア側の進化に合わせ、ソフトウェア側でもそれを徹底的に活用する「並列プログラミング」が最近注目を集めている。特に複雑なアルゴリズムや巨大なデータ群を取り扱うときには、並列プログラミングが有用である。複数のプロセッサ・コアで並列にそれらを処理するとパフォーマンスが向上するからだ。
しかしながら実際にマルチコアの利点を生かすようなマルチスレッドのコードを書くのは簡単ではない(実装したとして、一見正常に動いているように見えても、特定の条件でエラーが発生するようなことが起こりやすい)。
そこで、並列処理機能が言語そのものに組み込まれている「Erlang」(アーラン)などのプログラミング言語が最近注目されてきているが(例えばTwitterの一部はErlangで書かれているらしい)、.NETもこの流れに素早く対応しようと考えているようで、それが.NET 4の「Parallel Extensions」(並列処理拡張)という形で実現されている。
Parallel Extensionsは主に次の2つの機能を提供する。
いずれの機能も.NETのコアに組み込まれる(TPLはmscorlib.dll、PLINQはSystem.Core.dll)。
TPLでは、標準のコードとほとんど同じ構文やキーワードで、処理コードを簡単に並列処理に対応させられる。例えば次のコードのようにforループがあり、そこで非常に負荷の高い処理をしていると仮定する。
for (int i = 0; i < 10000; i++)
{
// 重い処理
}
通常、このようなコードだとマルチコアのマシンであってもシングルコア(=1つのプロセッサ・コア)で処理してしまう。このため、1つのプロセッサ・コアは多忙でも、ほかのプロセッサ・コアは暇である可能性が高い。
しかしこのときの処理は、ほかのプロセッサ・コアにも振り分け、並列して行った方が、パフォーマンスが向上するケースがある。このような場合、次のように書き換えることで、TPLを使った並列処理を実現できる。
Parallel.For(0, 10000, delegate(int i)
{
// 重い処理
});
見て分かるように、「for文」を「Parallelクラス(System.Threading名前空間)のForメソッド」に置き換えているだけで、行数は同じだ(ただし、ループする処理コード部分は匿名メソッドになっている)。たったこれだけで、並列処理に対応できる。なお、ParallelクラスにはForメソッド以外にも、ForEachメソッドやInvokeメソッドなどがある。
また、TPLのTaskクラス(System.Threading.Tasks名前空間)を使って、複数のタスク(=処理作業)を並列処理することもできる。次のコードは3つのタスクを同時に並列処理している。
Task task1 = Task.StartNew(delegate
{
// 重い処理1
});
Task task2 = Task.StartNew(delegate
{
// 重い処理2
});
Task task3 = Task.StartNew(delegate
{
// 重い処理3
});
続いてPLINQだが、名前から分かるように言語に組み込まれているデータ・アクセス技術のLINQを並列処理に対応させる新機能だ。次のコードは、従来のLINQの実装例である。
var q = from file in fileList
select file;
これを次のコード例のように「.AsParallel()」というキーワードを付け加えるだけで、そのデータ処理が並列化されるようになる。
var q = from file in fileList.AsParallel()
select file;
●“Velocity”(分散キャッシュAPI)
頻繁なデータ・アクセスは、パフォーマンスのボトルネックになることが多い。例えば多くのWebアプリは、RDBMS(やハード・ディスク上のファイル)にデータを保存しておき、閲覧者からアクセスがあるたびにそのデータを取得しようとする。このデータが大容量だったり、アクセスが集中し出したりすると、RDBMSへの負荷が高まり、結果的にWebサイトの反応が遅くなることがある。
このような場合、データを(データベースやファイルではなく)複数のサーバに分散させてインメモリのキャッシュとして保持しておき、通常のデータ・アクセスは、クラスタリング(=多重化)され1つのビューに統合されたその分散キャッシュ(Distributed Cache)に対して行うようにするという手法が考えられる。こうすることで、データベースやファイルといったデータソースからのデータ取得を必要最小限に減らせる。この手段を提供するのが、分散キャッシュ・サービスである“Velocity”(コード名)だ。
“Velocity”は、最近人気を集めている「memcached」の類似技術で(参考:「gihyo.jp:memcachedを知り尽くす」)、複数のキャッシュ・サーバ(=“Velocity”サービス)を1つのキャッシュ・クラスタとして構成する機能や、分散キャッシュへアクセスするためのAPIを提供する。
“Velocity”の利点は、分散キャッシュへのアクセスが自動的にロード・バランスされ、複数のサーバに負荷が分散されるので、高いパフォーマンスの向上を期待できること。そして、たとえ負荷が増大してきても、キャッシュ・サーバを増やすことでそれに柔軟に対応できるので、スケーラビリティも確保できることだ。
この“Velocity”は現在、単独でCTP版が公開されているが、.NET 4にはそのAPIが搭載される。具体的に、.NET 4でこの分散キャッシュにアクセスするには、次のコードのように、CacheFactoryクラス(System.Data.Caching名前空間)のインスタンス(=キャッシュ・クラスタ)から特定のキャッシュ(この例では「cacheName」)のオブジェクトを取得し、それを使ってデータを追加したり(=Addメソッド)、更新したり(=Putメソッド)、取得したり(=Getメソッド)、削除したり(=Removeメソッド)できる。
var cacheCluster1 = new CacheFactory();
defCache = cacheCluster1.GetCache("cacheName");
defCache.Add("key1", "この文字列がキャッシュに保存される。");
defCache.Put("key1", "データを更新する。");
var val = (string)defCache.Get("key1");
defCache.Remove("key1");
なお、上記のコードではCacheFactoryクラスのインスタンスを生成してキャッシュ・クラスタのオブジェクトを取得しているが、このキャッシュ・クラスタ(と、それに含まれるキャッシュ・サーバ群)はアプリケーション構成ファイル(app.config/Web.config)などで定義できる(“Velocity”のプログラミングに関する詳細はMSDNを参照してほしい)。
続いて、次期「Visual Studio 2010」の新機能を紹介していこう。
Copyright© Digital Advantage Corp. All Rights Reserved.