.Net 7 新编译器 ILC 简析

楔子:

这个新编译器的全称是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分庭抗礼之势。