ものがたり(旧)

atsushieno.hatenablog.com に続く

mono 2.10以降のmcs/csharpの変更について

先に書いたとおり、mono 2.10ではmcsのコード生成エンジンの実装が大きく変わりました。これまではSystem.Reflection.Emitをコード生成に使用していて、その結果、生成されるコードはそのコンパイラを使用しているmscorlibに依存するという問題があって、それで2.8以前のmcs (1.x)、gmcs (2.0)、dmcs (4.0)、smcs (2.1, monotouch/monodroid含む) という別々のコンパイラが存在する理由だったわけです。

この問題が、IKVM.Reflectionに切り替わったことで無くなったわけです。現在のmcsでは、-sdk 引数によってビルドするプロファイルのバージョンを指定できます。

mono 2.10では、gmcs, dmcs, smcsは従来通りSystem.Reflection.Emitを使用しているようですが、今後のmonoのバージョンでは、全てIKVM.Reflectionベースのmcsとなり、gmcs, dmcs, smcsは単なるエイリアスになるでしょう。

ちなみにREPL環境として改善されたcsharpではSystem.Reflectionが使われているようです。リリースノートに書いてあるのですが、↓のようなスクリプトが実行出来るというのはなかなかいいですね。


$ csharp -e 'Math.Sin(0.1);'
0.0998334166468282
$ csharp -e 'from l in System.IO.Directory.GetFiles ("/bin") where l.Length > 18 select l;'
{ "/bin/dbus-cleanup-sockets", "/bin/showconsolefont" }
$