Mono (ソフトウェア)

Monoは、GNOMEプロジェクト創設者のミゲル・デ・イカザが開発した、Ecma標準に準じた.NET Framework互換の環境を実現するためのオープンソースのソフトウェア群、またそのプロジェクト名である。

2018年3月現在、マイクロソフトの子会社であるXamarinと.NET Foundationが開発、販売、サポート業務を行っている。

共通言語基盤  の実装やC#のコンパイラなどが含まれる。

1. 動作プラットフォーム
-------------

Monoはマルチプラットフォームであり、Linux、macOS、iOS、tvOS、watchOS、Android、Solaris、IBM AIX/IBM i、BSD 、Windows、PlayStation 4、Xbox One、Xbox Series X/Sで動作する。

特定プラットフォーム向けに特化したサブプロジェクトも存在する。Xamarin.iOSは、iPhoneやiPad、iPod touchといったiOS固有のAPIやGUIツールキットを.NET向けにラップするコンポーネントである。また、MonoTouchの技術を応用し、Mac OS Xへのネイティブ対応を行うMonoMacプロジェクトも2010年に発表された。同様に、AndroidについてはXamarin.Androidが存在する。

2. プロジェクトの目標
------------

マイクロソフトはFreeBSD、Windows、Mac OS Xで動作するシェアードソースCLIというCLIの実装を公開したが、マイクロソフトのシェアードソースライセンスは商用利用が禁止されているなど、コミュニティにとって十分とはいえない。MonoプロジェクトはPortable.NETプロジェクトとさまざまな点で共通した目標を掲げている。2016年6月にマイクロソフトからMITライセンスに基づいたクロスプラットフォームかつオープンソースの.NET Framework実装として.NET Coreが正式リリースされ、SSCLIは存在意義を失ったが、Monoにも.NET Coreが取り込まれるなどの波及効果が表れている。

3. Monoランタイム
------------

Monoランタイムは多くのプロセッサで動作するJITコンパイラを搭載している。JITコンパイラはアプリケーションの実行中に共通中間言語  コードをネイティブコードに変換し、それらをキャッシュする。実行前にネイティブコードに変換し、キャッシュしておくことも可能である。JITコンパイラが対応するプロセッサはx86、x86-64、IA-64、SPARC、PowerPC、ARM、S/390、MIPSである。それ以外のシステムでは、ネイティブコードに変換するのではなくインタプリタによって逐次バイトコードが実行される。ほとんどの状況で、JITコンパイラによる方法はインタプリタよりもパフォーマンスの点で勝っている。

また、SIMDへの独自対応  など、Mono独自の革新的な機能の取り込みも積極的に行われている。マイクロソフト純正の.NET Frameworkでは、Monoを後追いする形で、バージョン4.6にてSIMDサポートが追加された。

4. 歴史
-----

2000年12月に.NETドキュメントが公開されると、Monoプロジェクトの創始者であるミゲル・デ・イカザは.NET技術に興味を魅かれた。バイトコードインタプリタを調べてみると、彼はメタデータに関する仕様が存在しないことに気がついた。2001年2月、彼は.NETメーリングリストにおいて不足している情報を公開するよう求め、同時にC#の習得のため、C#で書かれたC#コンパイラの開発に着手した。2001年4月、Ecma Internationalは不足していたファイル形式を公開し、デ・イカザはGUADECにおいて彼の開発したコンパイラのデモンストレーションを行った。

Ximianでは、生産性を向上するためのツールを開発するための会議が内部的に行われていた。実現可能性の調査の結果、そのような技術は構築可能であるという結論に至り、Ximianは他のプロジェクトからスタッフを集め、Monoチームを結成した。しかしXimian内部だけで.NETと同等のものを作るには人材が不足していたため、Monoをオープンソースプロジェクトとした。これは2001年7月19日、オライリーカンファレンスによって発表された。

3年近く経った2004年6月30日、Mono 1.0がリリースされた。

2009年12月15日、Mono 2.6がリリースされた。Mono 2.6では、Windows Communication Foundation  や LLVM などをサポートした。
Mono 2.8ではC# 4.0がサポートされた。
Mono 2.8.1ではSystem.Text.EncodingにおいてShift_JISのサポートが追加された。
Mono 3.0.0ではC# 5.0がサポートされ、async/awaitなどが利用可能となった。
Mono 4.0.0ではC# 6.0がサポートされ、またマイクロソフトがMIT License下で公開した.NET Coreにより一部のコンポーネントが置き換えられた。.NET2.0/3.5/4.0のサポートが終了し、浮動小数点演算処理が最適化された。
Mono 5.0.0ではC# 7.0がサポートされた。Visual Studioで利用されているものと同じRoslyn C#コンパイラcscが追加された。
Mono 5.2.0では.NET Standard 2.0のサポートが追加された。monoがデフォルトで64ビットで動作するように変更された。
Mono 5.10.0では.NET 4.7.1・C# 7.2・F# 4.1への対応が追加された。
Mono 5.12.0ではIBM AIXとIBM iに対応した。RoslynベースのVB.NETコンパイラvbcが追加された。

5. プロジェクト名の由来
-------------

esはスペイン語で猿を意味するため、Monoのロゴには猿が描かれている。猿に関する名称はXimianの他のプロジェクトにも見られる。Mono FAQでは、名称の由来に関する質問に対して「我々は猿が好きなのです。」 と回答している。

6. Monoコンポーネント
--------------

Monoは大きく分けて3種類のコンポーネントから構成される。

中核コンポーネント
Mono/Linux/GNOME開発スタック
マイクロソフト互換スタック

6.1. 中核コンポーネント
--------------

中核コンポーネントにはC#コンパイラ、仮想機械、基本クラスライブラリが含まれる。これらはEcma-334およびEcma-335の標準に基づいており、これによってMonoを標準準拠のオープンソースなCLI仮想機械たらしめている。

6.2. Mono/Linux/GNOME開発スタック
---------------------------

Mono/Linux/GNOME開発スタックは、従来のGNOMEや他のフリーなライブラリをアプリケーション開発に活用するためのツール群である。

これに含まれるものとしては、以下のものが含まれる。

Gtk# - GUI開発のためのライブラリ。
Gnome#
WebBrowser - 各種レンダリングエンジンをラッピングしたコンポーネント。
Gecko# - Geckoをレンダリングエンジンとして利用するMozillaライブラリ。
WebKit# - WebKitをレンダリングエンジンとして利用するWebKitライブラリ。特に、Gtk#およびGnome#ではMonoアプリケーションをGNOMEデスクトップにネイティブアプリケーションとして統合することができ、また最新のMonoDevelopを用いることでVisual StudioとWindows FormsのようなRAD開発も可能となった。

データベースライブラリはMySQL、SQLite、PostgreSQL、Firebird、Open Database Connectivity 、Microsoft SQL Server 、Oracle、オブジェクトリレーショナルデータベースdb4oなど、多くのデータベースに接続することができる。

その他にも、UNIX統合ライブラリ、データベース接続ライブラリ、セキュリティスタック、XMLスキーマ言語RelaxNGなど、汎用的な.NET Framework向けの巨大ライブラリプロジェクトとしての側面もある。

6.3. マイクロソフト互換スタック
------------------

マイクロソフト互換スタックは、Windowsの.NETアプリケーションを他のオペレーティングシステムで利用するための機能を提供する。例えば、ADO.NETやASP.NET、Windows Formsなどの実装が含まれる。

ASP.NETへの対応については、XSPというC#で作られた独自のシンプルなウェブサーバにより実現している。

Windows Formsへの対応については、Wineとの協力により開発が行われている。

2017年12月時点では、Windows Presentation Foundation  を実装する予定は無いとしている。Xamarin.Formsによって提供されるXAML開発環境は、WPF/Silverlight/WinRTとは互換性がない。

7. 主な対応ソフト
----------

MonoDevelop
Beagle
Banshee

8. 出典
-----

9. 関連項目
-------

GNOME
IKVM.NET - Java仮想マシンをMonoフレームワーク上で実現するサブプロジェクト。
ノベル
Ximian
Xamarin

10. 外部リンク
---------