如何为自定义CPU创建C编译器?

时间:2012-01-01 23:12:47

标签: c compiler-construction customization

为自定义CPU创建C编译器的最简单方法是什么,假设我当然已经有了汇编程序?

由于C编译器生成汇编,是否有一些方法可以为各种C语言定义标准位和汇编代码片段,重建编译器,从而获得目标硬件的交叉编译器?

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

请注意:询问如何编写编译器本身。我确实在大学里学过这门课程,我知道一般的编译器编译器等等。在这种情况下,我只想配置一些现有的框架,如果可能的话。我不想修改语言,我只是希望能够定位任意架构。如果答案结果是“它不会那样”,那么 信息将对我和其他可能做出类似假设的人有用。

6 个答案:

答案 0 :(得分:32)

Quick overview/tutorial on writing a LLVM backend.

  

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

     

[。 。 。 ]

     

要创建静态编译器(发出文本汇编的编译器),您需要实现以下内容:

     
      
  • 描述注册集。
  •   
  • 描述指令集。
  •   
  • 描述目标机器。
  •   
  • 为架构实施装配打印机。
  •   
  • 为架构实现指令选择器。
  •   

答案 1 :(得分:9)

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

编辑:我刚刚在GCC邮件列表上发现了一个问题,关于如何添加新目标,有人指向this

答案 2 :(得分:3)

简短的回答是它不会那样工作。

更长的答案是,为新的CPU类型编写编译器需要花费一些精力。但是,您无需从头开始创建编译器。大多数编译器都有几个通道;这是一个典型的架构(可能有很多变化):

  1. 句法分析(词法分析器和解析器),以及C预处理,导致抽象语法树。
  2. 类型检查,导致带注释的抽象语法树。
  3. 中间代码生成,导致与体系结构无关的中间代码。在此阶段执行了一些优化。
  4. 机器代码生成,导致装配或直接到机器代码。在此阶段进行了更多优化。
  5. 在本说明书中,仅步骤4取决于机器。因此,您可以使用编译器,其中第4步明确分开并插入您自己的步骤4.这样做需要深入了解CPU以及对编译器内部的一些了解,但您不必担心之前发生的事情。

    几乎所有非常小,非常罕见或非常老的CPU都有GCC的后端(步骤4)。编写GCC后端的主要文档是GCC internals manual,特别是machine descriptionstarget descriptions的章节。 GCC是免费软件,因此使用它没有许可成本。

答案 3 :(得分:2)

1)简答:

“没有。没有”编译框架“这样的东西,你只需加水(插入你自己的装配集),搅拌,就完成了。”

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

如果您想自己动手,我首先要看看Gnu CC。它已经可用于各种各样的CPU和平台。

3)看一下这个链接以获得更多想法(包括“只是构建一个函数和宏库”的想法),这将是我的第一个建议:

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

答案 4 :(得分:2)

vbcc(在www.compilers.de上)是一个用C编写的简单易用的可重定向C编译器。它比GCC / LLVM简单得多。这很简单,我能够在没有任何编译器知识的情况下,将编译器重新定位到我自己的CPU上几周。

答案 5 :(得分:1)

您可以修改现有的开源编译器,例如GCC或Clang。其他答案为您提供了有关更多信息的链接。但是这些编译器并非旨在轻松重新定位;与其他针对特定目标的编译器相比,它们比编译器“更容易”重新定位。

但是如果你想要一个相对容易重新定位的编译器,你需要一个可以用明确的术语指定机器架构的编译器,而某些工具会生成其余的编译器(GCC会做一些这样的事情;我不喜欢我认为Clang / LLVM做得很多但我在这里错了。)

文献中有很多内容,谷歌“编译器 - 编译器”。

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

如果您不关心代码质量,您可以使用C AST编写C语言指向的汇编程序。你可以从GCC,Clang,也许是ANTLR和我们的DMS Software Reengineering Toolkit获得C AST。