程序员都应学习代码编译器知识

程序员都应学习代码编译器知识

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

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

分析器和解析器无处不在

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

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

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

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

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

你可以编写更快的代码

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

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

总结

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

1.语言相关的前端(分析,类型检测)

2.与语言和目标无关中端(优化))

3.目标相关的后端(生成机器代码)

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

免费领取LAMP兄弟连原创PHP视频教程光盘/《细说PHP》精要版,详情咨询官网客服:

http://www.lampbrother.net

时间: 2024-10-08 10:28:48

程序员都应学习代码编译器知识的相关文章

每个程序员都应读的书(转)

收藏,有时间,就读一读,有好处! 很多程序员响应,他们在推荐时也写下自己的评语.以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书.其实除了前10本之外,推荐数前30左右的书籍都算经典,伯乐在线整理编译这个问答贴,同时摘译部分推荐人的评语.下面就按照各本书的推荐数排列. 1. <代码大全> 史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,<代码大全>注重个人技术,其中所有东西加起来,就是我们本能所说的“编写整洁的代码”.这本书有50页在谈论代码布

每个程序员都应该了解的内存知识

每个程序员都应该了解的内存知识 英文原文:lwn.net,翻译:开源中国 [编辑的话: Ulrich Drepper最近问我们,是不是有兴趣发表一篇他写的内存方面的长文.我们不用看太多就已经知道,LWN的读者们会喜欢这篇文章的.内存的使用常常是软件性能的决定性因子,而如何避免内存瓶颈的好文章却不好找.这篇文章应该会有所帮助. 他的原文很长,超过100页.我们把它分成了7篇,每隔一到两周发表一篇.7篇发完后,Ulrich会把全文发出来. 对原文重新格式化是个很有挑战性的工作,但愿结果会不错吧.为了

每个程序员都应牢记的7种坏味道,11种原则,23种模式

(一)7种设计坏味道 1.僵化性: 很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其它改动. 2.脆弱性: 对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题. 3.牢固性: 很难解开系统的纠结,使之成为一些可在其他系统中重用的组件. 4.粘滞性: 做正确的事情比做错误的事情要困难. 5.复杂性(不必要的): 设计中包含有不具任何直接好处的基础结构. 6.重复性(不必要的): 设计中包含有重复的结构,而该重复的结构本可以使用单一的抽象进行统一. 7.晦涩性: 很难阅

StackOverflow程序员推荐:每个程序员都应读的30本书

“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西.” 很多程序员响应,他们在推荐时也写下自己的评语.以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书.其实除了前10本之外,推荐数前30左右的书籍都算经典,伯乐在线整理编译这个问答贴,同时摘译部分推荐人的评语.下面就按照各本书的推荐数排列. 1. <代码大全>史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,&l

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

如果你是个学生,你应该会C,C++和Java.还会一些VB,或C#/.NET.多少你还可能开发过一些Web网页,你知道一些HTML,CSS和JavaScript知识.总体上说,我们很难发现会有学生显露出掌握超出这几种语言范围外的语言的才能.这真让人遗憾,因为还有很多种编程语言,它们能让你成为一个更好的程序员. 在这篇文章里,我将会告诉你,为什么你一定要学习Python或Ruby语言. 跟C/C++/Java相比 — Python/Ruby能让你用少的多的多的代码写出相同的程序.有人计算过,Pyt

国外程序员推荐:每个程序员都应读的书

[更新]:近日(2012年8月17日)重看 StackOverflow 的原讨论帖,发现于今年年初被关闭了.不过有人做了汇总,把其他回复中提到的书籍,放在投票数最高的回复中.新更新添加 59 本书,详情可见文章后半部分. 编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的? “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东

程序员都需要学习什么

程序设计语言 程序员至少要学一门程序设计语言,这样才能开始做点什么.主流的程序设计语言一般都有一本圣经级别的书,例如 C 语言中, K&R 的 The C Programmer Lanugage,C++ 中的 C++ Primer, Java 中的 Thinking in Java.扎扎实实地选一本好好学习一下,把习题都做一遍,反复 阅读,掌握书中的知识点.如果开始学习的时候不认真,图快,早完要把这些时间还回来,还不如一开始就好好学习. 除了圣经级别的书,还有一些书可以增强对这些语言的理解,避免

每一个程序员都必须阅读的10篇文章

原文:10 Atricle Every Programmer Must Read by Javin Paul 作为一名Java程序员和软件开发者,我已经从那些名为<关于XXX,每个程序员都应了解的>的文章中学了很多东西,这些文章倾向于提供许多关于某一个特定主题的实用的.有深度.难以发掘的信息.在我的学习过程中,我读到了不少非常有用的文章,我会收藏这些文章以便日后参考和再次阅读.我个人认为所有程序员可以从这些文章中获益,这也是促使我发帖,并与你们分享这些<关于XXX,每个程序员都应了解的&

每个程序员都必读的12篇文章

英文原文:10 Articles Every Programmer Must Read 作为一名 Java 程序员和软件开发人员,那些每个程序员都应该知道的 XXX 的文章教会了我不少东西,它们提供了某个特定领域的一些实用的并且有深度的信息,这些东西通常很难找到.在我学习的过程中我读到过许多非常有用的文章,我把它们添加到了书签里,方便以后阅读或者引用.我个人认为所有开发人员都能从这些文章中受益,因此我也写了篇"每个程序员都应该了解的"文章,准备分享给你们.这是我的个人收藏.在这篇文章中