Unity開発するにあたって知っておきたいコンパイラのすゝめ(Part1~Mono編~)(Unity2018.1対応)


最初に

この記事は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では現在どういった扱いになっているのかも知れて良かったです。

参考