Boost.Spirit+LLVM,双剑合璧开发一个脑残编译器

Windoze 发布于 2012/09/10 14:58
阅读 2K+
收藏 2

如何使用英特尔®oneAPI工具实现PyTorch 优化,直播火热报名中>>>

周末闲来无事,打算拿LLVM构造一个小程序练练手,正巧我最近在玩Brainfuck语言,所以决定拿LLVM构造一个Brainfuck的编译器。

一个典型的编译器分为几个部分:

  1. Lex/Parse,构造AST
  2. 将AST转换为中间代码,中间代码常用四元式(又叫三地址码)
  3. 将中间代码转换为原生目标代码
  4. 链接目标代码,生成可执行文件
Parser选用Boost.Spirit,原因很简单,第一,我不喜欢把语法定义放到一个单独的文件里,然后去和lex/yacc之类的工具作斗争;第二,我喜欢Attributed Grammar,不喜欢Semantic Action,Boost.Spirit完美的满足了我的需求。

中间代码自然是使用LLVM IR,LLVM提供了一系列的工具生成和处理IR,的确很方便。

整个程序的结构其实很简单,关于Parser部分唯一需要注意的是Brainfuck要求'['和']'对应,所以我针对这一要求,单独设立一个叫做Loop的语法结构来保证这一点。

使用LLVM的一个额外收获就是JIT,生成IR之后,LLVM提供了完善的功能对IR进行即时编译,这个功能可以直接用来写一个“解释器”(好吧,其实还是编译器,只不过是JIT的)

最后,链接器严重依赖与系统,而且有无数的坑,所以我选择直接调用系统的链接器。因为我实在懒得写一大堆处理命令行参数和调用外部命令的C++程序,所以我写了一个Python脚本,把这些繁琐的工作包装了一下。

如果你有兴趣开发别的什么语言的编译器,这个项目可以拿来作为一个参考起点,虽然作为一门语言Brainfuck有点脑残,但是作为一个编译器,bfc包含了所有必须的模块。

源代码在 https://github.com/windoze/brainfuck ,test目录下有一些Brainfuck程序的例子,这个脑残语言其实功能比你想想的多……

加载中
0
YehMatthew
YehMatthew
该评论暂时无法显示,详情咨询 QQ 群:点此入群
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部