周末闲来无事,打算拿LLVM构造一个小程序练练手,正巧我最近在玩Brainfuck语言,所以决定拿LLVM构造一个Brainfuck的编译器。 一个典型的编译器分为几个部分:
中间代码自然是使用LLVM IR,LLVM提供了一系列的工具生成和处理IR,的确很方便。 整个程序的结构其实很简单,关于Parser部分唯一需要注意的是Brainfuck要求'['和']'对应,所以我针对这一要求,单独设立一个叫做Loop的语法结构来保证这一点。 使用LLVM的一个额外收获就是JIT,生成IR之后,LLVM提供了完善的功能对IR进行即时编译,这个功能可以直接用来写一个“解释器”(好吧,其实还是编译器,只不过是JIT的) 最后,链接器严重依赖与系统,而且有无数的坑,所以我选择直接调用系统的链接器。因为我实在懒得写一大堆处理命令行参数和调用外部命令的C++程序,所以我写了一个Python脚本,把这些繁琐的工作包装了一下。 如果你有兴趣开发别的什么语言的编译器,这个项目可以拿来作为一个参考起点,虽然作为一门语言Brainfuck有点脑残,但是作为一个编译器,bfc包含了所有必须的模块。 源代码在 https://github.com/windoze/brainfuck ,test目录下有一些Brainfuck程序的例子,这个脑残语言其实功能比你想想的多…… |
|