Mono 2.4のアーキテクチャ
ここでは、Mono 2.4のアーキテクチャの各部分について説明します(図1を参照)。
Just-in-Time(JIT)エンジン
Monoランタイムに含まれるJITエンジンは、MIPS(32ビットモードのみ)、x86、SPARC、PowerPC、ARM、S390(32ビットおよび64ビットモード)、IA64(64ビットモード)といった多くのプロセッサに対応しています。MonoランタイムはJITコンパイルの実行によってマシンのネイティブコードを生成し、その結果はアプリケーションの実行中にキャッシュされます。また、実行前にネイティブイメージをあらかじめキャッシュしておくことも可能です。
ただし、Monoの現在の保守的ガベージコレクタ(Boehm-Demers-Wiser Conservative Garbage Collector)には、Java仮想マシンや.NET Frameworkランタイムのような、ガベージコレクションを実行する商用のランタイムに比べると大きな欠点があります。理論的にはメモリリークが発生する可能性があり、発生した場合にはメモリ不足によってアプリケーションが突然終了するおそれがあるのです。これは長期間にわたる実行が求められるサーバーアプリケーションにとって特に重大な問題です。現在、Monoチームは新たな「実用的」ガベージコレクタを開発していますが、これがプロダクションリリースに組み込まれる時期は未定です。
クラスライブラリ
Monoのクラスライブラリは、アプリケーション開発に必要な包括的な機能セットを提供します。主にC#で書かれていますが、共通言語仕様のおかげで任意の.NET言語で使用することができます。クラスライブラリは複数の名前空間に分かれており、アセンブリと呼ばれる共有ライブラリ群に配置されています。.NET Frameworkへの参照は、基本的にこのクラスライブラリへの参照です。
名前空間とアセンブリ
名前空間は、類似するクラスを論理的にグループ化して階層的な構造にするためのしくみです。これにより名前の競合を防ぐことができます。名前空間は単語の区切りにドットを使用して構成され、最上位の名前空間として最も一般的なのがSystemであり、その下にはSystem.IOやSystem.Netなどがあります。最上位の名前空間としては、他にもAccessibilityやWindowsなどがあります。ユーザーは、名前空間ブロックの中に要素を配置することで名前空間を定義できます。
アセンブリは、クラスライブラリを物理的にパッケージ化したものです。Win32の共有ライブラリと同様(ただし混同してはなりません)、.dllファイルの形をとります。アセンブリの例として、mscorlib.dll、System.dll、System.Data.dll、Accessibility.dllなどがあります。名前空間は複数のアセンブリに分散していることが多く、1つのアセンブリは複数のファイルで構成できます。
共通言語インフラストラクチャと共通言語仕様
一般的には共通言語ランタイム(CLR)として知られている共通言語インフラストラクチャ(CLI)は、Monoの実行ファイルによって実装されています。このランタイムは、コンパイル済みの.NETアプリケーションの実行に使用されます。共通言語インフラストラクチャは、ECMA規格によって定義されています。アプリケーションを実行するには、関連するパラメータを用いて共通言語ランタイムを呼び出す必要があります。
共通言語仕様(CLS)は、ECMA-335の第6章で定められており、Enumの基本の型といった規則など、CLIに対するインターフェイスを定義しています。Monoコンパイラは、CLSに準拠した共通中間言語と呼ばれるイメージを生成します。Monoランタイムは、このイメージを受け取って実行します。ECMA規格では、CLAに準拠するライブラリをフレームワークとして正式に定義しています。
マネージドコードとアンマネージドコード
ネイティブの.NET/Monoアプリケーション内では、すべてのコードが管理されます(つまり、メモリ管理およびスレッド安全性に関するCLIのスタイルに支配されます)。その他の.NETアプリケーションやMonoアプリケーションは、System.Runtime.InteropServicesライブラリを使用してC#バインディングを作成することで、アンマネージド(管理対象外)と呼ばれるレガシーコードを利用できます。Gtk#など、Monoに付随する多くのライブラリは、CLIのこの機能を使用しています。
選択肢としてのMono
Monoは、絶え間なく改良が行われているオープンソースのプロダクトです。オープンソースや.NETの開発コミュニティでMonoプラットフォームが積極的に活用されることを願っています。ラピッドWebアプリケーション開発フレームワークを使ってプロジェクトのコストを抑えたい人にとっては、Monoは最適な選択肢の1つになるでしょう。
