您的位置首页百科问答

华为方舟编译器原理已公布,应当如何看待?

华为方舟编译器原理已公布,应当如何看待?

的有关信息介绍如下:

华为方舟编译器原理已公布,应当如何看待?

写点不专业的分析,抛砖引玉。

更新一下。我突然想到了一个比较接近的,现成的项目:

.NET Native

将不同语言混合编译,这个知乎上曾有过类似提问:

只要编译到统一的IR,最后输出统一优化的native代码是完全可行的。

比如把Java的bytecode转换到LLVM的IR,把一些特殊的功能转化到函数调用,然后一股脑扔给后端去优化就行了。

当然编译出来的结果依旧需要挂上jvm这个runtime,就像你想要在代码里反射,那就必须存储元数据并留下runtime对这一功能的支持一样。

补充一下,而不是无脑转换扔进去优化就够的,参考

这个回答里讲到的Unladen Swallow项目,过多细节隐藏在runtime里也会大大限制后端优化的空间。

还有个问题就是本地堆和托管堆数据互相访问的问题。比如C里指针跑飞了就跑飞了,其他部分不主动去访问到错误区域就没事。但混合编译后如果在修改托管堆数据时跑飞了,就可能会大大影响托管环境。C++/CLI作为本地和托管的胶水语言,就有现成的设计结构。

这么做的好处其实在于可以消除函数调用,给后端更充分的优化空间,类似于C++的link-time optimization。

2.1讲的其实可以理解为AOT+LTCG,完全可以接受。

至于2.2,其实就是优化GC。

GC的实现与优劣知乎上也有很多讨论:

方舟编译器具体怎么做的?图片上压根没讲……

其实从Dalvik到ART,安卓的GC是有改进的,减少了暂停的时间与GC的次数。比如看这里

而ART GC的并发阶段其实也不需要stop the world的。

如果想不stop the world,那pauseless的GC也是现成就有的(虽然实际上还是会有那么一些pause time),比如

相关的内容其实应该at专业的R大,虽然看他好久没上知乎了。 @RednaxelaFX

除去改进Mark-Sweep/Compact算法的外,也可能是改用了引用计数的GC,毕竟Java语言应该是没有规定用何种GC方式的,而引用计数是符合“即用即释放”的描述的。

不过这还得考虑怎么解决循环引用,以及怎么应对连锁释放的波动等问题……

之前的传闻说开源的是编译器,而runtime不开源,这就好比开源了MSVC但不开源vcrt.dll一样。

不过如果连runtime都不给提供的话,那光这个编译器差不多也是废的了,毕竟没有runtime没法运行,总不能对照着API自己逆向一遍仿个满是bug的runtime吧……