为什么每个程序员都应该学习代码编译器知识

标签: 编程技术 编译器 | 发表时间:2014-12-24 17:40 | 作者:techug
出处:http://www.vaikan.com

所有优秀的计算机科学学院都提供了编译器课程,但是相对比较少的学校把它作为本科课程的必修部分。这篇文章回答了这个问题:为什么需要学习编译器知识?即使你从没打算过编写编译器。

我写这篇文章的其中一个原因是,尽管我在读本科时很喜欢编译器课程,但是我几乎看不到它的实际作用。大多数资料看起来要么简单易懂,要么很深奥(事实上,我找到的大部分编译器资料都是很枯燥的。)无论怎样,我用了几年时间总结了为什么这类课程会如此有用的实际原因。原因如下。

分析器和解析器无处不在

严谨的程序员不得不去了解分析器和解析器,因为我们不会总是只写一些小程序。每次你写一个可扩展的程序或处理一种新类型的输入文件,你都需要了解它们(分析器和解析器)。格林斯潘第十定律:

“任何C或Fortran程序复杂到一定程度之后,都会包含一个临时的、只有一半功能的、不完全符合规格的、充满bug的、运行速度很慢的Common Lisp实现。”

我们花费如此多的时间在这些事情上,我们可以使用一次性的小技巧来做这些事情的每一个,或者我们利用60年的理论和实际知识去解决问题,并把它做对。重要的是:你应该什么时候借用已存在的代码或者使用已存在的工具?理论知识在什么时候可以提供帮助?哪些语言设计原则可以运用在我们日常使用的小语言?

你能更好地编写正确的代码

编译器应该把输入的语言正确地翻译成合法的程序。为了达到这个目标,编译器开发者必须了解整个输入语言,包括一些普通程序员没见过的罕见问题。这个理解过程是通往程序语言本质的重要一步,它和我们平时写代码时所看到的不一样。举个例子,我在学习了顺序点(sequence points),未定义行为(undefined behaviors),和常用的算术转换的细节后,完全改变了我对C语言的理解。C编译器编写者已经掌握这些概念了,但大多数初级和中级程序员都不知道这些概念。毫不夸张地说,一旦你知道语言的本质,你会以不同地方式和更准确地思考这个语言。这适用于任何的语言,特别是像C和C++这些语义不清晰的语言。

你可以编写更快的代码

通过了解编译器,你可以很清晰地知道哪些优化是编译器可以优化的,和哪些是编译器不能进行优化的,无论他们看起来是多么的合理和简单。你将会学到哪类代码通常会建造最佳代码块,为什么会这样和这些代码做了什么。你会知道为什么一些代码可以拥有更好的性能,比如使用一半寄存器组缓存滤波系数一半寄存器组缓存样本的FIR滤波器,它和使用普通优化器实现的不一样。你和你喜欢的编译器是一个能创建快速代码的团队,你可以使用它高效地工作,或者使用提前优化等无意义的技巧来修改它。

其次,编译器后端是与目标架构密切关联的,当然,现代的架构都尽量提供汇编程序员友好的平台,而且离着不远了。通过理解编译器后端和它为什么是这样产生代码的,你会对计算机架构的操作有更好的理解。

总结

编译器(理论上)有三部分:

  • 语言相关的前端(分析,类型检测)
  • 与语言和目标无关中端(优化))
  • 目标相关的后端(生成机器代码)

在这篇文章里,我已经试图说服你们,理解编译器的每一部分都是有价值的–即使你将来不会实现或者修改它们。

相关 [程序员 学习 代码] 推荐:

为什么每个程序员都应该学习代码编译器知识

- - 外刊IT评论
所有优秀的计算机科学学院都提供了编译器课程,但是相对比较少的学校把它作为本科课程的必修部分. 这篇文章回答了这个问题:为什么需要学习编译器知识. 我写这篇文章的其中一个原因是,尽管我在读本科时很喜欢编译器课程,但是我几乎看不到它的实际作用. 大多数资料看起来要么简单易懂,要么很深奥(事实上,我找到的大部分编译器资料都是很枯燥的.

强制程序员使用统一的代码格式,好吗?

- - TECH2IPO创见
Java程序员Stijn Geukens与其他10位程序员一起为企业开发产品,但是他们11个人每个人都有自己喜好的编程平台,语言编写起来也是千奇百怪. 不过,这种情况很快就会发生变化,因为企业即将强制要求所有的程序员使用统一代码格式,统一使用Eclipse Java平台. 于是Stijn Geukens便在Stackexchange上 提问,“这样的强制要求是否值得.

IBM新专利:通过代码提交评判程序员

- - 奶味网-IT人- 最新RSS订阅
新闻来源:Slashdot. 觉得老板只需要用软件扫描一下你提交的代码就能判断你的工作效率进而决定解雇还是留下你这种事情怎么样. 这不是幻想 - 这是 IBM 最近披露的最新专利申请的内容. IBM 称, 对一名开发者的代码提交以及其他操作的统计可以用来产生一份用于同其他人比较的 "总结报告", 从而帮助管理层避免在低效率的程序员身上浪费时间.

程序员,都去写一写前端代码吧

- - 四火的唠叨
文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》. 你可以认为我是一个极端的人,就像有许多人专注于自己的领域而不屑于其它“肤浅”的工作范畴一样. 比如我见过不少认为做portal没有技术含量的判定,做工程都是充满苦逼行为的言论,最近则还有那些“大数据”崇拜者的疯狂吐槽……我的极端则有些不同,我的极端在于我认为绝大多数优秀的程序员,都要尝试多方面的事情.

[译]程序员要学会读源代码

- - 呦呦鹿鸣
在“沟通”这个复杂的领域里,写出能让人类领会并理解的连贯段落比敲出几行让解释器或编译器不致于“呕吐”的软件代码要难得多. 这就是为什么——就软件开发而言——所有的文档大概都是很差劲的. 而且,由于为人写作比为机器写作要困难得多,文档恐怕在可预见的将来还会继续差劲下去. 译者注:卢克(Luke Skywalker)是电影《星球大战》中的一个角色,他来自塔图因星球,在发现了莉雅公主输入到机器人R2-D2中的求救信息后,他与绝地骑士欧比旺一起迎战邪恶的银河帝国,最终救出了公主.

程序员的成长和代码行数的关系

- - 外刊IT评论
Cook写了一篇 博客,其中提到:. 我的朋友Clift Norris发现了一个基本常数,我称之为Norris常数,一个未经培训的程序员在他或她遇到瓶颈之前能写出的平均代码量. Clift估计这个值是1500行. 超过这个数以后,代码会变得如此混乱,以至于本人都无法轻而易举的进行调试和修改. 我还不了解足够多的初级程序员来验证这一结果,不过我自己认识到,程序员生涯的下一个瓶颈将发生在20,000行.

优秀程序员眼中的整洁代码

- - 博客园_知识库
  有多少程序员,就有多少定义. 所以我只询问了一些非常知名且经验丰富的程序员.   Bjarne Stroustrup,C++语言发明者,C++ Programming Language(中译版《C++程序设计语言》)一书作者. 代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来.

程序员新人怎样在复杂代码中找 bug?

- - IT瘾-geek
我曾经做了两年大型软件的维护工作,那个项目有10多年了,大约3000万行以上的代码,参与过开发的有数千人,代码checkout出来有大约5个GB,而且bug特别多,open的有上千,即使最高优先级的showstopper也有上百. 优先解决那些可重现的,可重现的bug特别好找,反复调试测试就好了,先把好解决的干掉,这样最节约时间.

无代码开发,站到了程序员鄙视链顶端

- - InfoQ推荐
“无代码”不是在“淘汰”开发者,而是给予开发者更大挑战、更多机会. 疫情进一步推动了“无代码”行业的爆发. 微软称无代码是它的“Next Big Thing”,谷歌说无代码是下一代的变革和提升. 也有越来越多的企业开始进入“无代码”领域. 所谓“无代码”,并不是“不存在代码”,无代码平台的开发对后台的支撑能力提出了更高的要求,需要更为强大的技术团队.

每个程序员都应该学习使用Python或Ruby

- Kings - 开源中国社区最新新闻
本文是从 Why every programmer should learn Python or Ruby 这篇文章翻译而来. 如 果你是个学生,你应该会C,C++和Java. 还会一些VB,或C#/.NET. 多少你还可能开发过一些Web网页,你知道一些HTML,CSS和 JavaScript知识.