C++代码只能针对特定的 CPU 体系结构进行编译.有没有办法将其编译为所有架构

  • 本文关键字:编译 有没有 代码 体系结构 CPU C++ c++
  • 更新时间 :
  • 英文 :


C++编译器将代码编译为可执行文件(.exe),其中包含由CPU命令组成的CPU可读机器代码。不同的 CPU 具有不同的体系结构和可能不同的命令。如果 CPU 具有不同的命令,则为我的 CPU 编译的可执行文件可能无法在另一台具有另一种架构和另一个命令的 CPU 的计算机上运行。例如,在SkyLake内核上编译的程序将在KabyLake内核上运行,并将在IntelCPU上编译的程序在AMD CPU上运行。我说的对吗?如果是这样,有没有办法在计算机上使用正确的命令安装正确的可执行文件?还请回答示例中的问题。

你是对的。 编译器的输出是机器码,不同的CPU架构有不同的指令集,需要不同的机器码。 因此,x86 机器代码不会在基于 ARM 的 CPU 上运行。

编译器可以输出运行编译器的 CPU 以外的 CPU 的机器代码。 这通常被称为"交叉编译",所有主要的C++编译器都在某种程度上具有这种能力。

另请注意,可执行文件只是一个包含机器代码的文件。 操作系统的程序加载器负责将该机器代码从文件加载到内存中并实际开始执行它。 因此,完全有可能在一个可执行文件中包含多个 CPU 体系结构的机器代码。 例如,MacOS可执行文件格式通过其"通用二进制"格式支持此功能,该格式允许单个可执行文件包含PowerPC和x86 CPU的机器代码。

不同的操作系统也使用不同的可执行文件格式,并具有不同的支持例程。 这意味着为Windows编译的程序不会在Linux上运行,即使它们都运行在具有相同体系结构的CPU上。 这就是Linux和WINE的Windows子系统等东西的用武之地,允许一个操作系统加载和执行为不同操作系统编译的程序。

针对"所有体系结构"进行编译实际上是不可能的,因为其中一些与你的预期非常不同。

我们能做的最好的事情就是编译为虚拟机字节码,如Java或.NET。然后,编译的代码可以在安装了虚拟机的任何系统上运行。

Java非常通用,所以它是一个不错的选择。但是,由于它专注于面向对象和垃圾收集,因此对其进行C++编译有点棘手。

另一个变得非常流行的虚拟机是JavaScript WASM(Web Assembly),它曾经是ASM.js但现在它更加标准化和跨浏览器。它利用了当前所有浏览器都将JS编译为机器代码的事实,因此WASM是一种特殊形式的JS,几乎一对一地编译成机器代码。

见 https://medium.com/@tdeniffel/pragmatic-compiling-from-c-to-webassembly-a-guide-a496cc5954b8

相关内容

最新更新