(-> % read write unlearn)

All opinions expressed are solely my own and do not express the views or opinions of my employer.

.NET とか Mono とか Xamarin とかいったい何? Microsoftのプロダクト?

JVMの世界にいると、.NETやMonoなんてもの、全く知らなくても生きてゆけますし、生きてこれました。

しかし、最近 F# の実行環境をMacに構築したくて、色々ググっていました。 そうすると、どうしても.NETやMono 、Xamarinという単語が登場してきます。

結果、色々学んでので備忘のためにアウトプットしてみます。

.NET Framework 周りのエコシステムと変遷

.NET FrameworkCLICLR
  1. .NET Framework(以下 .NET と略します。)とは、Microsoftが開発・提供する、アプリケーション開発と実行のプラットフォームです。この.NETの1stリリースは2000年でした。
  2. .NETプラットフォーム上ではC#VB.NETF#などの様々な開発言語が使用可能です。
  3. これら各開発言語(開発環境)は、共通言語ランタイム(CLRという実行環境によって動作します。
  4. 共通言語ランタイム(CLRと似た用語に、共通言語基盤(CLIがあります。
    共通言語基盤(CLIは、開発言語を抽象化した開発環境や実行環境のための設計思想と仕様であり、その実装(の1つ)が共通言語ランタイム(CLRです。
  5. CLRは、Microsoftが提供しており、OSSではありません(でした、当時は)。
Microsoft .NETOSS 化へ
  1. しかし、2014年11月に.NETのオープンソース化が発表されます。
  2. そして MacOS XLinux に対応した.NET Core 5が、本当にOSSでリリースされます。
  3. .NET Core 5は、機能的には .NET の最新バージョン*1である.NET Framework 4.6 のサブセットという位置付けです。
  4. 2016年6月には、RedHatが正式に .NET Core のサポートを表明するなど、クロス・プラットフォーム化は着々と進行している様子です。
Mono
  1. 一方、2001年に .NET 互換の環境をOSSで開発するプロジェクトが、Microsoftとは別の場所でスタートします。それがmonoです。
  2. monoには、C#コンパイラCLIOSS実装(つまりCLRと同種の機能を持つ、別実装)が含まれています。
  3. monoのプロジェクトは、やがて紆余曲折ののちにXamarin社に移り、xamarinプラットフォームというものになります。
    xamarinプラットフォームとは、iOSAndroidなどのクロスプラットフォームで動作するアプリケーションを、C#VB.NETなどで開発できる開発環境/実行環境です。

まとめると、OSSの.NET実装であるmonoを使って、xamarinというクロスプラットフォーム開発環境が2013年に登場しました。*2

Microsoft Xamarinを買収
  1. 2016年2月には、MicrosoftがXamarin社を買収すると発表します。
  2. そして、その結果Xamarinの開発環境であるXamarin Studioが、基本 無償*3となります。
  3. これにより、一見するとMicrosoftの製品ラインナップにおいて、.NETとXamarinがカニバっているように見えますが、実際には住み分けが打ち出されているようです。
Xamarin バイルを中心とした
クロス・プラットフォーム・アプリ
.NET CORE PCデスクトップとWindows系のクロス・プラットフォーム・アプリ
or よりハイ・パフォーマンス
ASP.NET CORE サーバ・アプリ全般

ということは、例えばMacで動くパッケージは Xamarin でも .NET でも開発できうるというわけです。完全に排他的ではなく、緩やかな住み分けのようですね。

より詳細はASCII.jp:.NET Core / .NET Framework / Xamarin / Monoの関係を整理する (1/3)の記事の3ページ目あたりがとても分かりやすかったです。

最新の .NET エコシステムについては[速報]オープンソースの「.NET Core 1.0」、マイクロソフトが正式リリース。Windows/Linux/macOSに対応。Red HatがRHELなどで正式サポート開始 - Publickeyの図も分かりやすかったです。

ここまでの全体のまとめ

知りたかったことをまとめると、

  1. mono とは、 .NET の別実装であり.NETと互換性がある。C#もF#もどちらも動作するが、完全な互換性はというわけではない。*4
  2. VisualStudio を入れると、 .NET の開発環境。
  3. XamarinStudio を入れると、 Mono の開発環境。

.NET & Java

.NET も Javaソースコードを中間コードにコンパイルし、それを各プラットフォーム用の実行環境で動かす仕組み*5なのは似ています。

自分が分かった範囲で比較するとこんな感じでしょうか。

.NET Java
中間コード CIL(共通中間言語 Javaバイトコード
実行環境 CLR/Monoランタイム JVM
開発言語 C#NemerleやF#など JavaScalaClojureなど
IDE VisualStudioやVisualStudioCode / XamarinStudio など EclipseIntelliJ IDEAなど
組織 Microsoft Oracle

以上、JVMユーザから見た.NETの世界でした。

*1:当時

*2:さらにかいつまむと xamarin っていうのは react native とか cordova とか titanium みたいなの、でOK

*3:有料の機能もある

*4:買収を機に今後は互換性を向上させていくようです。

*5:どちらもJITが実装されているので、通常は最終的にマシン語に変換されて実行されます。