.Net8的CLR/JIT未来的方向

1.概念
CLR构建内存模型,调度托管函数运行,以及垃圾回收(GC)等。JIT则是进行IL代码的IR变形构建,然后进行托管/非托管函数的编译两大功能。目前CLR/JIT跟.Net版本一起迭代到8代了,本篇来看下未来的方向。

2.进化
编程语言发展今天这个地步,实质上有一个比较重要的特征就是所有的编程语言都向自举方向发展。也就是一整套的编译流程下来,必须是被编译的这个语言作为主力来编写编译的运行平台。以.Net平台为例,它上面运行的主力语言就是C#,那么C#语言的编译必须运行在C#语言编写的编译器平台上。.

这里简单来看下.Net平台的编译流程

1.Roslyn(把C#源码编译成托管DLL或者非托管Exe)
2.CLR接管托管的DLL,构建内存模型,调度托管函数调用JIT即时编译
3.JIT把MSIL导入,然后进行变形机器码编译,编译成汇编运行。

可以看到C#语言如果被编译,它涉及到了三种技术。Roslyn/CLR/JIT。这里面除了Roslyn是C#语言写的,其它的CLR/JIT都是C/C++编写的。

自从.Net7引入了AOT之后,这种游戏规则就改变了。AOT因为完全不同于JIT的即时编译,相当于另起炉灶。AOT利用ILC编译器,把C#源码经过复杂的过程调用了llvm编译成了目标文件,然后通过链接器把它链接成可执行文件在各个平台上(macos/linux/win)上二进制运行。

ILC编译器是C#写的,链接器一般的都是额外提供.这里可以看到,CLR/JIT不见了,取而代之的是C#语言编写的ILC编译器.这即时自举的表现.这种情况在其它的语言上比如Go/Java/Swift/Kotlin上面都有体现。

自举的好处有哪些呢?目前的认知
1.可以单独提供可执行的文件,不需要部署安装。简洁,明了。
2.可以通过主力语言(比如C#),你可以一整套下来通过C#理解.Net平台,而不需要额外的二进制,C++,汇编等知识

任何事情都有两面性,好处自然伴随坏处,坏处有哪些呢?
1.目标编译降低了程序的性能,远不如即时编译器智能化
2.自举还不成熟,某些方面无法真正的自举。

在不久的将来,随着各种新技术概念的出现和提升。性能和简洁应该并存而行,而非舍弃一取其二,其二应该能囊括100%的程序构建场景。而C++的钳制可能成为过去,只能是引导比如bootstrap或者是作为底层托管的dllimport库调用.

结尾

在技术越来越卷的今天,如果没点真水平,很难立足下去。为此个人研发了一套深入.Net内幕的视频免费分享给大家,一起学习,一起进步。涉及到.Net7的运作模式,CLR/JIT/MSIL的源码解读,AOT引导C++源码,GC运作模式,固定对象,异常,内存模型等技术点。关注公众号:jianghupt。可以选择感兴趣的后台回复,即可获取。