编译原理的理解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理的理解相关的知识,希望对你有一定的参考价值。
我认为这门课是一门真正与代码做斗争的课程,,而且编译原理可以说是一个计算机科学的缩影。你学习它更多的是去追寻程序设计语言的本质,学完这门课程,我相信,你对你所写的程序、程序语言都会有更深的本质认识,这样的认识也会让你站的高度完全不同,如果你真的学的好,我想别人看到的是语法,你看到的是背后的实现,
在欧洲教会还不允许做尸体解剖的时候就有两类人在一起偷偷摸摸的搞人体解剖:一类是医生,从外科手术的角度来说应该比较容易理解,不解剖根本不可能知道如何做外科手术;还一类则是画家,他们只是为了可以更好的在描绘皮肤时体现肌肉的质感,就愿意冒着被教会处罚的危险来参与人体解剖。而且即使是现在,所有的现代绘画的教育虽然不会再像医生那样实际操作解剖,但是肌肉层的解剖图仍然是必修课。
在我看来,完全不懂编译原理的程序员,就好像是完全没有学过人体解剖图的画家一样,当然不会说一定就无法成功,但更好的基础可以提高成功的几率。在知道底层的情况下,对上层的描绘会更加写实,更加生动。
从现实的方面来说,编译原理学过之后的益处(不考虑最后都没有入门的情况)包括:
1、可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的
2、可以更加客观的比较不同语言的差异
3、更不容易被某个特定语言的宣扬者忽悠
4、学习新的语言是效率也会更高
5、其实从语言a转换到语言b是一个通用的需求,学好编译原理处理此类需求时会更加游刃有余
另外还有一点,就是一直有人说不用重复造轮子,所以不需要学习编译原理这样的课程。我想说的是,学编译原理不是让你去造轮子(大多数人的实力,学了也造不出轮子),而是要让你知道现在一共有多少种轮子可以选择,它们特性如何?
个人不太建议一上手就拿起龙书、虎书等等来看。
学过编译原理课程的同学应该有体会,各种文法、各种词法语法分析算法,非常消磨人的耐心和兴致;中间代码生成和优化,其实在很多应用场景下并不重要(当然这一块对于“编译原理”很重要);语义分析要处理很多很多细节,特别对于比较复杂的语言;最后的指令生成,可能需要读各种手册,也比较枯燥。
你就可以学会但不限于下面几种技能:
1、强大的调试能力(譬如说你用你的语言写了个程序,出错了,你怎么知道是编译器搞错、虚拟机搞错、还是你的脚本自己搞错了)
2、牛逼的内存管理能力(写虚拟机,垃圾收集内存不泄露,屌!)
3、组织大量代码的能力
4、写库的能力(你开发的语言没有容器?没有字符串?没有多线程?没有IO?那有什么用!)
5、混合语言开发的能力
6、开发高质量单元测试的能力
7、写脚本产生Release文件夹的能力
编程的大部分工作,都是在处理字符串,也可以说是数字吧。
在我看来,编译器最大的作用除了让你深入了解语言机制外,就是培养了你娴熟的处理字符串技能。
你会解析字符串,就已经和只会用库的人大不相同了。像json yaml这些,苹果平台直到ios5才有自带的json库。
web领域什么scss之类的,例子太多。
额外的,你拥有了一个语言编译到另一个语言的能力,这个就很实用了。web开发领域经常出个coffeescript这样的东西就高兴坏了,社区大震动。。。。其实主要因为web领域高水平程序员比较少,会做语言编语言的事情的人一抓一大把,可惜人家大多不做web开发,你想要好东西,只能等,哈哈。。。
所以操纵语言这个超能力还是很好的,起码lv5吧,而且反正你可以开发多种超能力,是吧
不学编译原理,可能永远给各种写编译器的人当奴隶,以为写程序只能按照他们设计的语言哲学来做。学好了编译原理,不一定非要自己写语言,但是至少能把很多其他程序员觉得很酷的东西看得透彻一点,不会被程序语言的设计表象骗到太多。
以上是关于编译原理的理解的主要内容,如果未能解决你的问题,请参考以下文章