#最初に
この記事はUnityで使用されているコンパイラについてまとめた記事のうちの、基本的に使われている部分であるMonoについて簡単にまとめた記事です。
Monoとは?
.NET Framework互換の環境を実現するオープンソースのソフトウェアです。
UnityではMonoをコンパイラの一つとして取り入れています。
Monoはマルチプラットフォームであり、JITコンパイラを搭載しています。JITは前回の記事でも説明した通り、実行中にILコードをネイティブコード化し、そのコードをキャッシュして2回目以降高速に実行ができる方式です。ただしMonoはAOT方式も可能で、実行前にネイティブコード化しキャッシュしておくこともできます。
JITコンパイラが対応するプロセッサは
- x86
- x86-64
- IA-64
- SPARC
- PowerPC
- ARM
- S/390(32ビットおよび64ビット)
- MIPS
となっています。それ以外ではネイティブコードに変換するのではなくインタプリタによって逐次バイトコードが実行されます。
またMonoではSIMDへの対応も行っており、独自の機能が多く取り込まれています。
Monoの構成
Monoを構成するコンポーネントは以下の通りです。
-
C#コンパイラ:MonoのC#コンパイラは、version 5.10.0以降NET 4.7.1・C# 7.2が使用できます。ただし現在Unityでは.NET4.6対応となっているので、C#6までの機能が使用できる。
-
Mono Runtime:ランタイムはCommon Language Infrastructure(CLI)を実装しています。ランタイムは、JITコンパイラ、AOTコンパイラ、ライブラリローダ、GC、スレッドシステム等を提供します。
-
.NET Frameworkクラスライブラリ
-
Monoクラスライブラリ:Monoは、Microsoftが提供するBCL以上に多くのクラスも提供しています。特にLinuxアプリケーションを構築する際に便利な機能を提供します。
-
共通言語ランタイム(Common Language Runtime(CLR)):CLRを使用すると、他のCLR言語で書かれたコードと相互運用が可能です。例えば、C#でクラスを作成した後にVB.Netでクラスを継承して使用することも可能です。
ちなみにMonoのランタイムとJITコンパイラはC言語で記述されているようです。
Unityでの立ち位置
Unity2017.3以降ではIL2CPPかMonoを選択することができます。ただし、WebGLではIL2CPPのみ使用可能となっています。 (@Ash_Yin(デコシ) さんより、UWPでIL2CPPしか使えなくなるのはUnity2019からとご指摘頂きました)
IL2CPPに比べると
- ビルド時間が短い。
- JITのため、より多くの管理系ライブラリをサポートする。
- ランタイムの実行をサポートする。
- dllファイルが配布時に必須となる。
このIL2CPPに関しては次回の記事でもう少し詳しく見ていこうと思います。
最後に
今までMonoに関してここまで調べたことがなかったため、どのような役割を担っているのか詳しく知りませんでした。また、Unityでは現在どういった扱いになっているのかも知れて良かったです。