.NET9 AOT完全自举了吗?
自举概念解读
在编程语言领域,自举是一个有些抽象的概念,简单来说就是用自身去实现自身相关的功能。就像Python解释器是用Python语言编写的,通过这个解释器去解释Python应用层级的框架、语法糖以及其他功能,这就是自举的体现。
回到.NET的情况,.NET的前端编译器Roslyn是用C#编写的,然而CLR/JIT后端编译却是基于C++实现的,所以.NET整体并不满足自举的条件。那.NET AOT又如何呢?
.NET AOT的发展与现状
之前版本情况
AOT编译器ILC是由C#编写的,它构建了内存模型,能够加载MSIL并调用JIT。但在.NET9之前,目标文件Obj是由llvm后端构建的,这就导致在之前的版本中,.NET AOT也不能算作自举。
.NET9的变化
在.NET9里,Obj目标文件生成引入了C#代码,这一举措取代了LLVM部分。不过,为了兼容之前的情况,LLVM - ObjWriter.dll依然被保留,并没有删除。只是默认情况下,C#代码取代了之前LLVM的生成,二者处于并存状态。
是否自举的争议
从AOT编译器ILC的角度看,它完全是C#代码,而且LLVM也被取代了。但当涉及到引导程序,也就是引导目标文件生成可执行的二进制文件时,使用的是C++的BootStrap。所以从严格意义上来说,.NET9 AOT仍然算不上完全自举。
托管语言与非托管语言的关联
其实,对于托管类型的语言而言,通常都需要非托管的语言来进行加载引导运行。这就如同操作系统的引导程序,开机后需要一个引导程序把指令引导到Windows系统上。在.NET中也是如此,比如进行MSVC后,一般会生成一个非托管的Exe,它就是加载引导文件。再如CLR Host,它是一个非托管引导,没有它,托管DLL是无法直接运行的。
个人观点
从理论上严格定义的自举标准来看,.NET9 AOT因为引导程序使用C++的BootStrap,确实不能说是完全自举。但从另一个角度看,.NET9在AOT方面已经有了重大的改进,C#代码在目标文件生成中占据了主导地位,这是朝着自举方向迈出的重要一步。而且考虑到托管语言对非托管语言引导的客观需求,我们也可以说.NET9 AOT在一定程度上已经非常接近完全自举了。也许在未来的版本中,随着技术的不断发展,引导程序部分也能够用C#实现,那时.NET9 AOT就真正实现完全自举了。总之,.NET9 AOT虽然目前不能算完全自举,但它的发展趋势值得我们持续关注。 ======================================================================
前些天发现了一个比较好玩的人工智能学习网站,通俗易懂,风趣幽默,可以了解了解AI基础知识,人工智能教程,不是一堆数学公式和算法的那种,用各种举例子来学习,读起来比较轻松,有兴趣可以看一下。
人工智能教程