Mono .Net IL2CPP について

1:.Netとは何ですか?

.Net は Microsoft の技術プラットフォーム/標準であり、言語ではなく、インターフェイスとして理解できます。

.NET プラットフォームは、C#、F#、Visual Basic などの複数の言語での開発をサポートします。

現在、.Net の主流の実装は 3 つあります。

——.Net Framework:主にWindowsをベースに開発

——.Net Core: クロスプラットフォーム開発をサポート

——Mono: クロスプラットフォーム開発をサポート

クロスプラットフォームは C# ではなく、C# コンパイラによってコンパイルされた中間言語 CIL です。

2: .Netコードのコンパイルプロセス

まず、作成したコードは、言語固有のコンパイラーを通じて CIL (Common Intermediate Language: 中間言語、IL または MSIL とも呼ばれます) にコンパイルされます。これは、Java 仮想マシンに似たマネージ コードであり、 .DLL または .EXE のアセンブリにおける CIL は、コンピュータによって直接認識できない一種の疑似コードです。これはプラットフォームのオペレーティング システムとは関係がなく、CPU からも独立しており、クロスプラットフォームの基礎を築く中間言語です。その後、プログラムの実行時に、CIL は CLR (Common Language Runtime) 内の JIT コンパイラーを通じてコン​​ピューターが認識できる CPU 命令 (マシンコード: 01010101) にコンパイルされます。IL 言語は CLR で実行され、 CLR は、IL がどの言語からコンパイルされたのかを知りません

これは二次コンパイルプロセスです

プログラムの実行時にコンピューターのメモリを占有する必要があることはわかっていますが、C++ プログラマは手動でメモリを管理し、メモリの割り当てと解放を自分で行う必要があります。ただし、CLR が自動的にメモリを割り当て、メモリを解放してくれるため、.NET プログラマはこの操作を実行する必要はありません。

マネージド コードとアンマネージド コード:

たとえば、C#、Java などのマネージド コードには中間言語が含まれており、仮想マシン/CLR によって CPU 命令に変換する必要があります。コードの実行効率は低いですが、オペレーティング システムや CPU に依存しません。 、すべてのオペレーティング システムで実行でき、仮想マシン/CLR 上で実行されます。

たとえば、C++ などのアンマネージ コードは CPU 命令と直接インターフェイスし、コードの実行効率は高いですが、オペレーティング システムが異なると個別のコードを記述する必要があり、反復的で非効率なマシン上で実行されます。C++ のクロスプラットフォーム機能は、各プラットフォームが C++ を解析する一連のランタイム ライブラリを実装しているという事実として理解できます。

3: モノとは何ですか?

.Net Framework 自体は Windows プラットフォーム上でのみ実行できるため、クロスプラットフォームの Mono の必要性が生じました。

Mono は、CLI と C# の ECMA 標準に基づいた .Net の別の実装です。.Net との違いは、サポートされているすべてのプラットフォーム (Android、Switch、PS4) と .Net で CLR を再実装していることです。基本的なクラス ライブラリが提供されています。フレームワークによるも再実装されました。

4: モノラルの構成

——C# コンパイラ: C# コンパイラは mcs と呼ばれ、C# のコンパイル作業を完了できます。その機能は、C# ソース コードを中間言語 CIL にコンパイルすることです。Windows 以外のプラットフォームで実行するには、Mono ランタイムが必要です。 .Net ランタイムまたは Mono ランタイムを使用できます

——Mono ランタイム (Mono VM): ECMA 共通言語アーキテクチャを実装し、ジャストインタイム コンパイラー (JIT)、プリコンパイラー (AOT)、クラス ライブラリ ローダー、ガベージ コレクター、スレッド システム、相互運用機能を提供します。

——基本クラス ライブラリ (.Net クラス ライブラリ): .Net フレームワークとの互換性と一貫性があり、プログラムを構築するための強固な基盤となるクラスの包括的なセットを提供します。

——Mono クラス ライブラリ: 基本クラス ライブラリを超える多くのクラスを提供し、Gtk+、Zip ファイル、LDAP、OpenGL、Cairo、POSIX などの処理などの追加機能を提供します。

5: Mono ランタイムとは何ですか?

C# コンパイラー mcs の機能は、C# ソース コードを中間言語 CIL にコンパイルすることであり、Mono ランタイムの機能は CIL を機械語に変換することです。

Mono ランタイムは 3 つの変換方法を提供します

——ジャストインタイム コンパイル (JIT): 動作中に CIL をマシン コードにコンパイルします。プログラムの実行中にのみコードをコンパイルし、1 つのステートメントを解釈して 1 つのステートメントを実行します。また、毎回コンパイルするのではなく、コンパイルされたコードをキャッシュします。

——事前コンパイル (AOT): 実行前に、CIL はマシン コードにコンパイルされて保存されますが、一部のコンパイルでは依然として JIT の使用が必要です。

——完全な静的コンパイル (フル AOT): 実行前にすべての CIL をマシン コードにコンパイルします。たとえば、IOS プラットフォームでは JIT が禁止されているため、Mono はフル AOT モードでのみ実行できます。

6: IL2CPP

Mono にはいくつかの欠点があるため、新しい解決策、IL2CPP が登場しました。中間言語 IL を取得した後、IL2CPP を使用してそれらを C++ コードに変換し、各プラットフォームの C++ コンパイラによって実行可能コードに直接コンパイルします。マシン コード

IL2CPP はその意味をよく理解しています: IL コードを CPP ファイルに変換します

現在のトレンドは、言語に動的機能を追加することです。C++ のような静的言語であっても、IL に適した C++ コンパイラーが登場しています。では、なぜ Unity は IL を静的 CPP に戻すのでしょうか? その理由は次のとおりです。

——Mono VMはさまざまなプラットフォームに移植されており、メンテナンスには非常に時間がかかり、場合によっては不可能な場合もあります。

Mono のクロスプラットフォームは Mono VM によって実現されており、複数のプラットフォームがある場合には複数の VM を実装する必要があり、Unity のような複数のプラットフォームをサポートするエンジンの場合、Mono の公式 VM では絶対にニーズを満たすことができません。したがって、さまざまな新しいプラットフォームに対して、Unity のプロジェクト チームは VM を移植し、VM で見つかったバグを解決する必要がありますが、これには非常に時間と労力がかかります。一部のプラットフォームは移植できません

2. モノラル版の権限は制限されています

Mono の権限が制限されているため、Unity は Mono バージョンをアップグレードできず、その結果、いくつかの新しい C# 機能が利用できなくなりますが、これを IL2CPP に置き換えれば、完全に自社開発のコンポーネントである IL2CPP VM がこの問題を解決します。

3. 業務効率の向上

公式の実験データによると、IL2CPP に切り替えた後、プログラムの実行効率は 1.5 ~ 2.0 倍向上しました。

7: Mono と IL2CPP の概要

——IL2CPP は AOT モードのみをサポートし、Mono はすべての AOT および JIT モードをサポートします

——プラットフォームのサポート: Android プラットフォームは Mono と IL2CPP のすべてのコンパイル方法をサポートしますが、IOS は Mono のフル AOT モードと IL2CPP のみをサポートします。

おすすめ

転載: blog.csdn.net/m0_74022070/article/details/131721987