DebianでのMono言語コンパイラ
いくつかの重要なオプションからMonoランタイムの特殊性が見えてきます。留意すべき点を1つ挙げると、MonoランタイムはデフォルトではJust-In-Time(JIT)コンパイラのように動作します。つまり、CILバイトコードを解釈する一方で、同じコードをネイティブにコンパイルして、マシン言語でキャッシュします。パフォーマンス上の強みは明らかです。-aotオプションを使用すると、MonoランタイムはAhead-Of-Time(AOT)コンパイルも実装します。つまり、実行に先立ってシステムに依存するバイナリコードを生成するのです。最初に少し余分なコストをかけることでパフォーマンスが最大化されるわけです。
gmcs: Mono C#コンパイラ
マネージコード開発環境では、通常は使用できるすべてのコンパイラで仮想マシン用の実行可能ファイルが生成されます。そういうわけで、どの.NETコンパイラもCIL実行可能ファイルを生成します。コンパイラの出力は.EXEまたは.DLLファイルになります。前者はプロセスアセンブリと呼ばれ、後者はライブラリアセンブリと呼ばれます。
/usr/bin/monoがVisual Studio .NETでコンパイルしたCILプログラムを実行する場合には、Mono自体でCILプログラムを生成することができます。Monoフレームワークには多数のCILコンパイラが用意されています。その中で最も重要なのがC#コンパイラです。なぜなら、C#コンパイラは.NETのリファレンスコンパイラであり、CLRと同様、ECMA標準(ECMA-334)になっているからです。
3つのDebianパッケージは、それぞれのコマンドラインコンパイラを持ち、デフォルトでさまざまなバージョンのCLIとC#に対応しています(表1を参照)。
| コマンド | Debianパッケージ | C#バージョン | CLIバージョン |
|---|---|---|---|
| mcs | mono-mcs | 1.0、2.0(部分的) | 1.X |
| gmcs | mono-gmcs | 2.0 | 2.0 |
| smcs | mono-smcs | 3.0 | 2.1(2.0のサブセット+拡張機能) |
smcsに関しては、Moonlight用のアプリケーションをコンパイルするランタイム2.1用のコンパイラをインストールする必要があります。MoonlightはSilverlightのオープンソースクローンであり、すべてのSilverlight実行可能ファイルを(ブラウザの外部でも)実行できるようにします。
Monoプラットフォームでプログラミングできる言語はその他にも数多くあります。Monoで利用できる言語はすべて.NETでも利用できますし、その逆の関係も成り立ちます(少なくとも、どこでもソースコードをコンパイルでき、生成されるCILコードは他のプラットフォームで「実行可能」であるとは言えます)。既に述べたように、MonoにはMonoまたは.NETランタイムで実行できるCIL実行可能ファイルを生成する一群の言語コンパイラがあります。しかし現時点では、Microsoft Managed C++コンパイラなど一部の.NETコンパイラで生成されるコードはMonoプラットフォームで動作しません。なぜなら、それらのコンパイラは純粋なCILへのコンパイルを行わないからです。
Debianにインストールできる主要なMonoコンパイラを表2に示します。また、異なる言語で書かれたアセンブリ同士の相互作用と再利用(たとえば、C#で書かれたクラスライブラリをIronPythonで書かれたプログラムで使用するなど)を可能にする仕組みを図1に示します。
| 言語 | コマンド | Debianパッケージ |
|---|---|---|
| Visual Basic 2005 | vbnc | mono-vbnc |
| libmono-microsoft-visualbasic8.0-cil | ||
| Boo | booc | boo |
| Nemerle | ncc | nemerle |
| IronPython | ipy | ironpython |

