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

标签 c assembly compiler-construction binaryfiles

当谈到二进制翻译(重新编译)时,我一直听说动态二进制翻译通常比静态二进制翻译更好,但我似乎永远无法理解这背后的原因。为什么总是认为静态二进制翻译不可能在仿真中实现?为什么动态二进制翻译总是被认为更实用?

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

最佳答案

当必须将机器代码从一种体系结构转换为另一种体系结构时,就会出现这种情况。静态地执行它需要能够正确识别程序中代表代码的部分,并且不会被二进制图像中实际上是数据的位所混淆。许多编译器并没有使这变得容易,任何试图反编译可执行文件的人都知道这一点。

一个简单的示例是从 C 中的 switch 语句生成的跳转表,它与可执行代码一起编译到 .text 段中。此表包含地址,而不是代码。要知道将这些字节解释为地址,需要对编译器内置的代码生成器有很多了解。并非不可能,但它当然不能很好地处理由另一个编译器生成的代码。甚至同一编译器的不同版本。

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

对抖动有不同的考虑,这样的翻译器在识别代码时永远不会有问题,因为中间代码的设计是为了让它更容易。在这种情况下,动态翻译是可取的,因为它可以随着时间的推移分散翻译的开销,从而减少程序执行中的暂停。并完全避免处理永远不会执行的代码。

关于c - 为什么动态二进制翻译比静态二进制翻译更实用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724593/

相关文章:

c - sha2 256 的 C 实现中的错误哈希输出

你能帮助改进我大学的一门低级软件和外围接口(interface)类(class)吗?

c++ - 为什么要更改 C++ 中特定警告的警告级别?

windows - 最好的 win32 编译脚本语言?

c - 使用 GCC 编译时出现汇编错误

java - 对编译器处理继承和方法调用感到困惑

CC65 : Four lines bad, 两行好吗?

c - 如何使用参数和标准输入作为输入来调试 C 程序

c - switch 中的多个 fork() 导致指数执行

winapi - 汇编器 : Getting Win32's WinMain on-stack parameters