C ++编译器如何知道正在使用哪种CPU架构

时间:2017-03-10 10:04:07

标签: c++ assembly

参考:http://www.cplusplus.com/articles/2v07M4Gy/

在编译阶段,

此阶段将程序转换为低级汇编级代码。编译器获取预处理文件(没有任何指令)并生成包含程序集级别代码的目标文件。现在,创建的目标文件是二进制形式。在创建的目标文件中,每行描述一个低级机器级指令。

现在,如果我是正确的,那么不同的CPU架构可以使用不同的汇编语言/语法。

我的问题是编译器如何知道源代码必须更改哪种汇编语言语法?换句话说,C ++编译器如何知道它正在使用的机器中有哪些CPU架构?

汇编程序是否使用了CPU架构为不同CPU架构生成汇编代码的映射?

N.S:我是初学者!!

4 个答案:

答案 0 :(得分:9)

每个编译器都需要移植"到给定的系统。对于每个支持的系统,一个"编译器端口"需要由深入了解系统的人编程。

答案 1 :(得分:3)

警告:这是非常简化的

简而言之,编译器有三个主要部分:

  • "前端" :这部分读取语言(在本例中为c ++)并将其转换为一种特定于编译器的伪代码。 (摘要句法树或AST)

  • "优化器/中等端" :这部分采用AST并进行非架构相关的优化。

  • "后端" :这部分采用AST,并将其转换为二进制可执行代码,特定于您要编译语言的体系结构。

当您为您的平台下载c ++编译器时,您实际上是使用linux-amd64后端下载c ++前端,例如。

这种编码体系结构非常有用,因为它允许将编译器移植到另一个体系结构,而无需重写整个解析/优化的东西。它还允许某人创建另一个优化器,甚至是支持整个不同语言的另一个前端,并且只要它输出正确的AST,它就会与为此编译器编写的每个后端兼容。

答案 2 :(得分:0)

简单地说,目标系统的知识被编码到编译器中。

因此,您可能拥有一个生成SPARC二进制文件的C编译器,以及一个生成VAX二进制文件的C编译器。它们都接受相同的输入语言(如C标准中所定义),但会从中生成不同的程序。

通常我们只是引用" 编译器",这意味着将为我们当前的环境生成二进制文件。

在现代,对于像GCC这样的编译器集合,这种区别变得不那么明显了。现在"不同的编译器"通常是相同的编译器程序,只需设置不同的配置(这些是"目标描述文件")。

答案 3 :(得分:0)

只是为了完成这里给出的答案:

目标体系结构确实被编码到您正在使用的特定编译器实例中。这对于称为"交叉编译"的过程也很重要。 - 在某个系统上编译可在另一个系统/体系结构上运行的可执行文件的过程。

考虑使用与您自己完全不同的嵌入式片上系统 - 您正在x86 / 64 Linux系统上工作,但需要编译在ARM微网上运行的移动应用程序-processor,或其他类型的程序集体系结构。 在目标系统上编译代码是不合理的,因为它可能在CPU和内存方面受到限制而无法运行编译器 - 因此您可以使用GCC(或任何其他编译器)端口您最喜欢的系统上的目标架构。

同样重要的是要记住整个工具链通常与目标系统兼容,例如当libc等共享库正在发挥作用时 - 因为目标操作系统可能是不同的版本Linux并且具有不同版本的通用功能 - 在这种情况下,使用包含所有必需库的工具链并使用chrootmock之类的东西编译在&中是很常见的#34;目标环境"来自你的系统。