Edited at

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


参考