很多程序语言都包含了使得编译期产出高质量代码困难的特性。比如 late binding, dynamic loading of both declarations and code, various kinds of polymorphism. 典型的 AOT 编译器,可以为这些特性生成代码。但是很多场景中,并不能很好的优化它们。因此 AOT 编译器必须生成通用的代码,而不能利用更加精确的信息。
对于很多问题,必要的信息在链接阶段或者加载时期才能获取。更甚至,在运行时才能获取。对于这种问题,系统可以将优化或者转化延迟到可以获取足够信息的阶段来生成高效的代码。
编译器开发者已经在不同上下文利用这些策略,runtime optimization 或者 just-in-time (JIT),从早期的 LISP 系统到现代脚本系统。已经用来建立正则表达式搜索能力和更快的 instruction-set emulator。本章描述这些技术的挑战,并且展示成功利用这些系统解决了实际问题。
JIT 编译器毫无疑问是计算机科学社区占比很重的。大多数 web 浏览器都包含搅拌语言的 JIT。类似 JAVA 的运行时系统也包含 JIT。因为这些系统在代码每次运行时编译代码,可以比传统 AOT 编译器执行更多的编译工作。
Conceptual Roadmap
传统的 AOT 编译器基于可以从文本代码推断的事实做决策。这种编译器可以为声明式 imperative 语言生成高效的代码。但是有些语言包含一些特性使得编译只能到运行时才能获取某些重要信息。这些特性包括动态类型,某些种类的多态,开放类结构。
运行时优化需要编译时间和代码质量的权衡。运行时优化器调查程序状态来获取更精确的信息;然后利用这些信息特化执行代码。因此,从效率层面来说,运行时优化器必须获取有用的信息。必须提升运行时性能,即使付出优化和代码生成的时间消耗。
Overview
略
Roadmap
JIT 设计要求基本的在 AOT,JIT,JIT 提升之间的权衡。随着语言,架构,运行时技术的改变,这些权衡也随之而变,随着社区经验增长持续修改演化。我们的技术经验在增长,但是基本的权衡要素仍然没有变。
本章会提供一个目前前沿出版物的快照。14.2 描述四个在 JIT 系统中国呢扮演重要角色的主要问题。接下来两节从不同角度呈现 JIT 的设计空间。14.3 描述 hot-trace 优化器,14.4 描述 hot-method 优化器;两种设计都在系统中成功应用。14.5 探讨了几个 JIT 设计构建过程中的其他问题。