即时编译和动态编译有什么区别?

What is the difference between Just-in-time compilation and dynamic compilation?

具体来说,维基百科指出 "JIT compilation is a form of dynamic compilation, [...]"[1]。但这两个词不就是同义词吗?两者有什么区别?

有没有不属于 JIT 编译的动态编译示例?或者做不到这一点,在某些情况下,术语动态编译比 JIT 编译更合适吗?

这两个术语似乎都指在 运行 时执行编译。这两个术语似乎都描述了源代码编译和字节码编译。这两个术语似乎都涵盖了 运行 时间优化。

我自己的印象是,JIT 编译是一个流行的术语,因为它是 Java VM 中的动态编译的名称。这个概念流行起来,其他程序 运行 次开始复制它,并以相同的名称调用它,即 JIT 编译。动态编译似乎是一个早于该发展的术语,并且主要出现在较早的科学出版物中。

诚然,维基百科令人困惑。首先它说:

just-in-time (JIT) compilation, also known as dynamic translation...

然后它说:

JIT compilation is a form of dynamic compilation, and allows adaptive optimization such as dynamic recompilation...

这也说明动态翻译也是动态编译的一种形式,意义不大。

术语 动态编译 在 1995 年之前是指代 run-time 编译代码技术系列的标准且唯一的术语。例如,检查out this 1985 年讨论 Prolog 动态编译的论文。许多 1995 年之前的论文都可以很容易地找到使用该术语的文章。

但是,Java 编程语言是在 1995 年左右发布的,Java 文档首先使用术语 JIT 编译JIT 编译器。我能找到的最早的此类文档是 this,尽管第一个 Java JIT 编译器是在 1996 年开发的。我看到许多在那个时间范围内发表的论文交替使用这两个术语。

我还记得我读过的一些论文认为 JIT 编译是一种动态编译。