はじめに
Debian GNU/LinuxとMonoは、オープンソースソフトウェアの2つのリーダーです。Debianは、フリー/オープンソースソフトウェアの精神を最もよく表現するものとして知られる社会契約を持ったLinuxディストリビューションです。一方のMonoは、.NETのためのオープンソース開発プラットフォームです。ここで考えてみたいのは、Monoは.NETを利用したいDebianユーザーに何を提供しなければならないかということです。
本稿では、DebianユーザーがMono 2.0以降のプラットフォームをどこまで利用できるのかを調べるため、この2つの製品の相性を見ていくことにします。まずMonoの全体像を把握し、次にDebianパッケージを調べて、最新の.NET互換性に関するコマンドと情報を明らかにします。
Monoについて: 仮想マシンとマネージコード
仮想マシンとマネージコードという概念は古くからあるものですが、ここ10年ほどで復権してきました。この概念を復権させたのはJavaであり、その後、.NETによって復権が後押しされました。JavaにおいてはJava仮想マシン(JVM)とバイトコード、.NETにおいては共通言語ランタイム(CLR)とマネージコードという形でこの概念が実現されています。マネージコードはCPU上で直接実行されるのではなく、仮想マシン(VM)上で実行されます。VMはCPUとそのマシンコードの間にある中間レイヤであり、CPUと同じような働きをします。実質的にVMはCPUの代わりとなるもので、バイトコードはマシンコードの代わりとなるものです。このアプローチは主として移植性を確保するために使われています。互換性の問題がすべてVMレベルで解決されれば、バイトコードプログラムはVMが存在するすべてのプラットフォームで動作することになります。そうなれば、セキュリティとメモリ管理の観点からもメリットがあります。
.NET CLRで動作するプログラムは共通中間言語(CIL)という言語で書かれています。MonoランタイムはCLRのオープンソース実装なので、CILで書かれたコードを実行できます。そのため、Monoが動作するすべてのCPUとオペレーティングシステムが、.NET Visual Studioコンパイラで生成されたあらゆるCILバイナリコードに開かれます。
DebianでMonoを使用する
Monoを使用するためには、まずMonoランタイムをインストールする必要があります。MonoランタイムはCIL実行可能ファイルを実行するための仮想実行環境を提供します。aptユーティリティでインストールする最初のDebianパッケージはmono-jitです。
apt-get install mono-jit
この後で/usr/binの下を調べると、Mono Linux実行可能ファイルであるCILプログラム用インタプリタが見つかります。ここから先はMonoのバージョン2.0をダウンロードしてインストールするために、Debian GNU/Linuxの「不安定(unstable)」バージョンを使用します。不安定バージョンというのは誤解を招きやすい呼称です。これは最新のパッケージが含まれている完全に機能するDebianリリースを指すものだからです。
.NET実行可能ファイルは.exeファイルですが、他の.exeファイルと違って、CLRなしに単独で実行することはできません。Monoを使用すれば、次のような簡単なコマンドで実行できます。
mono program_name.exe
Monoが新たなWindowsエミュレータでないことは明らかです。MonoはCILで書かれて.NETコンパイラで生成されたWindows Portable Executable(PE)プログラムしか実行できません。
gendarmeとその他のMonoツール
mono-tools-develとmono-tools-guiという2つのパッケージには、MonoとCLRプラットフォームの構造を説明するのに役立つ有益なツールが含まれています。
- mono-tools-devel
- create-native-map
- gendarme
- mono-tools-gui
- gasnview
- ilcontrast
- gui-compare(とても興味深いツールです)
これらのツールの中で、gendarmeは特に注目に値するツールです。gendarmeを使用するとCILコードを直接検査して、コンパイラが見つけられない問題点を突き止めることができます。