为什么动态二进制翻译比静态二进制翻译更实用?

时间:2013-05-23 21:57:12

标签: c assembly compiler-construction binaryfiles

当谈到二进制翻译(重新编译)时,我总是听说动态二进制翻译通常是静态二进制翻译的更好的替代方法,但我似乎无法理解为什么在这背后。为什么总是认为静态二进制转换在仿真中无法实现?为什么动态二进制翻译总是被认为更实用?

通常人们会将此与JIT(即时)和静态编译之间的关系进行比较,但这种比较常常让我感到困惑,因为它们不仅仅是实际的实现。

1 个答案:

答案 0 :(得分:13)

当必须将机器代码从一个架构转换为另一个架构时,就会出现这种情况。静态地执行它需要能够正确识别代表代码的程序部分,而不是被二进制图像中实际数据的位弄糊涂。许多编译器都没有这么简单,任何人都试图反编译可执行文件的人都知道。

一个简单的例子是一个跳转表,它是从C语言中的switch语句生成的,与可执行代码一起编译成.text段。此表包含地址,而不是代码。知道将这些字节解释为地址需要了解编译器中内置的代码生成器。并非不可能,但当然它在其他编译器生成的代码上效果不佳。甚至是同一编译器的不同版本。

动态翻译不是问题,你知道一大块字节是代码,因为机器正在尝试执行它。

不同的考虑适用于抖动,这样的翻译器在识别代码时永远不会有问题,因为中间代码旨在使其变得容易。在这种情况下,动态转换是理想的,因为它可以随时间推移转换的开销,从而减少程序执行中的暂停。并完全避免对从未执行的代码进行处理。