如何创build自定义CPU的C编译器?

假设我已经有了一个汇编器,那么为自定义CPU创build一个C编译器最简单的方法是什么?

由于C编译器生成汇编,有没有办法为各种C语言定义标准位和汇编代码段,重新编译编译器,从而获得目标硬件的交叉编译器?

编译器本身最好用C语言编写,构build为Linux或Windows的本地可执行文件。

请注意:问如何编写自己的编译器。 我在大学里学过这门课程,我知道一般的编译器编译器等等。在这种情况下,我只想configuration一些现有的框架,如果可能的话。 我不想修改语言,我只想要能够针对任意的架构。 如果答案是“这种方式不行”, 那么这些信息对于我自己和其他任何可能作出类似假设的人都是有用的。

关于编写LLVM后端的快速概述/教程。

本文档描述了用于编写将LLVM表示法转换为机器汇编代码或其他语言的LLVM的后端技术。

[。 。 。 ]

要创build一个静态编译器(发出文本集合的编译器),您需要实现以下内容:

  • 描述寄存器组。
  • 描述指令集。
  • 描述目标机器。
  • 实施该体系结构的组装打印机。
  • 为架构实现一个指令select器。

有一个交叉编译器的概念,即一个在一个架构上运行,但是针对不同的架构。 你可以看到GCC是如何做的(例如),并添加一个新的架构,如果这是你想要扩展的编译器。

编辑:我刚刚发现了一个问题,几年前在GCC邮件列表上如何添加一个新的目标,有人指出

1)简短的回答:

“不,没有”编译器框架“这样的东西,你可以加水(插入你自己的程序集),搅拌,然后就完成了。

2)较长的回答:这当然是可能的。 但具有挑战性 而且可能很贵。

如果你想自己做,我会先看看Gnu CC。 它已经可用于各种CPU和平台。

3)看看这个链接以获得更多的想法(包括“build立一个函数和macros库”的想法),这是我的第一个build议:

http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/

简单的答案是,它不会那样工作。

更长的回答是,为新的CPUtypes编写编译器需要花费一些努力。 但是,您不需要从头创build编译器。 大多数编译器都是通过几次传递的。 这是一个典型的架构(可能有很多变化):

  1. 语法分析(词法分析器和分析器),并用于C预处理,导致抽象语法树。
  2. types检查,导致注释的抽象语法树。
  3. 中间代码生成,导致独立于架构的中间代码。 有些优化是在这个阶段执行的。
  4. 机器代码生成,导致汇编或直接到机器代码。 在这个阶段进行更多的优化。

在这个描述中,只有步骤4是机器相关的。 所以你可以把编译器的第4步清楚地分开,然后插入你自己的第4步。这样做需要对CPU有深刻的理解,并且对编译器内部的一些理解,但是你不需要担心之前会发生什么。

几乎所有不是非常小,非常less或很老的CPU都有GCC的后端(步骤4)。 编写GCC后端的主要文档是GCC内部手册 ,特别是关于机器描述和目标描述的章节。 海湾合作委员会是自由软件,所以没有使用许可证的成本。

您可以修改现有的开源编译器,如GCC或Clang。 其他答案已经提供了关于在哪里学习更多的链接。 但是这些编译器的devise并不容易重新定位, 与其他编译器相比,它们比编译器更容易redirect。

但是如果你想要一个相对容易redirect的编译器,你需要一个可以用明确的术语来指定机器结构的工具,而一些工具则会生成编译器的其余部分(GCC做了一些这样的工作;我不认为铿锵/ LLVM做了很多,但我可能在这里是错的)。

在文献中有很多,谷歌“编译器 – 编译器”。

但是对于C的具体解决scheme,您应该查看ACE ,一个编译器供应商,可以根据需要为客户生成编译器。 不是免费的,但是我听说他们很快就生产出了非常好的编译器。 我认为它产生标准样式的二进制文件(ELF?),所以它跳过了汇编程序阶段。 (我没有ACE的经验或关系。)

如果你不关心代码的质量,你可以用C AST编写一个C的汇编语法指令。 你可以从GCC,Clang,也许ANTLR,以及从我们的DMS Software Reengineering Toolkit获得C AST。

vbcc(在www.compilers.de)是一个用C语言编写的优秀而简单的可重定位的C编译器。它比GCC / LLVM简单得多。 非常简单,我可以将编译器重新编译到我自己的CPU上几个星期的工作,而无需事先了解编译器。