特集

Vista時代のVisual C++の流儀(後編)

STL/CLRによるDocument/Viewアーキテクチャ

επιστημη(えぴすてーめー)
2007/05/11
Page1 Page2 Page3 Page4

 本特集ではVisual C++による.NETアプリケーション構築の戦略/戦術として、MFC(Microsoft Foundation Class)でおなじみのDocument/Viewアーキテクチャを踏襲し、DocumentをVisual C++(C++/CLI)で、そしてView(ユーザー・インターフェイス)をC#やVB(Visual Basic .NET/2005)で実装する“言語をまたいだDocument/View”を解説しています。前回の中編「MFCから.NETへの実践的移行計画」では.NET Frameworkが提供するコレクション(System::Collections::Generic名前空間)、そして標準C++ライブラリのコンテナ群(std名前空間)の双方を用いたDocumentの実装を紹介しました。

 本特集の最後は「STL/CLR」を取り上げます。標準C++が言語規格の一部として定めた標準C++ライブラリの.NET版STL/CLRの概要、それによるC++/CLIでのDocumentの実装とDocument/Viewアーキテクチャの構築について解説します。

STL/CLRとは

 Visual Studio .NET 2003のリリースの後、「Microsoft 開発ツール ロードマップ」がアナウンスされました。そこにはVisual Studio 2005(以下VS 2005)の新機能の1つとして、

STL(Standard Template Library)の新バージョンが導入されます。このバージョンのSTLは、マネージ・コードやデータと相互作用するようにチューニングされています。従来のC++アプリケーションの作成にSTLを使い慣れているプログラマーは、CLRベースのアプリケーションにも同じ技法を適用できることが分かります。

という記述がありました*

* 本稿での引用に際しては@ITでの用語統一の基準に合わせて若干修正しています。以下で取り上げている引用も同様の修正を行っていますのでご注意ください。また(〜*)で記述されている文は内容を明確にして読みやすくするために編集部で追記したものです。(編集部)

 さらにその後Microsoft Visual C++チームのアーキテクトStanley B.Lippman氏による「STL.NET 入門」が2004年8月に公開され、そこには、

Visual C++ 2005では、標準テンプレートライブラリ(STL)が.NET Frameworkで使用できるように再設計されています。シリーズの第1回となる今回は、STL.NETの概要を紹介します。

とありました。どうやらロードマップにあった“STLの新バージョン”がこのSTL.NETのようです。この記事ではSTL.NETのメリットが以下のように述べられています。

STL.NETの詳細に入る前に、ある意味避けては通れない疑問があります。Visual C++プログラマーが、System::Collections(名前空間*)やSystem::Collections::Generic(名前空間*)などの、言語に依存しない(.NET標準の*)クラス・ライブラリの代わりに、STL.NETコンテナ・ライブラリを使用するメリットはどこにあるのでしょうか。

一般に、System::Collectionsライブラリはまっ先に選択肢から外れます。その理由は、Visual Studio 2005でGeneric(ジェネリック*)ライブラリが用意されることになった理由と同じです。すなわち、パラメータ化のオブジェクト・モデルが複雑であり、型情報が失われるため安全でないからです。単純な用途については問題ありません。これは、要素数が16以下のコンテナではバブル・ソートを使用しても問題にならないのと同じです。しかし、アプリケーションで現実的な問題に対処するには、より洗練されたソリューションが必要になります。

従って、Visual C++のようなシステム・プログラミング言語にとっての選択肢は、STL.NETとSystem::Collections::Genericライブラリのいずれかになります。では、Visual C++プログラマーがこの2つのうちSTL.NETを選択する理由はどこにあるのでしょうか。また、STL.NETを選択するとして、プログラムがほかの.NET言語から孤立する心配はないのでしょうか。これらは当然の疑問であり、ここで取り上げる価値があります。

1つ目の答えは、拡張性です。Alex Stepanov氏によって考案されたSTLのオリジナル・デザイン・パターンでは、アルゴリズムとコンテナが別のドメイン空間に分離されています。従って、すべてのコンテナに適用できるアルゴリズムを追加したり、アルゴリズムを適用できるコンテナを追加したりできます。これに比べると、Genericライブラリは従来のコンテナ・モデルに近いといえます。このことは、2つ目の答えにもつながります。

2つ目の答えは、統一性です。現役のC++プログラマーがこれまでに築き上げてきたものは、既存のコードばかりではありません。STLライブラリを使ったプログラミングのノウハウも大事な資産です。私たちは、既存のコードだけでなくそうしたノウハウも移行できるようにしたいと考えています。それまでSTLを利用してきたC++プログラマーにとって(STLを利用していない現役のC++プログラマーはまずいないでしょう)、.NETでそれを利用できないことは大きなマイナスです。少なくとも、筆者はそう感じてきました。これについては、多くの熟練C++プログラマーから懸念の声が上がっており、彼らが.NETへの移行を見合わせる理由となっています。

3つ目の答えは、パフォーマンスです。しかし、C++プログラマーはパフォーマンスの問題にうるさいことで有名なので、ここでこの問題に踏み込むのはやめて、後の記事で取り上げることにします。

最後に、STL.NETは確かに素晴らしいが、それを使用することによってC++プログラマーやC++/CLIプログラマーが.NETコミュニティから孤立するのではないか、という疑問にお答えしておきましょう。その答えはノーです。私はそう思っています。この問題については、Anson Tsao、Martyn Lovell、P.J. PlaugerをはじめとするSTL.NETのアーキテクトが徹底的な調査を行っており、IEnumerator、IList、およびICollection(などのインターフェイス*)のサポートを通じてほかの.NET言語との互換性を確保できるようになっています。これについては、後の記事である程度詳しく取り上げる予定です。

 このSTL.NET、スケジュールの問題からか結局VS 2005には搭載されぬままとなりました。そしていま、STL.NETは“STL/CLR”と名を変えて次期Visual Studio(コード名:“Orcas”)で搭載されることになりました。

 STL/CLRは標準C++ライブラリが提供しているvectorクラスやmapクラスなどのコンテナやアルゴリズム、イテレータなどとコンパチブルなクラス/関数群をマネージ・コードで実装したものです。

 STL/CLRの実装に携わったDinkumware社のP.J.Plauger氏の言葉を借りれば、「テンプレート(template)によるC++の“ジェネリック・プログラミングの世界”と、C#(あるいはJava)の“オブジェクト指向の世界”との橋渡しを演じるもの」という位置付けとなります。標準C++ライブラリを駆使した従来のネイティブC++アプリケーションをC++/CLIによって.NET化する際、可能な限り移植に要するre-work(再作成の作業)を抑え、C++プログラマーの負担を軽くするのがSTL/CLRの大きな目的です。

 公式には明言されていませんが、CTP(Community Technology Preview)版からヘッダとライブラリ(アセンブリ)を抜き出せば現VS 2005(VC++8)でも動作するのを確認しています。ただし、March 2007 CTPを境にセーフ・モード(/clr:safe)でないとコンパイルに失敗するようです(もちろん“Orcas”上では「/clr」「/clr:pure」でも使えます)。


 INDEX
  [特集]
  Vista時代のVisual C++の流儀(前編)
  Vista到来。既存C/C++資産の.NET化を始めよう!
    1.Vista時代にC/C++はもはやお払い箱なのか?
    2.C/C++資産をどこまで生かせる?
    3.ネイティブ・オブジェクトをマネージ・コードでくるむ
    4.文字コード変換
 
  Vista時代のVisual C++の流儀(中編)
  MFCから.NETへの実践的移行計画
    1.C++/CLIによるWindowsフォーム・アプリケーション
    2.言語をまたいだDocument/Viewアーキテクチャ
    3..NET移行前のMFCサンプル・アプリケーション
    4.MFCのDocument/Viewアーキテクチャの.NET化
    5.MFCで書かれたDocumentを.NET化する2つの方法
 
  Vista時代のVisual C++の流儀(後編)
  STL/CLRによるDocument/Viewアーキテクチャ
  1.STL/CLRとは
    2.STL/CLRの特徴
    3.Visual Studio 2005で試す
    4.おまけ:NUnitの活用


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間