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

Jus*_*eff 45 c compiler-construction customization

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

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

优选地,编译器本身将用C编写,并且构建为Linux或Windows的本机可执行文件.

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

Pub*_*bby 31

编写LLVM后端的快速概述/教程.

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

[...]

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

  • 描述寄存器组.
  • 描述指令集.
  • 描述目标机器.
  • 为架构实现组装打印机.
  • 实现架构的指令选择器.

  • 我是离开之前评论的同一个人.我已经在LLVM上工作了一年半.我可以开发自己的后端并组装.是的,掌握LLVM基础设施需要一年时间,但我认为值得. (8认同)
  • @Ehsan你认为你可以写一些文档吗?:-D (3认同)
  • LLVM非常复杂,完全没有文档记录.甚至不要碰它.这浪费了我一生的一个月. (2认同)
  • @wizzwizz4 我可能会在完成我的博士论文后这样做。 (2认同)

Ric*_*nes 9

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

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

  • 用链接编辑了答案.这是一个有点大的文件,但我想这是要走的路...... (2认同)

Gil*_*il' 8

简短的回答是,事实并非如此。

更长的答案是,为新的 CPU 类型编写编译器确实需要一些努力。但是,您不需要从头开始创建编译器。大多数编译器都是分多次构建的;这是一个典型的架构(可能有很多变化):

  1. 语法分析(词法分析器和解析器)以及 C 预处理,生成抽象语法树。
  2. 类型检查,生成带注释的抽象语法树。
  3. 中间代码生成,导致独立于体系结构的中间代码。在此阶段进行一些优化。
  4. 机器代码生成,导致汇编或直接产生机器代码。此阶段会进行更多优化。

在本描述中,只有步骤 4 是与机器相关的。因此,您可以采用一个将步骤 4 明确分开的编译器,并插入您自己的步骤 4。这样做需要对 CPU 的深入了解以及对编译器内部结构的一些了解,但您无需担心之前发生的情况。

几乎所有不是非常小、非常罕见或非常旧的 CPU 都有一个GCC后端(步骤 4) 。编写 GCC 后端的主要文档是GCC 内部手册,特别是有关机器描述目标描述的章节。GCC 是免费软件,因此使用它无需支付许可费用。


dsu*_*ula 6

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