怎么交八哥说八哥?
说“八哥”,先要了解什么是八哥、什么不是八哥。 八哥(ACM)是Advance Compilation Manager的简称。这是一个开源项目,目标是实现一个功能强大,高度自动化编译器。现在项目的目标是支持C/C++、Pascal和Fortran语言,在Linux操作系统上能够完成大部分代码的自动编译工作。 现在我们打开项目主页可以看到正在开发阶段的编译器已经可以编译部分C和C++代码了(需要配置交叉编译环境才能运行) 那么我们再来看看这个项目的源代码是怎么样的。
从上面的代码可以看到,这个项目主要是使用自动机来实现语言的通用语法分析,然后使用抽象语法树来转换成中间文件,最后利用编译器的优化技术生成目标代码。整个工程的框架都是采用类库的方式来开发的,这给代码的维护和管理提供了便利的条件。
我这里简单介绍一下怎么用cmake生成可执行程序。首先把cmake添加到环境变量中 然后在命令行窗口中输入cmake –H –B 这样就会在指定目录中新建两个子目录用于存放生成的中间文件和目标文件 在子目录中依次执行cmake –E make 这个过程可能需要一会儿的时间,主要是在进行语法分析和生成抽象语法树,上面图片就是生成树的结构,如果一切顺利的话应该会成功。接下来就只需要等待就行了。 如果一切顺利的话就可以在 \build 下面看到两个可执行程序,一个是acm 一个是我加上自己写的代码编译器,这个就是我想要的效果啦!
好了,现在我们已经实现了用 cmake 来生成我们的acm编译器,下一步就要想用什么方式让 acm 理解我们编写的代码,也就是要实现语法树中的所有节点都有人类可读的形式,只有这样我们才能对代码进行编辑和检测。 下面我就用一个简单的例子演示如何修改源代码来适应 acm 的语法,最终的目标就是把上面的代码能成功的编译通过。
首先我们把源码用工具生成对应的语法树 然后把我们要修改的节点选中,注意这里我是只选中了函数名,因为函数体里有我们自定义的编译选项需要添加进去。 接着我们就可以开始修改了,我在把函数名改成了我的名字,并且添加了返回值的注释。
接下来我们就需要重新构建语法树并生成新的抽象语法树,这个过程是可以反复进行的,直到我们的修改达到理想的状态为止,我这里是删除了一处注释,所以需要添加回去。 全部测试通过之后我们就可以添加头文件,导入模块,开始正式编写代码了,这里我就不赘述了。
希望可以帮助大家理解这个项目的架构,有什么问题可以评论或者私信。