二進制代碼的兼容性

二进制代码兼容性也稱為二进制兼容或目标代码兼容，是计算机系统的一种特性，意味着它可以运行与另一计算机系统相同的可执行代码，通常是通用计算机中央处理器（CPU）的机器码。另一方面，意味着程序需要重新编译或解释才能够在兼容系统上运行。

对于通用操作系统上的已编译程序，二进制兼容性通常不仅意味着两个计算机的CPU（指令集）是二进制兼容的，还意味着操作系统（OS）和应用程序接口（API）的接口和行为，以及与这些API对应的应用程序二进制接口（ABI），足够相似，即“兼容”。

诸如向下兼容这样的术语通常暗示对象代码兼容。这意味着较新的计算机硬件和/或软件具有旧版本的所有功能，加上额外的能力或性能。因此，较老的可执行代码将在较新的产品上不变地运行。对于直接在OS下CPU上运行的已编译程序，“二进制兼容操作系统”主要意味着与另一个系统具有应用程序二进制接口（ABI）兼容。然而，这也常常暗示了应用程序依赖的API，无论是直接还是间接（例如Windows API），都足够相似。硬件（除了CPU，例如图形硬件）和外围设备也是完全兼容性的因素，尽管许多硬件差异被现代API隐藏了起来（这些API部分由OS本身提供，部分由特定设备驱动提供）。

在其他情况下，为使非二进制兼容程序工作，必须使用软件的一般移植。

当开发需要在多个操作系统上运行的计算机程序时，二进制兼容性是一个主要优势。一些基于Unix的操作系统，如FreeBSD或NetBSD，为更流行的操作系统如Linux衍生版提供了二进制兼容性，因为大多数二进制可执行文件并不常为此类操作系统分发。

大多数操作系统在其每个版本中为早期版本构建的大多数二进制文件提供二进制兼容性。例如，为Windows 3.1、Windows 95或Windows 2000编译的许多可执行文件也可以在Windows XP或Windows 7上运行，而许多DOS应用程序则可以在更新版本的Windows上运行，最高到Windows 10，也就是最后一个支持的版本。

 二进制兼容硬件 
对于以硬件实现的数字处理器来说，二进制兼容性意味着为另一处理器生成的大部分机器码可以正确执行，并且具有与另一处理器几乎相同的效果。这在许多处理器家族中很常见，但在围绕这些处理器构建的小型嵌入式系统中却很少见。完全机器码兼容性意味着中断处理程序、I/O端口、硬件寄存器、计数器/定时器、外部接口等布局完全相同。对于使用更多抽象层次、更复杂的嵌入式系统（有时接近于通用计算机，如手机），情况可能有所不同。

 二进制兼容操作系统 
二进制兼容操作系统是旨在实现与另一操作系统或同品牌其他变体进行二进制兼容性的OS。这意味着它们是应用程序二进制接口（ABI），由于OS工作的任务是运行程序，因此运行这些OS的指令集架构必须相同或互相适应，否则可以通过CPU仿真器或者更快动态翻译机制来使其适应。

例如，Linux内核与Windows不兼容。这并不意味着Linux不能与Windows应用程序实现二进制兼容。额外的软件Wine可以在一定程度上实现这种兼容性。ReactOS开发项目旨在创建一个开源的、自由软件的操作系统，该系统使用Wine来实现应用程序兼容性，并重新实现Windows内核以增加驱动程序等方面的兼容性，从而与微软的Windows NT系列操作系统二进制兼容，而Linux则使用Linux驱动程序，而不是Windows驱动程序。FreeBSD和BSD家族的其他成员通过将Linux系统调用转换为BSD系统调用，在用户模式下与Linux内核具有二进制兼容性。这使得在基于Linux的操作系统上运行的应用程序和库代码也能够在BSD上运行。

请注意，二进制兼容操作系统不同于通过虚拟化或仿真运行另一个操作系统，这种情况下是在主机操作系统不兼容时为了运行替代操作系统中的软件。有时虚拟化由主机操作系统提供（或者可以获取这种软件），这实际上使主机操作系统能够对程序进行兼容。例如，Windows 7上的Windows XP模式允许用户运行64位版本的Windows 7，并使旧软件仍然能够在32位虚拟机中运行Windows XP；VMware Workstation/VMware Fusion、Parallels Workstation和Windows Virtual PC允许其他操作系统在Windows、Linux和macOS上运行。

再举个例子，在PowerPC上的Mac OS X能够通过Classic环境运行Mac OS 9及更早期的软件——但这并没有让Mac OS X成为一个与Mac OS 9完全二进制兼容的操作系统。相反，Classic环境实际上是在一个虚拟机中运行Mac OS 9.1，把它作为一个普通进程在Mac OS X内部运行。

 参见 
 应用二进制接口

参考资料

Category:電腦術語
Category:向后兼容