动态重编译

在计算机科学中，动态重新编译（有时缩写为dynarec或伪首字母缩写DRC）是某些模拟器和虚拟机的功能。在执行期间，系统会重新编译程序的一些部分，调整生成的代码，使其表现程序的运行时环境，并有可能利用那些传统静态编译器不能获得的信息，生成更高效的代码。

用途 
大多数动态重编译器用于在执行时不同架构间转换机器码。这是一个在模拟传统游戏平台中往往需要执行的任务。在其他情况下，系统可采取动态重编译作为自适应优化的一部分，以执行可移植程序，如 Java 与 .NET 通用语言运行库 字节码。全速调试器还使用动态重编译来减少大多数逆优化技术中产生的空间开销，并实现其他功能，例如动态线程迁移。

任务 
动态重编译执行的主要任务：
 从源平台读入机器码
 为目标平台释放机器码
动态重编译也可以执行一些辅助任务：
 管理重编译代码的缓存
 在具有循环计数寄存器的平台上更新已循环计数
 中断检查管理
 为支持虚拟化的硬件提供接口，例如GPU
 优化更高级别的代码结构，以便在目标硬件上高效运行（见下文）

实例

应用

通用 
 动态重编译为许多Java虚拟机的特色
 在x86平台上苹果Mac OS X的Rosetta，允许PowerPC代码在x86架构上运行
 在PowerPC Classic Mac OS平台上运行摩托罗拉68000系列代码的Mac 68k模拟器
 Psyco，Python的一个专有编译器
 Mac上的Microsoft Virtual PC，用于在PowerPC架构上运行x86代码
 QEMU，一个开源的全系统模拟器
 VirtualBox使用动态重编译
 Valgrind，是一种用于内存调试、内存泄漏检测和性能分析的编程工具，它使用动态重新编译

游戏 
 MAME在其CPU模拟器中使用动态重编译，支持MIPS、SuperH、PowerPC，甚至是Voodoo GPU
 Xbox 360的向后兼容性功能（即运行为初版Xbox编写的游戏），人们普遍认为其使用动态重编译
 PPSSPP，索尼PlayStation Portable模拟器，其在x86与ARM平台上都有重编译器
 PCSX2， 索尼PlayStation 2模拟器，拥有"SuperVU"的继任者——"microVU"重编译器
 Dolphin，任天堂GameCube与Wii模拟器，有动态重编译选项
 DeSmuME，任天堂DS模拟器，有动态重编译选项

参见 
 二进制重编译器
 二进制翻译
 即时编译

参考资料

外部链接 
 Dynamic recompiler tutorial 
 Blog posts about writing a MIPS to PPC dynamic recompiler
编译原理
仿真软件
虛擬化軟體