【问题标题】:Dynamically compiled language vs statically compiled language [closed]动态编译语言与静态编译语言 [关闭]
【发布时间】:2012-09-17 23:51:57
【问题描述】:
【问题讨论】:
标签:
java
c
compiler-construction
compilation
programming-languages
【解决方案1】:
动态编译 和动态typed 没有太大关系。类型是语言语法的一部分,而编译策略是语言实现的一部分。
动态类型意味着您不必在声明变量时声明类型,并且类型之间的转换在大多数情况下会自动发生。
动态编译意味着语言在程序执行时被编译成机器码,而不是之前。例如,这允许即时优化 - 代码在应用程序运行时进行优化。 JIT 优化器的优点是它拥有关于哪些代码分支最常使用以及它们通常如何使用的更可靠的信息,因为它可以在应用优化之前观察正在运行的应用程序。
动态编译是自动基准测试的一个问题,因为同一程序代码部分的多次测量可以比较完全不同的机器代码解释,因为优化器已决定在两次运行之间更改实现。
【解决方案3】:
动态与静态编译是指如何以及是否可以在执行期间更改编译器生成的代码以改变性能或程序。
静态编译不允许此类操作,因为所有地址和跳转都是固定的(除非您自己编写代码以在执行期间更改指令顺序)。
动态编译允许在程序执行期间进行检查,收集到的信息可用于使程序运行得更快。 Wikipedia article 易于阅读且内容丰富。
【解决方案4】:
从基准测试的角度来看,不同之处在于动态编译程序的执行时间在执行过程中会发生巨大变化。通常是先解释 java 代码,然后当解释器发现某个方法被多次调用时,它会调用 JIT 编译器将其转换为原生代码。编译后的代码仍会受到监控,当确定频繁执行的代码部分(“热点”)时,会对其进行进一步优化。
至少,动态编译语言的基准测试必须将“升温阶段”(代码优化时)与执行的其余部分分开处理。