米Microsoftが .NET構想を打ち出したのが2000年6月だから,それからもう3年が経ったことになる。当時の .NET戦略の発表は衝撃的だった。何しろ,それまでWindows DNAなどといって,サーバーからクライアントまですべてをWindowsで囲い込もうとしていた企業が,180度方針転換とも取れる戦略を発表したのだから。

 ただ,開発ツールのVisual Studio .NETやメッセージング・サービスの .NET Alertなど,その後出てきたモノを見るとWindowsでしか利用できないモノばかりだ。Visual Studio .NETで開発した独自プログラムもWindowsでしか動作しない。それどころか「.NET Framework」をWindows UpdateなどでインストールしないとWindowsでも動かない。

 でも,「やっぱり .NETはWindowsだけのものなのか」と思うなかれ。「.NETはOS(Windows)に依存しない環境だ」といったMicrosoftの言葉はウソではなかった。

仕様がオープンでソース・コードも公開されている

 .NETの実行環境はCLI(Common Language Infrastructure)として欧州の標準化団体ECMAによって2001年12月に承認され,今ではECMA-335として仕様がオープンになっている(関連情報)。同時に,Microsoftが .NET向けに開発したC#言語も,ECMA-334として承認された(関連情報)。現在はいずれもISOで審議されており,ISO標準になるもの時間の問題だ。

 これは,だれでもCLIとC#言語の仕様を無償で入手し,それを基に実装できることを意味している。Windows以外のLinuxや超漢字(BTRON)などにCLIを実装することも,その気があるなら可能だ。仕様を基にゼロから開発するのがしんどいと思ったら,SSCLI(Shared Source CLI)が参考になる。これは,MicrosoftがCLIのサンプル実装として2002年11月に公開したもので(関連情報),用途が学術用途ならばソース・コードをだれでも無償で入手できる。

 SSCLIはWindows XPだけではなく,FreeBSDとMacOS X向けにも作られている。つまり,すでにFreeBSDとMacOS XにもMicrosoft純正の .NET実行環境が存在し,動作しているわけである。今では米Macadamian Technologiesによって,Linuxにも移植されている(関連情報)。

 ただ,ECMA標準となって仕様がオープンになっているCLIは,MicrosoftがWindows向けに出している .NET Frameworkのサブセットである。つまり,Microsoftが言っている「.NETはオープンである」とはウソだ。

 Windowsアプリケーション用クラス・ライブラリのWindows Formや,Webアプリケーション/XML Webサービスの仕組みであるASP .NET,データベース・アクセスの仕組みであるADO .NETなど,実用を考えたら不可欠な技術は,仕様は公開されていないし,SSCLIにも実装されていない。SSCLIで動作するのは,コンソール・プログラムだけだ。これでは,お遊びにもならない。

ASP .NETがLinuxで動作する

 だが,世の中にはすごい人たちがいるものである。仕様が非公開のWindows FormやASP .NET,ADO .NETまでも独自に実装しようとしている人たちがいる。米Ximianが手がけているMono Projectである。彼らは,UNIX(Linux)上に,Microsoftの .NET Framework互換環境を作り上げようとしている。

 すでに述べたように,これらに関しては仕様は公開されていない。そこでMono Projectでは,振る舞いやクラスに実装されているメンバー(フィールドやメソッド,プロパティなど)を調べて,互換の環境を開発しているようだ。

 Linuxお得意のオープンソース・プロジェクトなので,CLIに含まれているクラスのソース・コードを調べてみたら,MicrosoftのSSCLIとは見事にといっていいほど,完全に違っていた。ちなみにSSCLI(Microsoft)の実装は「何でこうするの」というコードが見受けられたのに対して,Monoの実装は「なるほど,そうだよなぁ」というコードが多かった。

 Mono Projectは,プログラムの実行環境だけではなく,C#言語コンパイラやVisual Basic .NET言語コンパイラ,GUIのデバッガ,Javaバイト・コード→ MSIL(Microsoft Intermidiate Language= .NETのマシン語)変換プログラムなどの開発ツールも独自に開発している。

図1●LinuxでASP .NETプログラムをホスティングする(画像クリックで拡大表示)
Windows上のVisual Studio .NETで開発したサンプル・プログラムをそのままLinuxにコピーしただけである。URLに「localhost」とあることからLinuxマシンがサーバーになっていることが分かる。ポート番号は標準で8080だが,任意に指定可能である。
図2●Windowsでホスティングしたものと比較する(画像クリックで拡大表示)
右下がWindowsのIISでホスティングしたもの。左上がLinuxでホスティングしたもの。微妙にラベルの大きさや言語が異なるが,同じように動作する。ついでに,リストボックスに,このWebアプリケーションが呼び出しているアセンブリ( .NETのライブラリ)を表示するコードも追加してみた。Windowsでホスティングした場合には,バージョンが「1.0.5000.0」と表示される。これは .NET Framework1.1のバージョンである。これに対して,Linuxでホスティングしたときは「0.0.0.0」や「1.0.0.0」と表示される。
 2003年5月現在の最新バージョンは5月6日に公開された0.24で,まだ開発途上だが,CLIとして仕様がオープンになっているコンソール・プログラムだけでなく,すでにASP .NETはほぼ完全に動作している。Monoのドキュメントによると,MicrosoftがASP .NETのサンプルとして公開している「I Buy Spy」も一部手直しすることで動作したようだ。

 ASP .NETはWebアプリケーションだから,それをホスティングするWebサーバーが必要だ。Mono Projectはこれも作っている。Mono ProjectのWebサイトではXSPというASP .NETのホスティング用Webサーバーが公開されている。Apacheのモジュールも開発されているようだ。

 試しにXSPを使ってLinuxでASP .NETをホスティングしてみた。ボタンをクリックしたときに,カレンダー・コントロールで選択されている日付をラベルに表示するという簡単なものだが,これが見事に動作する(図1[拡大表示],図2[拡大表示])。

 Windows上のVisual Studio .NETで開発し,IIS(Internet Information Services)上で動作を確認したASP .NETアプリケーションを,そのままディレクトリ(フォルダ)ごとLinuxにコピーしただけで動いてしまう。一つのWebアプリケーションが,WindowsクライアントとLinuxクライアントのどちらからも利用できるのとはわけが違う(これは当たり前)。Delphiで開発したプログラムをKylixで再コンパイルして動かしたのとも違う。Windows上で動作していたプログラムがそのままLinux上で動くのである。まさにJavaと同じだ。

将来はWindowsアプリケーションも動作

 ASP .NETだけでなく,Mono ProjectはWindowsアプリケーションに必要なWindows Formも開発中だ。.NETはWindowsに依存しない環境だとMicrosoftは言っているものの,ことWindows Formに関しては,Windowsに依存した部分が多く見受けられる。Javaのように抽象化してしまうと実行速度が遅くなるのも一つの原因だと考えられるが,なぜそのような仕様にしたのかの実際のところは,設計したHejilsberg氏本人に聞いてみないことには分からない。

 Windows上でWindows Formを動かす分には,この依存性は何も問題は引き起こさないのだが,これをUNIX(X Window System)という全く別のOSに実装しようとすると,非常にやっかいだ。Mono Projectでは,当初はGTK#と呼ぶWindows Formとは別の独自のGUIライブラリを作って対処しようとしていたようだが,今ではWineを使ってWindows Formそのものを動かそうとしている。

 Wine(Wine is not an emulator)は,X Window System上のWin32 APIライブラリと実行ファイルのローダーである。Windowsエミュレータとして紹介されることも少なくないが,正しくはエミュレータではない。Wineも開発途上にあるが,現在のバージョンでも結構よくできていて,例えばWindowsのメモ帳などはそのまま動かせる。WineのWebサイトにはX Window System上でMicrosoft OfficeやPhotoshopが動作しているスクリーン・ショットがある。

 Mono Projectでは,WineとMonoの実行環境との仲立ちをするプログラム(Stub)を作り,Wineを使ってWindows Formプログラムを動かそうとしている。現在のバージョン0.24でも動作するようだが,残念ながらまだ動かせていない。5月20日付で米OpenLink SoftwareからWineとMonoに対するパッチが公開され,Monoのメーリング・リストでは動作報告もされているが,残念ながらまだ手元の環境ではWindows Formは動いていない。あともう少しのところまできているはずなのだが,どうしてもエラーを起こしてしまう。今後のバージョン・アップに期待するしかない。

MonoによってJavaの牙城を崩せるか

 このように,Monoは思った以上によく動いている。これだけ動けば,実用にもなる日も近いのではないだろうか。特にASP .NETが実用になると,ビジネス分野に非常に大きな影響を与えるに違いない。この分野こそ,Microsoftが .NETで打って出ようとしているネットワーク(インターネット)を応用したビジネスの分野のはずだ。

 そして現在はJavaが幅を利かせている領域である。この分野では,クライアントを問わず,場所を問わず利用できるなどの理由から,Webアプリケーションが主流である。

 少し使ってみれば分かるが,ASP .NETによるWebアプリケーション開発は生産性が高い。リッチなユーザー・インタフェースを提供するクラス・ライブラリが用意されていることや,Windowsアプリケーションと同様にソース・レベルのデバッグができることがその理由の一つだ。Webアプリケーションを作る際に動作環境(Webサーバー)が問われないならば,ASP .NETを選ぶ開発者は相当数に上るに違いない。

 だが現実には,「動作対象がWindows(IIS)だけ」というだけでASP .NETを候補に挙げないことが多いのではないだろうか(その前に,.NETがまだ海のものとも山のものとも分からないので様子見という場合もあるだろうが)。

 その理由の1つにスケーラビリティがあるだろう。最初はPCサーバーで運用を始めても,あとからUNIXやメインフレームに移行するなど,ビジネスの規模拡大に応じてシステムを容易に拡張できることが重要である。そうなると,候補には,どこでも動くJavaしか残らない。

 これが,ASP .NETがLinux(UNIX)でも動くとなると,.NETがビジネスの分野でも俄然現実味を帯びてくる。なぜなら,開発には操作性のよいWindows上のVisual Studio .NETを使い,コストに関して有利なLinuxで運用できるようになるからだ。将来,規模を拡大する必要が出ても,UNIXサーバーにもそのまま移行できる。

 ここ数年,Linuxに代表されるオープンソースに対して批判的なコメントばかりを出していたMicrosoftだが,.NETに関してはオープンソース・プロジェクトが普及のきっかけになるかもしれない。ひょっとするとMicrosoftがオープンソース・プロジェクトと組む日が来るのだろうか。

(山口 哲弘=日経ソフトウエア編集委員)