JIT编译器里面的“逃逸分析”(Escape analysis)

来源:互联网 发布:网络棋牌信息 编辑:程序博客网 时间:2024/05/18 02:54

逃逸分析是一种编译器后端优化技术,它不是局部优化,而是过程间分析,这意味着它会分析函数调用关系,以判断变量是否“逃逸”出当前作用域范围。

对于JIT类语言来说,一般对象总是堆上分配,逃逸分析是否意味着局部的未逃逸的对象可以改成栈上分配呢?不是这样的,至少对于JVM不是这样。

另外一个有趣的例子是Go语言,写惯了C/C++语言的代码会发现一个很奇怪的Go语言特性:当你return一个&{...}对象引用时,看起来似乎这个对象没有new,也不是Make出来的,但是由于return语句使得变量逃逸出了当前的函数作用域,实际上该对象变成堆上分配了。这里我很好奇的是,反过来,假如你new一个局部对象(对于Java语言来说,对象总是new出来的),但是没有return,或者逃逸出去,为什么不能改成栈上分配呢???

另外一个语言当然就是JavaScript(这里主要关注v8)了。JS在主流的浏览器内核里都是JIT引擎实现的,因此都引入了逃逸分析。我相信Java/JVM、Go、v8这3种语言的逃逸分析的实现多少有点不太一样。怎么个不一样法,这里我还无法回答。

注意,逃逸分析需要在SSA(静态单赋值)的IR指令架构上实现,同时由于是过程间分析(IPA),所以一般都是基于sea of nodes(node graph)的高级数据流图模型,而不是简单的AST codegen。

简单地就写这么多,等有了更多心得,再来总结吧。

原创粉丝点击