Mac

Java屋が触る C# / その3 – Mac OS X で Mono のインストール・実行

その1 – Visual Studio Express で Hello World
その2 – コマンドラインでコンパイル・実行
・その3 – Mono のインストール・実行

・.Net って?
.NetFramework 自体は(たぶん)Windows 特有のブランドですが、その実行環境は Windows 固有の物ではなくて CLI(Common Language Infrastructure) という規格に乗っ取ったバーチャルマシンの一種です。
Java では基本的に言語と実行環境に密接なつながりがあり、例外的な環境を除いて通常は Java のソースコードをコンパイルして Java の実行環境で動作させます。
リンクするライブラリも Java で書いたものをクラスパスに通してロードするか、C / JNI を使ってコンパイルしたものをパスに通してネイティブコードを呼び出すしかありません。

CLI の場合は、それに準拠した言語であれば、そのコンパイル済みの中間バイナリ形式は言語の壁を越えて呼び出し、継承が行えるという便利な特性があります。
また中間バイナリ形式はもちろん特定の CPU 固有のインストラクションを含んでおらず、実行時にネイティブコードに変換されます。
これを Windows で実行する 環境の総称が .NetFramework です。
Microsoft が主導しているものの、あくまで CLI が先にあって、その規格に乗っ取った Microsoft製の実行環境が .Net 、といった感じです。

・Mono って?
その1でもちょっと触れましたが Mono は Unix(ライク) OS に移植された CLI の開発・実行環境です。
オープンソースのプロジェクトで誰でも無償で利用できます。
Novell がスポンサーになっていて商用利用のために年間2,500ドルからの有償サポートもあります。

・Mono のインストール
今回は Mac OS X 10.4.8 に Mono をインストールして Hello World を実行してみたいと思います。
インストーラはDownloadsからダウンロードできます。
インストーラは一般的な Mac のインストーラ形式です。実行すると/usr/bin/ 以下にいくつかのコマンドラインツールがインストールされます。

~$ ls /usr/bin/mono*
/usr/bin/mono /usr/bin/monodis
/usr/bin/mono-find-provides /usr/bin/monodocer
/usr/bin/mono-find-requires /usr/bin/monodocs2html
/usr/bin/mono-service /usr/bin/monodocs2slashdoc
/usr/bin/mono-service2 /usr/bin/monograph
/usr/bin/mono-shlib-cop /usr/bin/monop
/usr/bin/mono-xmltool /usr/bin/monop2
/usr/bin/monodiet

・HelloWorld のコンパイル・実行
Mono のコンパイラは csc ではなく、mcs というプログラムです。

$ cat HelloWorld.cs
class HelloWorld {
  static void Main() {
    System.Console.WriteLine (“Hello World”);
  }
}
$ mcs HelloWorld.cs
$ ls -la HelloWorld.*
-rw-r–r– 1 yusukey yusukey 102 Nov 18 12:29 HelloWorld.cs
-rwxr-xr-x 1 yusukey yusukey 3072 Nov 18 12:29 HelloWorld.exe
$ ./HelloWorld.exe
-bash: ./HelloWorld.exe: cannot execute binary file
$ mono HelloWorld.exe
Hello World

Mono でも Windows と同じく .exe ファイルが生成されました。
ただ、Windows と違うのは直接実行できないことです。.exe ファイルを直接実行できるのは .NetFramwork が OS と密接に絡んでいる Windows の強みと言えるでしょう。
ちなみに mcs で生成した HelloWorld.exe を Windows 環境にコピーしたらそのまま実行できました。逆も然り。

・エラーメッセージも Microsoft の実装に準拠?
Mono は実行環境の動作に互換性があるのは当然ですが、コマンドラインツールのエラーメッセージも Microsoft 製のと同等のものが出力されるようです。

Windows の csc でソースファイル名を指定しない場合。

C:\Documents and Settings\Administrator>C:\WINDOWS\Microsoft.NET\Framework\v2.0.
50727\csc.exe
Microsoft(R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft(R) Windows(R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

fatal error CS2008: 入力が指定されていません。

Mono の mcs でソースファイル名を指定しない場合。

$ mcs
error CS2008: No files to compile were specified
Compilation failed: 1 error(s), 0 warnings

結構細かいところまで動作が忠実に再現されているのがわかります。

エラーコードの一覧はMSDNにありました。
残念ながら Safari では左ペインのツリーが Loading… と表示されたままちゃんと描画されません。
Mac で MSDN のドキュメントを見るには Firefox を使うのが良さそうです。