AOT
AOT 编译器也将 [IL 代码](#IL 代码)翻译成机器代码。但与 JIT 编译不同的是,AOT 编译发生在应用程序执行之前,通常在不同的机器上进行。由于 AOT 工具链不在运行时进行编译,因此
无需最小化编译时间,可以投入更多时间进行优化。由于 AOT 的上下文是整个应用程序,AOT 编译器还会执行跨模块链接和全程序分析,这意味着它会跟踪所有引用并生成单个可执行文件。
JIT
与 AOT 类似,JIT 编译器将[IL 代码](#IL 代码)翻译成处理器能够理解的机器代码。但与 AOT 不同的是,JIT 编译是按需进行的,并且在代码运行的同一台机器上执行。由于 JIT 编译发生在应用程序执行期间,因此编译时间也包含在运行时时间中。所以,JIT 编译器必须权衡代码优化所花费的时间与最终代码带来的性能提升。但 JIT 编译器了解实际的硬件情况,可以让开发人员免于发布不同的实现版本。
IL
什么是 "中间语言(IL)"? 它是用高级 .NET 语言编写的代码编译的产物。编写其中一种语言编写的代码后,将会收到一个由 IL 编写的二进制文件。
值得注意的是,IL 独立于运行在运行时(Runtime)之上的任何特定语言;它甚至拥有一套独立的规范。
从高级代码生成 IL 后,如果要运行它,CLR 会接管工作,启动实时编译(JIT)编译过程,或者将代码从 IL 实时编译成真正可以在 CPU 上运行的机器码。这样,CLR 就能确切知道代码的作用,并有效管理代码。
CLR
是什么
.Net 的运行时环境,类似于 Java 的 JVM
做什么
- JIT 编译
- 内存管理
- 类型系统
- 异常处理
- 安全校验
CLR 实现有哪些实现
- CoreClr
- 微软官方的 CLR 实现
- .Net 6/7/8/9 的核心运行时
- Mono
- 早期第三方 CLR 实现
- 后被微软收购
- 现在是 .Net 官方运行时之一
- .Net Framework CLR
- 仅支持 Windows 平台
- 仅维护
Mono
Mono是一个由Xamarin公司(先前是Novell,最早为Ximian)所主持的自由开放源码项目。该项目的目标是创建一系列符合ECMA标准(Ecma-334[1]和Ecma-335[2])的.NET工具,包括C #编译器和通用语言架构 。与微软的.NET Framework(共通语言执行平台)不同,Mono项目不仅可以运行于Windows系统上,还可以运行于Linux、FreeBSD、Unix、OS X和Solaris,甚至一些游戏平台
Mono 由几个组件组成:
C#编译器 - Mono 的 C#编译器支持 C#1.0、2.0、3.0、4.0、5.0 和 6.0(ECMA)。各种版本的 C#编译器的特性描述可以在维基百科上找到。
Mono Runtime - 运行时实现了 ECMA 共同语言基础结构 (CLI)。运行时提供即时编译器、提前编译器 (AOT)、库装载器、垃圾收集器、线程系统和互操作性功能。
.NET Framework 类库 - Mono 平台提供了一系列全面的类,为构建应用程序提供坚实的基础。这些类与 Microsoft 的 .NET Framework 类相容。
Mono Class Library - Mono 还提供了许多类,这些类超越了 Microsoft 提供的基类库。这些类提供了额外的有用功能,尤其是在构建 Linux 应用程序时。一些示例包括 Gtk+、Zip 文件、LDAP、OpenGL、Cairo、POSIX 等类。
跨平台 ios
iOS 和 Mac Catalyst 上的 Mono 解释器 - .NET MAUI | Microsoft Learn
Il2cpp
严格意义上来说,IL2CPCPP 是 Unity 引擎中的一个脚本后端选项,而不是 C# 本身的一个术语, 它已经脱离了 .Net 生态。
IL2CPP(中间语言到 C++)是 Unity 的自定义、提前编译(AOT)脚本后端,最初是为 iOS 等不支持 即时编译(JIT)的平台开发的。 IL2CPP 将 IL( 中间语言 )转换为 C++,并将其编译成特定于平台的原生代码,然后以目标平台的标准格式打包到应用程序中,例如 APK /AAB、iOS 应用程序包或 Windows 可执行文件和 DLL。
IL2CPP 支持所有平台,并且可以提供比 Mono 脚本后端的几个好处,包括性能提升和启动时间缩短。