动态编译语言与静态编译语言 [已关闭]

Brian Goetz的这篇文章的第一行让我在SO中发布了这个问题。这又是一行:

为动态编译的语言(如 Java)编写和解释性能基准测试比为静态编译语言(如 C 或 C++)编写和解释性能基准测试要困难得多。

我知道静态类型语言与动态类型语言的答案。但是动态编译语言和静态编译语言有什么区别呢?


答案 1

动态编译和动态类型化之间没有太大关系。类型是语言语法的一部分,而编译策略是语言实现的一部分。

动态类型意味着在声明变量时不必声明类型,并且在大多数情况下,类型之间的转换会自动发生。

动态编译意味着语言在执行程序时编译为机器代码,而不是之前。例如,这允许实时优化 - 在应用程序运行时优化代码。JIT 优化器的优点是,它具有更可靠的信息,这些信息涉及代码的哪些分支最常使用以及它们通常如何使用,因为它可以在应用优化之前观察应用程序的运行情况。

动态编译是自动基准测试的一个问题,因为同一程序代码部分的多个测量值可以比较完全不同的机器代码解释,因为优化程序已决定在两次运行之间更改实现。


答案 2

C 和 C++源代码通常由编译器编译为本机机器代码。

Java 由 Java 编译器编译为字节码。运行 Java 程序时,实时 (JIT) 编译器可能会将 Java 字节码编译为运行该程序的 CPU 的本机代码。

在程序运行时将程序编译为本机机器代码也称为动态编译