【发布时间】:2011-03-09 01:05:34
【问题描述】:
向 Stack Overflow 上的所有编译器设计者致敬。
我目前正在从事一个项目,该项目的重点是开发一种用于高性能计算的新脚本语言。源代码首先被编译成字节码表示。字节码然后由运行时加载,运行时对其执行积极的(并且可能是耗时的)优化(这比大多数“提前”编译器所做的更进一步,毕竟这是整个问题的重点项目)。请记住,此过程的结果仍然是字节码。
字节码然后在虚拟机上运行。目前,该虚拟机是使用直接跳转表和消息泵实现的。虚拟机用指针遍历字节码,加载指针下的指令,在跳转表中查找指令处理程序并跳转到其中。指令处理程序执行适当的操作并最终将控制权返回给消息循环。虚拟机的指令指针递增,整个过程重新开始。我用这种方法所能达到的性能实际上是相当惊人的。当然,实际指令处理程序的代码再次手动微调。
现在大多数“专业”运行时环境(如 Java、.NET 等)都使用即时编译在执行前将字节码转换为本机代码。使用 JIT 的 VM 通常比字节码解释器具有更好的性能。现在的问题是,由于解释器基本上所做的只是加载一条指令并在跳转表中查找跳转目标(请记住,指令处理程序本身是静态编译到解释器中的,所以它已经是本机代码),将使用即时编译会带来性能提升还是实际上会降低性能?我真的无法想象解释器的跳转表会降低性能那么,以弥补使用 JITer 编译该代码所花费的时间。我知道 JITer 可以对代码执行额外的优化,但在我的例子中,非常激进的优化已经在执行之前在字节码级别执行。你认为我可以通过用 JIT 编译器替换解释器来获得更快的速度吗?如果有,为什么?
我知道同时实施方法和基准测试将为这个问题提供最准确的答案,但如果有明确的答案,可能不值得花时间。
谢谢。
【问题讨论】:
-
如果
very aggressive optimization在编译之前完成,我对此表示怀疑。不过,这取决于您的优化有多好。 -
计算机科学博士论文的有趣前提。让我们知道结果何时公布。
标签: jit software-design compiler-construction runtime-environment