`
php教程分享
  • 浏览: 10522 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
所有优秀的计算机科学学院都提供了编译器课程,但是相对比较少的学校把它作为本科课程的必修部分。这篇文章回答了这个问题:为什么需要学习编译器知识?即使你从没打算过编写编译器。
我写这篇文章的其中一个原因是,尽管我在读本科时很喜欢编译器课程,但是我几乎看不到它的实际作用。大多数资料看起来要么简单易懂,要么很深奥(事实上,我找到的大部分编译器资料都是很枯燥的。)无论怎样,我用了几年时间总结了为什么这类课程会如此有用的实际原因。原因如下。
分析器和解析器无处不在
严谨的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
分享到:
评论

相关推荐

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

    为什么每个程序员都应该学习代码编译器知识,适合程序员开发使用的编译器知识

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

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

    Java编写的一个类C语言编译器(词法分析,语法分析,语义分析和目标代码生成).zip

    通过实现这样一个编译器,开发者可以深入理解编译器的工作原理,提高Java编程技能,并为进一步学习编译原理和编程语言理论打下基础。此外,这个项目对于希望进入编译器设计、程序分析和代码生成等领域的人来说,是一...

    [程序员实用算法].Andrew.Binstock.等著.清晰版_部分1.pdf

    源代码经过测试符合ANSI标准,可以运行在UNIX下,以及Borland、Microsoft和Watcom的编译器上。 本书结构清晰,示例丰富,可作为广大程序员的参考用书。... 希望对大家能有帮助~~~ 免责申明:此书是我在网络上获取...

    编译器词法与语法分析的实现(基于c++11).zip

    通过实现这样一个编译器,开发者可以深入理解编译器的工作原理,提高C++编程技能,并为进一步学习编译原理和编程语言理论打下基础。此外,这个项目对于希望进入编译器设计、程序分析和代码生成等领域的人来说,是一...

    写给程序员的python教程-pdf.pdf

    基础知识 Python 是一种解释型的脚本语言,使用它你只需要安装 Python 解 释器,然后你就可以在命令行窗口或者编译器中输入代码并运行了。 Python 的编写方式清晰简单,因此在开发过程中完全没有问题。 首先,你...

    python语言写的编译器,实现了词法分析和语法分析.zip

    通过实现这样一个编译器,开发者可以深入理解编译器的工作原理,提高Python编程技能,并为进一步学习编译原理和编程语言理论打下基础。此外,这个项目对于希望进入编译器设计、程序分析和代码生成等领域的人来说,是...

    编译原理TINY+编译器 词法分析.zip

    - 编译器开发者:特别是那些对编译器设计和实现感兴趣的程序员。 - 教育工作者:用于教学编译原理和编译器构造。 ### 额外建议: - 从一个简单的TINY+子集开始,逐步增加支持的词法单元类型。 - 使用单元测试来验证...

    程序员实用算法(part1)

    源代码经过测试符合ANSI标准,可以运行在UNIX下,以及Borland、Microsoft和Watcom的编译器上。 本书结构清晰,示例丰富,可作为广大程序员的参考用书. -----压缩包分为3部分,包括(pdf和源码)-----------

    C++数据处理和分析笔记-1.md

    有C++基础,想学习数据科学相关知识的程序员。文中具体的代码示例可以帮助理解数据处理方法。 能学到什么: 通过学习可以掌握在C++中进行数据文件操作、数据清洗、存储管理和统计计算等与数据分析密切相关的编程技能...

    obook.cc-深入理解c__11 - Michael Wong & Ibm Xl编译器中国开发团队.pdf

    因此,从很多方面来看, C++程序员都应该乐于升级换代已有的知识,而学习及使用C++11也正是大势所趋。 在本书开始编写的时候,C++11标准刚刚发布一年,而本书出版的时候,C++11也只 不过才诞生了两年。这一两年,...

    学习linux环境下c程序的示例代码.rar

    作为一名程序员,学习Linux C程序是必不可少的。本文将从零开始,详细讲解Linux C程序的基础知识和实例应用,帮助读者快速入门。 一、Linux环境搭建 首先linux c程序基础与实例讲解,我们需要安装Linux操作系统...

    [程序员实用算法].Andrew.Binstock.等著.清晰版_部分2.pdf(共两部分)

    源代码经过测试符合ANSI标准,可以运行在UNIX下,以及Borland、Microsoft和Watcom的编译器上。 本书结构清晰,示例丰富,可作为广大程序员的参考用书。... 免责申明:此书是我在网络上获取的,希望对大家有用。...

    Microsoft visual c++ 6.0 programmer's Guide 程序员指南

    例1:什么都不做的ActiveX控件 例2:Tower ActiveX控件 向ActiveX控件项目添加属性页 第10章 用ATL编写ActiveX控件 ATL和包容器应用程序 ATL和ActiveX控件 示例1:Pulse ActiveX控件 例子2:TowerATL ActiveX控件 ...

    程序员实用算法(part2)

    本书重点关注的是实用,立即可用的代码,并且广泛讨论了可移植性和特定于实现的细节。本书作者介绍了一些有用但很少被...源代码经过测试符合ANSI标准,可以运行在UNIX下,以及Borland、Microsoft和Watcom的编译器上。

    程序员实用算法(part3)

    本书重点关注的是实用,立即可用的代码,并且广泛讨论了可移植性和特定于实现的细节。本书作者介绍了一些有用但很少被...源代码经过测试符合ANSI标准,可以运行在UNIX下,以及Borland、Microsoft和Watcom的编译器上。

    C++小知识:不要去做编译器的工作

    对于C++编程的老鸟来说,有时候他们喜欢把一些东西按照编译器的工作原理进行改写,以便提高代码的运行效率。这么做确实高明,也能体现出程序员的水平,但是这么做也是有风险的。因为有时候你可能会因为一些简单的...

    Eziriz .NET Reactor 4.6.0.0 官方原版+破解补丁(强大的代码保护和软件防盗版工具)

    当.Net编译器编译你的C#或VB.NET程序时,程序员的程序并不会编译为原生的机器语言,而是编译成为了通用中间语言指令(CIL)。CIL是介于源代码和本地代码的中间的语言,当你的程序运行,不是直接执行的机器代码,而是...

    Accelerated C++源代码

     无数程序员曾使用本书的前几个版本学习C++,在此期间C++也逐渐发展成熟。这些年来,C++语言的发展方向以及C++程序员的关注点,已经从以往注重运行时的效率,转到千方百计地提高程序员的编程效率上。随着标准库的...

    程序员需要经常刷题吗-programmer-competency-matrix:程序员能力矩阵

    需要程序员经常刷题吗程序员能力矩阵 31 个问题,1-4 个选项。 等级范围:31-124 A. 计算机科学 1级 2 级 级别 3 4级 1. 数据结构 不知道Array和LinkedList的区别 能够在实际编程任务中解释和使用数组、链表、字典等...

Global site tag (gtag.js) - Google Analytics