楔子:
這個新編譯器的全稱是ILCompiler。是之前CoreRT項目合并過來的,在.Net 7成熟,并且可以產業化應用。
本質:
ILC編譯器的本質除了構建CLR的所擁有的主要功能,還包含了對LLVM這種意圖取代GCC編譯器的操作,對于LLVM主要是用來Win,Linux,Macos三種不同的操作系統的目標文件而所做的封裝。
一.CLR的主要功能:
1.構建內存模型,比如
MethodTable,EEClass,MethodDesc,MethodDescThunk等等。
2.調用RyuJIT即時編譯器
3.GC垃圾回收
ILC編譯器包含了CLR主要功能的前面兩項,第三項則通過不同平臺的連接器把GC操作函數鏈接到各個平臺的可執行文件上。
二.針對LLVM的封裝
最主要的一個針對LLVM的封裝就是編譯各個平臺的不同目標文件,比如Windows PE,Linux ELF和macOS Mach-O文件格式。
它的主要封裝目標名稱在win下面是ObjWriter.dll,Linux下面為libobjwriter.so。
要點
ILC全部為C#代碼寫的,對于需要用到的底層庫,直接DllImport
比如寫入段的
ObjWriter.dll的SetCodeSectionAttribute
比如編譯機器碼JitSupportLibrary(jitinterface.dll)的JitCompileMethod
功能:
ILC的主要功能大致由3個部分組成:編譯腳本代碼、調用JIT,代碼生成后端。
分開來看:
1.編譯腳本代碼:dotnet publish -r win-x64 -c release在ILC里面被識別并且包含各種需要的引用庫,運行庫文件。為后續準備
2.調用即時編譯器JIT,根據前面的編譯腳本代碼的參數以及函數功能等,進行機器碼編譯。
3.返回JIT編譯的機器碼,生成各個平臺目標文件和可執行的文件。
結尾:
如果想要了解.Net 7以后的發展,這個ILC恐怕繞不過去。它隱有與CLR分庭抗禮之勢。