今天跟大家伙儿聊聊我这几天折腾的9cc编译器,一开始看这玩意儿,头都大了,完全不知道是个但啃了几天,总算是有点眉目了,赶紧来分享一下。
我就是对着网上的资料一顿乱搜,啥9cc的介绍,源码,相关的文章,全下载下来。但是,资料是多,可真正能看懂的,没几个。
然后我就想,不行,不能这么瞎搞,得找个靠谱的教程。后来找到一个,跟着教程一步一步来。先是把环境搭这个还算顺利,装个gcc,再装个make,基本上就ok了。
接下来就开始编译9cc的源码。我记得第一个坎儿就是那个makefile文件,里面各种参数,各种命令,看得我眼花缭乱。不过还耐着性子,一个一个查,一个一个试,总算是把9cc给编译出来了。
编译出来之后,我就迫不及待地想跑一下看看效果。结果,直接报错了!当时那个心情,真是拔凉拔凉的。
不过咱也不能轻易放弃不是?我就开始debug,一步一步跟踪代码,看看是哪里出了问题。折腾了好几个小时,终于发现,原来是我的一个参数传错了。改过来之后,再跑,这回总算是成功了!
跑成功之后,我就开始研究9cc的源码。9cc的代码写得挺简洁的,但是逻辑还是挺复杂的。我一边看代码,一边画流程图,希望能搞清楚它的整个编译过程。
9cc主要分几个阶段:词法分析、语法分析、代码生成。词法分析就是把源代码分解成一个个token,语法分析就是把这些token组成语法树,代码生成就是把语法树转换成汇编代码。
我主要研究了一下代码生成的部分,因为这部分跟底层的汇编指令关系比较密切。9cc的代码生成器,是直接生成x86-64的汇编代码。
为了更好地理解代码生成的过程,我还专门去学了点x86-64的汇编指令。虽然学得不是很深入,但是也足够应付9cc的代码了。
在研究9cc的过程中,我发现了很多有趣的地方。比如,9cc的变量都是放在栈上的,函数的调用也是通过栈来实现的。
我还尝试着修改了一下9cc的代码,加了一些新的功能。比如,我给9cc加了一个支持if-else语句的功能。虽然只是一个很简单的功能,但是也让我对编译器的原理有了更深入的理解。
这回折腾9cc的经历,还是挺有收获的。虽然过程很痛苦,但是学到了很多东西。以后有机会,我还想继续深入研究一下编译器的原理。
给大家分享一下我的学习心得:
- 学习编译器,一定要动手实践,不能只看书。
- 遇到问题,不要轻易放弃,要耐着性子debug。
- 要多看源码,多思考,多画流程图。
希望我的分享能对大家有所帮助。
还没有评论,来说两句吧...