当谈到二进制翻译(重新编译)时,我一直听说动态二进制翻译通常比静态二进制翻译更好,但我似乎永远无法理解这背后的原因。为什么总是认为静态二进制翻译不可能在仿真中实现?为什么动态二进制翻译总是被认为更实用?
人们经常将此与 JIT(即时)和静态编译之间的关系进行比较,但这种比较常常让我感到困惑,因为两者都不仅仅是实际实现。
最佳答案
当必须将机器代码从一种体系结构转换为另一种体系结构时,就会出现这种情况。静态地执行它需要能够正确识别程序中代表代码的部分,并且不会被二进制图像中实际上是数据的位所混淆。许多编译器并没有使这变得容易,任何试图反编译可执行文件的人都知道这一点。
一个简单的示例是从 C 中的 switch 语句生成的跳转表,它与可执行代码一起编译到 .text 段中。此表包含地址,而不是代码。要知道将这些字节解释为地址,需要对编译器内置的代码生成器有很多了解。并非不可能,但它当然不能很好地处理由另一个编译器生成的代码。甚至同一编译器的不同版本。
动态翻译不是问题,您知道一大块字节是代码,因为机器正在尝试执行它。
对抖动有不同的考虑,这样的翻译器在识别代码时永远不会有问题,因为中间代码的设计是为了让它更容易。在这种情况下,动态翻译是可取的,因为它可以随着时间的推移分散翻译的开销,从而减少程序执行中的暂停。并完全避免处理永远不会执行的代码。
关于c - 为什么动态二进制翻译比静态二进制翻译更实用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724593/