我刚刚意识到二进制编译器将源代码转换为目标平台的二进制文件。有点明显......但是如果编译器以这种方式工作,那么如何将相同的编译器用于不同的系统,如x86,ARM,MIPS等?
他们不应该“知道”硬件平台的机器语言才能知道如何构建二进制文件吗?编译器(如gcc)是否知道所支持的每个平台的机器语言?
该系统如何成为可能,以及如何针对这么多平台同时优化编译器?
答案 0 :(得分:4)
是的,他们必须“了解”他们支持的每个平台的机器语言。这是生成机器代码所必需的。但是,编译是一个多步骤的过程。通常,编译的第一步对大多数体系结构都是通用的。
取自维基百科
编译器的结构
编译器在高级别中桥接源程序 具有底层硬件的语言。
编译器需要
确定程序语法的正确性,
生成正确有效的目标代码,
运行时组织,
- 醇>
根据汇编程序和/或链接程序约定格式化输出。
一个 编译器由三个主要部分组成:前端,中端, 和后端。
前端
检查程序是否正确 用编程语言语法和语义编写。 在这里,合法和非法程序得到承认。报告错误, 如果有的话,以有用的方式。类型检查也通过收集来执行 类型信息。然后前端生成一个中间体 用于处理的源代码的表示或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。
此体系结构相关部分负责处理机器语言操作。