IL是什么?

IL的全称是 Intermediate Language,是一种中间语言。它是一种属于通用语言架构和.NET框架的低阶(lowest-level)的人类可读的编程语言。目标为.NET框架的语言被编译成IL代码,然后汇编成字节码。

具体过程是:C#或者VB这样遵循CLI规范的高级语言,被先被各自的编译器编译成中间语言IL。等到需要真正执行的时候,这些IL会被加载到运行时库,也就是CLR中,由CLR动态编译(JIT)成汇编代码然后在执行。

JIT是什么?

just-in-time compiler,即时编译器。它将IL翻译成汇编语言,它自身会对运行环境做出许多假定,从而进行自己的优化方案。

比如第一次调用一个方法时,JIT会把遇到的IL代码进行验证+编译,最后放进内存中。方法仅在首次调用时才会有一些性能损失,以后对该方法的所有调用都以本机代码的形式全速运行。

Mono是什么?

是支持.net跨平台的一种方式。因为.net本身不支持跨平台只能运行在Windows上,所以需要一个跨平台的第三方.net库,这就是Mono

mono作为一个中间层将IL代码的处理分出好多个分支,分别对应不同的平台。Mono其实和.net framework 是同一个东西,只不过Mono支持更多的平台,但.net的运行效率更高。
Unity打包时会将mono一同打包进来,同时Unity将脚本编译为IL代码打包,这样只要是Mono支持的平台,都可以在Mono中编译成平台本地代码。

IL2CPP是什么?

把IL中间语言转换成CPP文件。

在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成能执行的原生汇编代码。

但是GC还是C#方式来处理。

为什么有了Mono还需要IL2CPP?

主要是2点。

1.Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成。Mono的跨平台是通过Mono VM实现的,有几个平台,就要实现几个VM,非常耗时耗力。

2.根据官方的实验数据,Mono换成IL2CPP以后,程序的运行效率有了1.5-2.0倍的提升。

工作中怎么涉及到Mono呢

可以在Unity工程打包得选项中,选择是用Mono还是IL2CPP方式输出。

IL2CPP能把IL中间码转为C++代码,然后交给各平台的C++编译器处理,有自己的代码裁剪规则。是一种目前效率更高的选择。