楔子:
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,以微軟的一貫尿性,還是極有可能的。
到時候大家,可能又要使勁的學習啦。