历时2个月,我最终上交了我的编译原理课设
感想
课设花费了我相当的一段时间,有挺多天都是坐在凳子上写代码从早上到晚上。由于自己不是软件工程专业的学生,同时自己对于项目开发这类的问题了解不是很多,在编写这个项目的时候走了很多的弯路。接下来来一点点谈:
1、文件的组织
前后我写了2遍语义分析器,加上语法,词法所有文件的代码量粗约估计一下大概在3K+左右。一开始的时候我没有意识到这一个问题,我把所有的代码写在一个cpp里面,一开始在做词法分析器的时候,没有什么特别的感觉。后来写到语义分析的时候,全在一个文件里的代码可读性变得十分堪忧,而且后来想再增加功能的时候,也非常困难,于是,我直接换了一个IDE,使用了VS2017,放弃了原来使用的VScode,我认为这是一个正确的选择。VS内存管理,编译效率,无论什么都明显优于依赖于插件的VScode不过有一点,VS项目文件非常大。不只是更换了IDE,而且学了github上别人文件的组织方式,将cpp和h文件分开,可读性增加了很多,可维护性也增加了非常多。不知道是不是错觉,还是什么,MSVC的运行效率总给我一种感觉比mingw要快,可能是微软有什么秘密吧。
2、代码规范
这个问题我改变的比较少。对于c++中的大括号的使用,我感触非常深刻。在写这个作业之前,我收到pycharm的影响很深,什么操作符左右加空格,换行,类型写对举例解释(** == true/flase),我必须要写这个==true/false。多好一定要另起一行重新写,绝不在后面跟着左大括号。后来这都变了,我发现,在实际的编写代码中,这些都是高度的冗余。每一对大括号占用2行,导致我的代码行数看起来特别多,其实没多少,对于可读性来说是一种损害。可以看到在后面的代码中,我有一部分代码风格跟其他的完全不一样。再后来用了VS,我又改了回去,因为VS自动将你的大括号变成两行,在一些热键操作下。对于变量,函数的命名,我只遵循了他英语叫什么,我就写什么的原则。在刚开始的时候,我是用了很多全局变量,各种通过下标访问全局变量,用的时候很爽,但是,扩展性极差,根本就扩展不了。为了扩展性的考虑,后来我牺牲了一定的效率,选择了繁琐的实现
3、STL以及字符串
在编程的过程中,我大量使用了STL容器。是我对于它们的了解大大增加。对于什么时候用什么容器有了更加明确的认识。对于读取文法输入,需要大量字符串处理的代码,我在字符串处理方面,自我感觉也提升了很多。
4、调试代码的能力
在做这个大作业的过程中,感觉自己de了无数个bug,在这样大量的练习下,我感觉逐渐摸到了debug的门道,我在2.7.1中说了很多,这里不再赘述。不过,在debug上,我还是存在着问题。有些bug在调试的时候不一定能够被发现,无法在有限的输出中看出问题,有时候,突然出了bug,但当你再运行一下时,发现bug又消失了,等你再想复现这个bug的时候,发现这个bug不可复现。对于这种不可复现的bug,还是比较头痛的,特别是程序比较大的时候,甚至无法大致定位是哪个文件出了问题。
5、与其他学校的比较
高中同学也在写编译器,稍微看了一下华中科技大学和北京航空航天大学的编译器编写的大作业。感觉我与他人的差距很大,简直就是降维打击。别人的大作业单单任务就有8页。
6、改进的地方
要改进的地方又很多,项目里面,我只做了几个简单的if,while函数,甚至没有else,break。单就现在的扩展性,加上这些都是没有问题的。还有很重要的就是代码优化器的编写。没有做,大致框架还是有了。
7、总结
这样的一次大作业确实提升了我的编程能力,对于一些代码的理解,同时也对于整个编译器的流程,有了一个大体上的了解。希望我能够在未来的项目中做得更好。
面试
最后一关是老师的面试,虽然之前我准备了真的很多,不过,我在最关键的面试上没有准备好。我真是服了我自己。
老师让我讲述的时候,我完全没有准备好,只是想到哪里,讲到哪里。平常我也不是一个会讲话的惹人。
我做的好多好多功能,我都没有讲出来,老师也没有像其他同学一样,问我什么问题。
只是让我,展示运行一下程序。
运行了之后,老师还处于懵逼状态的时候,我竟然没有好好地将我的程序。也么有讲我做的东西。我的TAC输出是什么东西。我真的是,艹了。
最后如果成绩不好的话,那我也没话说,是我的问题,没有想到不会说话的缺点,竟然让我近两个月的成果全部浪费!!!
我现在能想到的只有心痛。