2013-03-16 99 views
2

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

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

该系统如何可能,以及如何在同一时间为多个平台优化编译器?

+0

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

回答

4

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

从维基百科

结构而编译器的

编译器桥源程序中高层 语言与底层硬件。

甲编译器要求

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

  2. 产生正确和有效的目标代码,

  3. 运行时的组织,和

  4. 根据汇编器和/或链接器约定格式化输出。

甲 编译器包括三个主要部分:前端,中端, 和后端。

前端程序

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

中端

是优化地方发生。典型的 变换用于优化是去除无用的或不可达的代码,常量值的发现和传播,将计算重定位到不太经常执行的地方(例如,,不在循环中), 或基于上下文的计算专业化。中端 为后面的后端生成另一个IR。大部分优化 的努力都集中在这一部分。

后端

是负责翻译从中间端的IR到汇编代码。每个IR指令都选择了目标指令 。寄存器分配 在可能的情况下为程序变量分配处理器寄存器。 后端利用硬件来确定如何保持并行执行单元繁忙,填充延迟槽等等。虽然大多数优化算法都在NP中,但启发式技术是很成熟的 。

更多这篇文章描述了structure of a compiler和这个处理Cross compilers

2

http://llvm.org/项目将回答您的所有问题,在这方面:) 简而言之,交叉编译器HW发出代码,这是硬件无关的,那么它正在通过本地工具定制的“中间表示”链

2

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

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

我建议您阅读附加链接以了解信息。

2

每个平台都有自己的工具链,工具链包括GCC,GDB,LD,纳米等

让我们以现在的gcc的具体例子。 GCC源代码有许多层次,包括架构依赖和独立部分。依赖于体系结构的部分包含处理体系结构特定事务的过程,例如其堆栈,函数调用,浮点操作。我们需要为像ARM这样的特定体系结构交叉编译gcc源代码。你可以在这里看到它的步骤供参考: - http://www.ailis.de/~k/archives/19-arm-cross-compiling-howto.html#toolchain

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