C#のフレームワークには.NET Frameworkや.NET Core、Monoなどが乱立していて非常に複雑になっています。ここでは、それらの関係を明らかにして、今後の方向性を解説していきます。
.NETプラットフォームの構造
C#はマイクロソフトによる.NETの言語の一つですが、そもそも.NETとはどのようなものなのでしょうか?
.NETでは言語やプラットフォームに依存しない開発を可能にするためにC#やVB.NETなどで作成したプログラムを一度共通中間言語(CIL)に翻訳したうえで、それを共通言語基盤(CLI)によってネイティブコードに変換して実行します。これはJavaで一度中間コードに変換してJVMによってネイティブコードに変換して実行するのと同じで、それをさらに推し進めたようなイメージです(本来はJavaとは目指していたものが違いますが、あくまでもイメージの話です)。
これにより、WindowsやLinuxなど各プラットフォームごとに共通言語基盤(CLI)を用意すれば、同一のコードで各プラットフォームで実行することが可能になります。また、C#やVB.NETなどで書いたプログラムも一度共通中間言語(CIL)に変換されるので、一つのプロジェクトに複数の言語を混在させることもできてしまいます。
なお、.NET言語のクラスライブラリのうち、言語仕様にかかわる部分は基本クラスライブラリ(BCL)として定義されています。
.NET実装の歴史
C#を含めた.NETにおける基本クラスライブラリなどの中心的な部分は共通言語基盤(CLI)で定義されているので、C#の実装を考えるにはCLIの実装を考える必要があります。ここではこの共通言語基盤(CLI)の実装、つまり.NETの実装の歴史を見ていきます。
.NETの実装=.NET Frameworkの時代
共通言語基盤(CLI)の実装は長らく.NET Frameworkに含まれる共通言語ランタイム(CLR)のみであり、マイクロソフトによる実装しか存在しませんでした。つまり、C#は.NET Frameworkとペアで不可分な関係である時代が長く続いたのですが、もともと.NET Frameworkはマイクロソフトによるマイクロソフトのための開発環境であり、Windowsしかサポートされていませんでした。
Monoの登場
以前のマイクロソフトはオープンソースの対極にあるような会社であり、マイクロソフト自身がLinuxをサポートすることなど考えられませんでした。そこで、オープンソースプロジェクト Mono で、Linuxでも.NETを使えるようにするための共通言語基盤(CLI)の実装であるMono Runtimeが登場します。
マイクロソフトによるオープンソースへのコミットと、.NET Coreの登場
しかし時代は変わり(CEOが変わったことに伴い)、マイクロソフトがオープンソースへと大きく舵を切るようになります。それに伴い、.NETも以前のようにマイクロソフトですべてを抱え込むのではなく、共通言語基盤(CLI)の実装もオープンソースでほかのプラットフォームにも開放するようになります。そこで登場した共通言語基盤(CLI)の実装が.NET Coreに含まれる.NET Runtime (旧称:CoreCLR)です。
ちなみに、現在はMonoもマイクロソフトの子会社であるXamarinと.NET Foundationによって運営が行われています。
.NET実装のロードマップ
このようにして、.NETの実装として.NET Framework、Mono、.NET Coreが出そろいました。なお、これ以外にも.NETの実装はいろいろとありますが、すでに終了したプロジェクトなどは省略しています。
以前であれば.NET Frameworkだけ考えればよかったのですが、同じようなものが3つも出てきてしまい複雑になってしまいましたね…。今後はどのようになっていくのでしょうか?
実は.NETのロードマップは単純明快で、将来的にはすべて.NET Coreに統合される予定となっています。現在はそれぞれ.NET Framework 4.8と.NET Core 3.1ですが、以下のロードマップの通り次期バージョンは.NET 5.0に統合される予定です。
なお、.NET 5.0は2020年11月にリリース予定ですが、こちらからプレビュー版はダウンロード可能です。.NET 5.0になれば以下のように様々なプラットフォームに対応したアプリを作成できるようになります。
そして、上の図でXamarinやUnityのベースも.NET 5になっていることからもわかる通り、Monoも.NETと統合することが目指されているようです。
.NET Standard とは?
最後に.NET Standardについて説明します。上記のように.NET実装には、.NET Frameworkや.NET Core、Monoが乱立した状態となっています。しかし、そのベースとなる部分は共通なので、その共通部分を規格化したものが.NET Standardです。
ところで、最初の説明で「.NET言語のクラスライブラリのうち、言語仕様にかかわる部分は基本クラスライブラリ(BCL)」とありましたが、BCLと.NET Standardとはどう違うのでしょうか?それぞれの.NET実装の基本クラスライブラリ(BCL)の共通部分が.NET Standardということになり、例えば.NET Standardに.NET Core BCLを加えたものが、.NET CoreのBCLということになるようです。
つまり、.NET Standardはすべての.NET実装における最も基本的な部分で、どの実装でも共通な部分であるといえます。.NET Standaradに準拠していれば、.NET Frameworkや.NET Core、Monoなどどの.NET実装でもそのままプログラムを動作させることができます。
コメント