Cliff Click在他的演讲中,"JVM就是这样吗?","有更好的方法来描述语义而不是Java字节码":http://www.youtube.com/watch?v = uL2D3qzHtqY&t = 8m55s
为什么?Java字节码有什么问题?有哪些替代方案?
字节码已经失去了很多语义,这就是问题所在.它是一种非结构化的机器代码.作为一个例子,见证了Java反编译器的巨大复杂性:它基本上是Java的CSI团队,从分散在字节码周围的信息碎片中精心地重建源代码.
由于现代JVM除了作为程序语义的描述之外没有太多用于字节码,因此它已经失去了它的原始目的,这是一种相对快速解释的格式,介于Java和本机之间的描述级别中.机器代码.
与原始源代码相比,JIT编译器实际上更难以优化字节码,因为它希望尽可能多地了解一段代码背后的意图.考虑一下这段代码:
int i = 0; String s = ""; for (Integer num : nums) { s += num; if (++i < ints.size()) s += ", "; }
代码做了什么?经过一些分析并确认了一些猜想后,结果发现它从整数列表中汇编了一个逗号分隔的字符串.但是,要优化的内容有很多:
使用不可变String
类型通过循环保存临时值;
维护一个单独的索引变量,i
它是隐含的一个索引变量的副本Iterator
;
i
每次都要检查列表大小,即使很明显这只会在最后一次迭代时才会出现.
JIT编译器将定期执行循环特化优化:它将为最后一个循环步骤发出单独的代码,从而完全消除重复if
检查.它也可能意识到临时字符串没有转义并自动用StringBuilder
基于它的整个成语替换.
为了实现所有这一切,很明显编译器必须对正在发生的事情有一个非常全面的高级理解,使用源代码比生成的字节码更容易实现.
编程语言的现代趋势是将源代码本身作为JIT的入口点,或者与源代码非常相似的东西,如AST.