矢沢久雄 文化オリエント アドバイザリースタッフ

●はじめに

 今回は,.NETによってプログラミング・スタイルがどのように変わるのかを説明します。.NETは,OSやプログラミング言語に依存しない汎用性を目指しています。それを実現するために,プログラミング・スタイルが大きく変化します。Windowsが提供するAPI(Application Programming Interface)や,特定の開発ツールに依存したライブラリ(Visual C++のMFCやATL,Visual Basicのランタイム・ライブラリなど)は使いません。その代わり,.NETのための統一的な実行環境として新たにCLR(後述)が提供されます。

●サービス指向とオブジェクト指向プログラミング

 第1回で,Webサービスの実態は関数であると説明しましたが,実際には複数の関数と変数をセットにした「クラス」としてWebサービスを作成します。クラスは,1つのまとまったWebサービスを提供するために必要な関数と変数をセットにしたものです。そして,複数のクラスの機能を連携させることで,目的のソリューションが実現されるのです。

 クラスを使うことから,.NETのプログラミング・スタイルは必然的にオブジェクト指向プログラミングとなります。今までにオブジェクト指向プログラミングの経験のなかった人は,ちょっと不安になることでしょう。ただし,それほど難しく考える必要はありません。プログラムを物(オブジェクト)の集合体としてとらえ,1つひとつのオブジェクトをクラスとして作成し,クラスを連携させてプログラム全体を構築すればよいだけのことだからです。

 オブジェクトは,様々な場面で再利用可能なソフトウエア部品となります。Webサービスは,インターネットというグローバルなプラットフォームで再利用できるソフトウエア部品とも言えるのです。

図1●.NETに対応したプログラムはCLR上で動作する

●CLRとIL

 .NETでは,プログラムは大きく2種類に分けられます。.NETに対応したmanaged codeと,.NETに対応していないunmanaged codeです。「.NETに対応している」とは,.NETの実行環境であるCLR(Common Language Runtime,共通言語ランタイム)上で動作するIL(Intermidiate Language,中間言語)となっているプログラムのことです。一方「.NETに対応していない」とは,特定のCPUやOSに依存したネイティブ・コード(マシン語)となっている従来のプログラムのことです。

 冒頭で述べたように,.NETは特定のOSやプログラミング言語に依存しないことを目指しています。そのため,.NETに対応したプログラムはILにコンパイルされ,CLR上で動作するのです。これは,Javaで作成されたプログラムがバイト・コードにコンパイルされ,Java VM(Java仮想マシン)上で動作することに似ています。

 CLRは,実行時にJIT(Just In Time)コンパイラでILのプログラムをネイティブ・コードに変換します。図1[拡大表示]は,C#で記述されたソースコードがILにコンパイルされ,CLR上で動作するまでの流れを示したものです(C#に関しては,第4回で説明します)。

 WebサービスをSOAPを介して呼び出し,その処理結果をXMLで返すだけなら,WebサービスがCLR上で動作するILである必要はありません。CLRは,同じILを異なるOS上で動作させることを目指したものです。マイクロソフトは,Windows用のCLRを提供します。将来的にマイクロソフト,あるいは他社が他のOS用のCLRを提供すれば,プログラムの再利用性が大いに向上するでしょう。

●プログラミング言語の垣根がなくなった

 Javaをご存知なら,CLRとILを使った.NET対応プログラムの仕組みがJavaに似ていると思われたことでしょう。ただし,.NETにはJavaにない利点があります。それは,様々なプログラミング言語が使えるということです。表1は,.NETに対応または今後対応予定のプログラミング言語の一覧です。プログラマは,自分の得意なプログラミング言語で.NET対応プログラムを作成することができるのです。

 .NET対応プログラムをコンパイルすると,どの言語で作成しても統一的なILとなります。したがって,1つのプログラミング言語で作成されたクラスを他のプログラミング言語で再利用することも可能です。例えば,Visual Basic.NETで作成されたクラスをVisual C++.NETで再利用したり,その逆も可能なのです。

図2●アセンブリの構造

●アセンブリ

 .NETに対応したコンパイル済みのプログラムのことをアセンブリと呼びます。メイン・ルーチン持つアセンブリは実行ファイル(EXEファイル)となり,ソフトウエア部品となるアセンブリはDLLファイルとなります。

 アセンブリは,プログラム本体であるILと,プログラム(クラス)を使うための情報であるマニフェスト(manifest=荷札,目録)から構成されます。リソース(プログラムで使用する交換可能なデータ)を結合することも可能です(図2[拡大表示])。マニフェストを持つことから,アセンブリは自己記述型(自分の呼び出し情報を持っていること)で独立性の高いソフトウエア部品となります。アセンブリは,コピーするだけですぐ使用できます。従来のCOM(Component Object Model)のようなレジストリ登録は不要です。

図3●CLRが提供する主なクラス・ライブラリ

●クラス・ライブラリ

 CLRは,.NETに対応したすべてのプログラミング言語から利用可能なクラス・ライブラリを提供します。.NET対応プログラムは,クラス・ライブラリが提供する様々なクラスの機能を使います(図3[拡大表示])。

 クラス・ライブラリの機能を使えば,WebサービスとWebアプリケーション(Webサービスを利用するプログラム)だけではなく,スタンドアロン・マシンで動作するWindowsアプリケーションを作成することもできます。

 部分的にunmanaged codeを使えば,.NETに対応したプログラムからAPIを呼び出すことも可能です。ラッパーとなるクラスを作成すれば,COMを呼び出すことも可能です。ただし,再利用性を考えるなら,CLRが提供するクラスだけを使ってプログラムを作成するべきでしょう。

●おわりに

 .NETに対応したプログラムを作成するためには,皆さんが得意なプログラミング言語を使うことができます。ただし,新たにCLRが提供するクラスライブラリの機能をマスターすることは不可欠となります。これがプログラマにとって最も大きな変化と言えるかもしれません。ちょっと大変ですが,勉強は避けられません。マイクロソフトは,.NETに対応した新しいプログラミング言語としてC#を提供しています。C#は,.NETの主力開発言語となるものです。次回は,C#の特徴を説明しましょう。