楔子:
AOT和 CLR的区别是什么呢?
大部门人必定会说,一个编译成当地机器码(Native Code),一个是JIT立即编译的成果。
那么说,其实也对,但是不详细。详细应该怎么看呢?
AOT
AOT现实上是为了静态编译做的一个变体,不断在不断的轮回进化,它并非.Net Core之后才有的,之前的.Net FrameWork也是有的。
在windows上,AOT是通过ilc.exe来加载托管的DLL,然后把那个DLL编译成.Obj文件。尔后通过运行时也就是CLR来链接到那个.Obj文件,生成你最初看到的阿谁超大的Exe文件。
CLR
CLR的编译过程其实各人都清晰,详细如下:
源码 -》Rosyln(编译成托管DLL) -》CLR(加载DLL,而且挪用RyuJit) -》RyuJit(编译成机器码)
区别
因为RyuJit是个立即的编译器,也就说你启动一个.Net法式之后,法式里面需要运行的数据就会加载到内存里面。若是你把那个法式给关掉了,内存就会被肃清,之前的数据完全不存在。所以叫做立即编译。
而AOT则差别,它会保留编译的成果,然后在挪用的时候停止成果的跳转。
留意了,AOT同样有CLR和GC,只不外它的CLR是通过Hostfxr来停止宿主挪用的,而它的GC则是通过.Obj文件链接编译到了Exe里面。
你同样的反编译它,仍然能够看到托管的代码。
结尾:
总体来说,AOT构成了一个独立的编译系统,有区别与目前的.Net 7 CLR 。
有人说微软以后可能会用AOT编译手艺代替CLR,以微软的一贯尿性,仍是极有可能的。
到时候各人,可能又要使劲的进修啦。
0