Gcc 编译器如何跨平台(硬件)?

Gcc 编译器如何跨平台(硬件)?,gcc,compiler-construction,compilation,cross-platform,Gcc,Compiler Construction,Compilation,Cross Platform,我刚刚意识到二进制编译器将源代码转换为目标平台的二进制代码。有点明显。。。但是,如果一个编译器是这样工作的,那么同一个编译器如何能用于不同的系统,如x86、ARM、MIPS等 难道他们不应该“知道”硬件平台的机器语言,从而知道如何构建二进制文件吗?编译器(如gcc)是否知道所支持的每个平台的机器语言 这个系统是如何实现的,一个编译器是如何同时针对这么多平台进行优化的?是的,他们必须“了解”他们支持的每个平台的机器语言。这是生成机器代码所必需的。然而,编译是一个多步骤的过程。通常,编译的第一步对于

我刚刚意识到二进制编译器将源代码转换为目标平台的二进制代码。有点明显。。。但是,如果一个编译器是这样工作的,那么同一个编译器如何能用于不同的系统,如x86、ARM、MIPS等

难道他们不应该“知道”硬件平台的机器语言,从而知道如何构建二进制文件吗?编译器(如gcc)是否知道所支持的每个平台的机器语言

这个系统是如何实现的,一个编译器是如何同时针对这么多平台进行优化的?

是的,他们必须“了解”他们支持的每个平台的机器语言。这是生成机器代码所必需的。然而,编译是一个多步骤的过程。通常,编译的第一步对于大多数体系结构都是通用的

摘自维基百科

编译器的结构

编译器在高级语言中桥接源程序 具有底层硬件的语言

编译器需要

  • 确定程序语法的正确性

  • 生成正确有效的目标代码

  • 运行时组织,以及

  • 根据汇编程序和/或链接器约定格式化输出

  • A 编译器由三个主要部分组成:前端、中间端、, 和后端

    前端

    检查程序是否正确运行 用编程语言的语法和语义编写。 在这里,合法的和非法的程序是可以识别的。报告错误, 如果有的话,以一种有用的方式。类型检查也通过收集数据来执行 类型信息。前端然后生成一个中间层 源代码的表示形式或IR,以供 中间端

    中间端

    是进行优化的地方。典型的 优化的转换是去除无用的或无法达到的 代码、常量值的发现和传播、重定位 将计算转移到执行频率较低的位置(例如,循环外), 或基于上下文的计算专门化。中间端 为以下后端生成另一个IR。大多数优化 这一部分是重点

    后端

    负责将IR从中间端转换为汇编代码。目标 为每个IR指令选择指令。寄存器分配 尽可能为程序变量分配处理器寄存器。 后端通过了解如何保持并行来利用硬件 执行单元忙,填充延迟槽,等等。虽然大多数 优化算法是NP,启发式技术是NP 发达的

    更多这篇文章描述的和在这一个处理

    该项目将回答您在这方面的所有问题:)
    简而言之,跨硬件编译器发出代码的“中间表示”,这是硬件不可知的,然后通过本机工具链对其进行自定义。编译器通常首先生成当前机器无法理解的数据,但可以使用另一个编译器将其迁移到destiny机器。接下来,再次“编译”目标代码,并将其链接到目标机器的外部库

    TL;DR:是的,编译器知道目标代码,但您可以在其他硬件中编译


    我建议您阅读附加的链接以获取信息。

    每个平台都有自己的工具链,工具链包括gcc、gdb、ld、nm等

    现在让我们以gcc为例。GCC源代码有很多层,包括依赖于体系结构的部分和独立的部分。依赖于体系结构的部分包含处理特定于体系结构的事情的过程,如堆栈、函数调用和浮点操作。我们需要交叉编译特定架构(如ARM)的gcc源代码。您可以在此处查看其步骤以供参考:-

    此依赖于体系结构的部分负责处理机器语言操作。

    “编译器(如gcc)是否知道所支持的每个平台的机器语言?”gcc的单一版本不会,因为它将针对特定的CPU系列。但GCC源代码树中存在对所有这些平台的支持,因此您可以为每个目标构建GCC版本。