C#精要 - Mono篇
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++编译器处理,有自己的代码裁剪规则。是一种目前效率更高的选择。