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

时间:2013-03-16 20:22:13

标签: gcc compiler-construction compilation cross-platform

我刚刚意识到二进制编译器将源代码转换为目标平台的二进制文件。有点明显......但是如果编译器以这种方式工作,那么如何将相同的编译器用于不同的系统,如x86,ARM,MIPS等?

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

该系统如何成为可能,以及如何针对这么多平台同时优化编译器?

4 个答案:

答案 0 :(得分:4)

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

取自维基百科

  

编译器的结构

     

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

     

编译器需要

     
      
  1. 确定程序语法的正确性,

  2.   
  3. 生成正确有效的目标代码,

  4.   
  5. 运行时组织,

  6.   
  7. 根据汇编程序和/或链接程序约定格式化输出。

  8.         

    一个   编译器由三个主要部分组成:前端,中端,   和后端。

         

    前端

         

    检查程序是否正确   用编程语言语法和语义编写。   在这里,合法和非法程序得到承认。报告错误,   如果有的话,以有用的方式。类型检查也通过收集来执行   类型信息。然后前端生成一个中间体   用于处理的源代码的表示或IR   中端。

         

    中间

         

    是优化发生的地方。典型   优化的转换是删除无用或无法访问   代码,发现和传播常数值,重新定位   计算到较不频繁执行的地方(例如,在循环之外),   或基于上下文的计算专业化。中端   为后续后端生成另一个IR。大多数优化   努力集中在这一部分。

         

    后端

         

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

更多这篇文章介绍structure of a compiler及其中涉及Cross compilers的文章。

答案 1 :(得分:2)

http://llvm.org/项目将回答您在这方面的所有问题:) 简而言之,跨HW硬件编译器发出代码的“中间表示”,这与HW无关,然后通过 native 工具链进行自定义

答案 2 :(得分:2)

是的,有可能,它被称为Cross Compiler。编译器通常首先生成object code,这是当前机器无法想象的,但它可以通过另一个编译器迁移到命运机器。接下来,目标代码再次“编译”并与目标机器的外部库链接。

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

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

答案 3 :(得分:2)

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

现在让我们来看一下gcc的具体例子。 GCC源代码有许多层,包括体系结构依赖和独立部分。体系结构相关部分包含处理体系结构特定事物的过程,如堆栈,函数调用,浮点运算。我们需要交叉编译特定架构的gcc源代码,例如ARM。您可以在此处查看其步骤以供参考: - http://www.ailis.de/~k/archives/19-arm-cross-compiling-howto.html#toolchain

此体系结构相关部分负责处理机器语言操作。