分享

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

 quasiceo 2016-12-21

在腾讯云上创建您的SQL Cluster>>> ?  

周末闲来无事,打算拿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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多