编译器和指令集

标签 c compiler-construction cpu instruction-set

"C is a genereal purpose language, not tied to a particular system" The C programming Language, BRIAN W KERNIGHAN & DENNIS M. RITCHIE

然而,使用正确的编译器,我们可以制作一个可以在每台 Windows 机器上运行的 .exe,这反过来意味着在每个 CPU 上运行 Windows。

所以我的问题是:是否每个 x86-64 CPU(Intel 或 AMD)都使用相同的指令集? (是的,我可以做一个比较……)如果没有,那么我将不得不假设编译器检测到我们正在运行的 CPU 并在编译期间使用正确的指令集。

我完全错了吗?

我几乎不知道我在说什么,所以请耐心等待。 只是一个想看看引擎盖下的家伙。

谢谢

最佳答案

英特尔制造了许多共享“x86-64”系列核心指令集的不同处理器模型(以及不共享的其他处理器模型)。即使在具有共享核心指令的处理器中,也存在差异。较新的型号可能有旧型号没有的指令,指令集的某些部分可能在某些型号上而不在其他型号上。

有些指令甚至在不同的处理器上表现不同。

当您编译一个程序时,编译器“针对”指令子集的特定组合。这意味着这些子集中的指令可供编译器在生成代码时使用。编译器在编译特定程序时可能会或可能不会使用任何特定指令或子集,具体取决于其需要或选择。生成的程序适用于具有目标指令的处理器模型,而不适用于其他模型(除非编译器碰巧没有使用任何不在这些模型上的指令,即使它可能有)。

通常,编译器目标的默认设置要么是您正在运行的处理器模型,要么是现代处理器模型常见的一些典型指令子集选择。也可以根据您为编译器提供的其他设置来选择目标,例如要求它以操作系统的特定版本为目标。但是,您可以传递编译器开关来告诉它针对完全不同的目标进行编译,甚至针对完全不同的体系结构进行编译,例如在 Intel 处理器上运行时针对 ARM 处理器进行编译。

软件也是计算机系统的一部分,因此编译器生成的可执行文件也可能取决于运行时可用的某些软件库或可用的某些操作系统功能。

关于编译器和指令集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47770515/

相关文章:

复制和释放 malloc 指针

C++ 析构函数和所有权

c - (char*)malloc(sizeof(char)) 分配多个字符?

c++ - 为什么 *must* delete[] 和 delete 是不同的?

java - RMI 性能太慢

machine-learning - Tensorflow - CPU 和 GPU 资源耗尽错误

c - 如何在C HTTP客户端程序中向文件写入HTTP请求

java - java什么时候比c++快(或者JIT什么时候比预编译快)?

c - 为什么编译器不在堆栈上分配和释放具有 "sub*"和 "add*"的局部变量?

kubernetes - kubeadm init error CPU 1 is less than required 2