最近看到.net7的 aot计划之后又去网上看了下相关的文章发现.net C#其实并不需要aot,原因主要有以下几点:
.net生态至20年前诞生以来桌面端就一直没成功过,在濒临死亡之前可以说全靠傍上web生态起死回生的,我们知道.net core 战略从一点一点扣性能做起的,通过asp.net 做为发力点,挽救了.net 并因此将.net framework抛弃,给.net C#带来了新生机,而一直失败一直拖累的一系列技术,什么 webform, wcf,winform,wpf,silverlight,xna wwf(wf),uwp,winfone... 等却还不死心,变着面目不断表演就象一个个的小丑十分可恶,这不又折腾出什么maui,blazor这些不伦不类的东西。
jit 十分重要,连当下最火的web assembly 都是走的jit路线为什么不直接到可执行文件呢? 原因很简单,得跨平台呀,跨平台的意思主要是指针对不同设备,os 和指令集而适配的东西,以后物联网发展起来以后,可以想见只会有更多的平台和设备接入到互联网的,有那么多不同的设备和平台,如果直接编译成可执行文件的话就失去了通用性,这是最大的原因,只有象微软这样的超大公司才可以做好这块,才可以做好跨平台,因为平台不同所以有各自不同的指令要求,一般小公司做不了,光靠社区也比较缺乏稳定性和可靠性。没有jit就意味着你需要把你的源代码针对不同的平台,不同的版本进行编译,光这项工作还不把开发者累死?
C#是有gc语言,是严重的.net依赖也就是库依赖语言,光从这两点分析就知道根本就该死了用它去写桌面程序的心,还想到处分发方便,这是对C#最大的误用!从C#这两个特性可知道,C#根本不适合被编译成非jit的指令集,那样不仅是难度及大,而且也并不能提升C#的运行速度,最多只是启动快一点罢了。
有jit的好处,就是有runtime 有gc 这样对服务端长时间运行的程序来说,可以自动管理内存碎片,而这些优点是c,c++所不具备的,所以有文章上说,对于长时间运行的程序来说,随时时间的增加内存碎片的增长,没有runtime,jit,gc对内存管理的程序就会变慢,所以这是个优势。
综上所述所以我认为,aot 对于C#来说 并不重要,而且并不能因为aot优化后就去除jit, runtime,gc这些特征,C#的长处在于它的服务端跨平台特性。
最后我想给微软建议与其搞什么blazor不如老老实实想想看能不能搞个最简wasm 的runtime 不要加那些mvvm的东西 如果这个最简平台可以尺寸在200k左右我认为还是有市场的,总不至于写个hello world 就要2m吧 然后 这个200k的 wasm runtime 可以把gc管理交给wasm,毕竟wasm有gc 开启选项,这样一来,C#代码就可以直接给前端写东西提供给前端用了,但是仅管如此,C#的性能仍然要低于rust,这是因为就算有一个runtime 只有200k,那么它仍然要面临二次jit,一次是 runtime il => wasm,然后 wasm=> 到机器码执行,是这样的吗?这点我也不清楚,欢迎知道的朋友 指正!