ランタイムでOSの機能を覆い隠す

表1● .NET Framework対応/対応予定の言語。
.NET Frameworkはデータの内部表現形式やモジュール間のデータの受け渡しの方法などを公開しているので,この仕様に準拠すれば .NET Framework用の他の言語とやり取りできるようになる
図6●.NET Frameworkと開発ツールのバージョンアップ。
ランタイムである .NET Frameworkの大きなバージョンアップに対応して開発ツール(Visual Studio .NET)もバージョンアップする。

 では,本連載で取り上げるC#はどうなっているのでしょう。C#は,Microsoftが開発した「 .NET Framework」というランタイム・ライブラリを使います。プログラミングの入門にC#を勧める第一の理由がこの .NET Frameworkにあります。

 .NET Frameworkは,MFCやVBのランタイムなどより新しい考え方に基づいています。これまで説明してきたように,従来のランタイムは「Win32 APIを利用しやすくする」ことを考えて作られてきました。

 これに対して .NET Frameworkは「Win32 APIをアプリケーションから好き勝手に利用できないようにする」ことを考えて作られています。プログラムからの要求をWin32 APIの組み合わせに落とし込むという点では .NET Frameworkも他のランタイムと同じです。しかし .NET Frameworkはその傍らで,プログラムがどんな動作をしようとしているかを吟味し,システムを不安定にしたりセキュリティを低下させたりするような行儀の悪いプログラムからOSを守ります。MFCやVBのプログラマは必要に応じてWin32 APIを個別に呼び出すこともできましたが,.NET Framework用のプログラミング言語からはWin32 APIを呼び出せないようになっています*4

 「行儀の悪い」とは,例えば「バージョンの異なる部品を参照しようとしている」「メモリー領域をムダに消費している」「普通のプログラムならまったく必要ないようなOSの重要な設定ファイルを書き換えようとしている」などです。

 世の中に行儀の良いプログラムしかなければこのような仕組みは必要ないかもしれません。しかし今日では,インターネットからダウンロードしたばかりのアプリケーションのように,100パーセント安全だとは言い切れないプログラムを使わざるをえない場面があります。このような状況では, .NET FrameworkのようにOSのAPIを覆い隠す形態のランタイムが有効だと考えられているのです。

2005~2006年には.NET Frameworkが標準APIに

 Javaを勉強したことがある人は,.NET FrameworkがJavaとよく似ていることに気づいたのではないでしょうか。実際に,ランタイムでOSのAPIを覆い隠してアプリケーションに好き勝手な振る舞いをさせないようにする考え方や,プログラムを書いてから実行するまでの仕組みはよく似通っています(カコミ記事「行儀の悪いプログラムを見張る仕組み」を参照)。

 ただ,.NET FrameworkはJavaより後に登場したため,Javaのランタイムにない特徴をいくつか備えています。一つは,様々なプログラミング言語に対応できることです。JavaはJava言語でのプログラミングが前提ですが,.NET Frameworkはプログラミング言語を限定していません。どんな言語からも利用できるように,あらかじめデータの内部表現方法や部品同士のデータの受け渡し方法を統一し,標準仕様として公開しています。ある言語で作ったライブラリを別の言語で利用することも難なくできます*5。現在,Microsoftが提供しているのはC#,C++,Visual Basic .NET,JScript .NET,Java言語ですが,既にさまざまなプログラミング言語を .NET Framework対応にする動きがあります(表1[拡大表示])。

 しかも .NET Frameworkが提供するAPIは今後,Win32 APIに代わってWindowsプログラミングの標準APIになります。現在の .NET FrameworkはWindowsの機能の一部をカバーできていないのですが,2005~2006年ころに登場予定のWindows XPの後継製品では,通常のアプリケーションが必要とする機能を全てカバーした新版「WinFX」を搭載する予定です。このWinFXが登場するとWin32 APIを直接使うプログラムは除々に減っていくでしょう*6

C#なら.NET Frameworkを最大限に生かせる

 .NET Frameworkのメリットはさておき,多様な言語が使えるのなら得体の知れないC#ではなく,よく耳にするC++やJava,あるいはVBでもいいのではないかと思うかもしれません。確かに,何らかの言語を使ってWindowsプログラミングをした経験があるなら,その言語の .NET Framework対応版を検討する価値はあります。

 特に,VBの経験があれば,Visual Basic .NET(VB .NET)は有力な選択肢です。VBの開発者は非常に数が多く,C#を除けばMicrosoftからのサポートが最も期待できます。

 ただ,これからWindowsプログラミングの世界に入門する人にはやはりC#をお薦めします(カコミ記事「C/C++経験者にもC#がお薦めです」参照)。それはC#が .NET Frameworkのプログラミングのために新しく設計,開発された言語だからです。

 .NET Frameworkは,これからどんどん拡張されていきます。追加される機能の中にはWin32 APIで既に実現していた機能を .NET Framework上に移植したものもあれば,.NET Frameworkで初めて用意される機能もあるでしょう。現在,.NET Frameworkの最新バージョンは1.1ですが,2004~2005年にかけてデータベース管理システムの機能を組み込むなど大規模な拡張を施したバージョン2.0が登場する予定です。先ほど紹介したWinFXはこの延長線上にあり,1.1から2.0よりさらに大きなバージョンアップとなる見込みです(図6[拡大表示])。これら拡張された機能を活用するために開発ツールも併せてバージョンアップします。 .NET Framework2.0に対応するのが「Whidbey(開発コード名)」,WinFXに対応するのが「Orcas(同)」と呼ばれている開発ツールです*7

 現在のC#とVB .NETは文法や細かな仕様の違いを除けばほとんど同じ機能を持っており,Microsoftが提供している開発ツールの使い勝手もほとんど違いがありません。しかし,Microsoftは今後のバージョンアップで開発ツールの方向性を明確に分けることを明らかにしています。

 VB .NETは「なるべくプログラムを書かずに済ませたい」ユーザー向けの強化が中心です。従来のVBユーザーにとっての親しみやすさを重視しているためです。一方,C#については,一度作ったプログラムを改良/保守するための機能や,使い回しのきく部品の開発を助ける機能など,引き続きプログラムを書くユーザーを重視した強化が中心です。

 また,開発ツールの機能拡張だけで対応できない場合には,言語仕様が拡張されることもあります。そのような場合にも,初めから .NET Frameworkを前提としてユーザーがゼロの状態からスタートしたC#は,既に拡張に拡張を重ねているVBと比べてずっと身軽です。.NET Frameworkの進化に合わせて最新のプログラミング技術を自然な形で取り込んでいける,もっとも .NET Frameworkプログラミングに適した言語なのです。

☆          ☆          ☆

 .NET FrameworkとC#を組み合わせて使うメリットがおわかりいただけたでしょうか。次回はいよいよC#の開発ツールを使って実際にプログラムを動かしてみましょう。


行儀の悪いプログラムを見張る仕組み

図A●プログラミングから実行までの流れの違い。
(a) 従来は,実行形式ファイルはマシン語にコンパイルされ,起動すればそのまま実行された。(b) .NET Frameworkでは,中間言語にコンパイルされ,起動時にCLR(共通言語ランタイム)がコンパイルしながら実行する

 OSのAPIをランタイムで完全に覆い隠してしまう考え方を「フレームワーク指向」と呼び,そのランタイムを「フレームワーク」と呼ぶことがあります。これを実現するために .NET FrameworkやJavaは「中間言語」という考え方を取り入れています。

 (フレームワーク指向でない)通常のプログラミングでは,プログラムを「コンパイラ」と呼ぶアプリケーションで解析し,PentiumやSPARCといった各プロセサのマシン語に変換します(図A(a)[拡大表示])。これに対し,.NET FrameworkやJavaではこの変換作業を二段階に分け,プログラミング言語とマシン語の間にもう一つ言語をはさんでいます。これが中間言語です。

 .NET Framework向けのコンパイラはいずれも「MSIL(Microsoft Intermediate Language)」という中間言語を出力します(図A(b)[拡大表示])。当然ですがMSILはそのままではWindowsマシンでは動作しません。マシン語への変換は .NET FrameworkのCLR(共通言語ランタイム)というプログラムが処理します。 .NET FrameworkにはMSILをマシン語に変換するコンパイラが搭載されており,プログラムをWindows上で実行しようとすると,.NET Frameworkがその場でMSILをマシン語に変換しながら実行していくのです。MSILのプログラムは,CLRを通さないことにはOSに一切手出しができませんから,フレームワーク指向を実現するのにはぴったりの方法なのです。


C/C++経験者にもC#がお薦めです

 C/C++の経験がある人にとってもC#が .NET Frameworkプログラミングの現実的な選択肢でしょう。MicrosoftはC++を .NET Framework対応にした「Managed C++」という拡張仕様を作っています。これを使えば,C++でも .NET Frameworkを利用できます。しかし,この拡張仕様はC++で書かれたプログラムを既に大量に抱えている開発者がその移行手段として使うケースなどを想定したものという位置付けです。

 C++のベースとなっているCは,もともとOSなどシステムの開発言語として作られたため,コンピュータのメモリー空間をはじめ,ハードウエアを直接制御するようなプログラム開発に向いています。ハードウエアやOSのAPIを覆い隠して,安全なプログラムを書くことを優先させている .NET Frameworkの考え方とは本質的に相容れない部分があるのです。

 良いお手本がJavaです。Javaと .NET Frameworkのランタイムのメカニズムが似通っていることは前述しましたが,Java言語とC#もよく似ています。Java言語の仕様はC++をベースとしており,C++からプログラムの安全性を損なう可能性が高い機能を省いて作られたと言われています。Javaが一定の成功を収めた後で登場したC#や .NET Frameworkは,Javaに似た戦略を採りながらも後発の強みを生かして,Javaよりよいものを目指して作られています。.NET Frameworkを活用するためにC#はもっとも適した言語なのです。

■変更履歴
表1の説明文が、図6の説明文と重複していました。お詫びして訂正します。[2009/09/17 12:30]