点击上方蓝字 江湖评谈设为关注/星标
前言
.NET和Rust都属于那种进化非常快的技术,.NET有微软的钞能力支撑。而Rust作为编程界的新宠儿,其背后的Google,Mozilla,Facebook,AWS都是业界鼎鼎有名的大佬公司,再加上其异乎寻常的热度,进化自然也快了。本篇对比下其Compile过程,看下其关键技术。
Compile过程
Rust是先构造AST(语法树),其后通过AST构建MIR以及LIR,后把构建好的LIR传给LLVM,让LLVM对其进行目标文件的构建。最后通过链接器链接目标文件,形成可执行的二进制文件,在相应的平台上执行。
.NET分为两种编译模式,其一JIT,其二AOT。这里先说JIT,JIT是通过CLR加载相应的MSIL之后,进行调用的。JIT首先构建Basic Block块,后构建HIR和LIR。注意了这里的LIR跟Rust的LIR不是一个东西。Rust后端需要LLVM支撑,所以它的LIR是LLVM的IR,然.NET的LIR是进行高度优化之后的LIR(Low IR),.NET9性能出色也在这个地方,因为LIR的下一步是生成机器码,JIT引擎会根据这个被高度优化的LIR生成效率非常高,非常简洁的机器码,然后进行即时运行。
下面就是.NET AOT,.NET AOT跟JIT不是同一条编译线。AOT Comile是通过ILC(AOT编译器)加载MSIL,进行语义化的分析,对其进行构建目标文件(这个过程调用的是clrjit.so/dll的API),然后通过链接器把目标文件链接成平台上可执行的二进制文件。
可以看到.NET AOT与Rust有相似的地方,实际上相似原因,它们都需要被Compile成二进制代码,在相应的平台上运行。然JIT则不需要Compile成固定的二进制代码,它的二进制在内存里面进行即时运行即可,程序退出,二进制自然也就不复存在了。
构件
.NET Compile从一出生就离不开三大底层构件,CLR,JIT,GC。CLR的作用是加载MSIL,调用JIT。JIT的作用是.NET体系的编译环节,也是最重要的一个环节。GC则是对托管堆的内存进行管理,分配,以及释放等等。
但显然Rust里面是没有这些东西,Rust基本上可以分为前后端两部分。前端生成LIR,后端编译成机器码。这跟C++是极其相似的。只不过上古时期的编程语言比如C/C++对于IR的概念尚未延展开来。
结尾
以上文字代码可以参考如下: