编译原理与技术的一整套理论在整个计算机科学领域占有至关重要的地位,学习它对程序设计人员有很大的帮助。咱们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的BILL GATES,SUN的JAVA之父等等,在编译上都有很深的造诣。曾经在世界首富宝座上稳坐多年的比尔.盖茨也就是从给微机编写Basic语言编译器起家的,也正是这个BASIC编译器为比尔·盖茨和保罗·艾伦的微软帝国奠基了基础。正是这个编写Basic语言编译器的经历,开启盖茨的辉煌职业生涯。编程
编译器是一种至关复杂的程序,编写甚至读懂这样的一个程序都非易事,大多数的计算机科学家和专业人员也历来没有编写过一个完整的编译器。可是,几乎全部形式的计算都要用到编译器,并且任何一个与计算机打交道的专业人员都应掌握编译器的基本结构和操做。除此以外,计算机应用程序中常常遇到的一个任务就是命令解释程序和界面程序的开发,这比编译器要小,但使用的倒是相同的技术。所以,掌握这一技术具备很是大的实际意义。后端
中科院计算所所长李国杰院士说:“随着微处理器技术的飞速发展,处理器性能在很大程度上取决于编译器的质量,编译技术成为计算机的核心技术,地位变得愈来愈重要。我国要发展本身的微处理器事业,必然要有本身的编译技术做为后盾。”数组
回过头来讲一说是什么样的缘由使我萌生了写这样一本文的想法。做者学习其余计算机课程感受跟看武侠小说没有什么太大差异,也没有感受有特别难懂的,惟独看编译原理的的教材,看完了云里雾里的,感受只知其一;不知其二,我感受多是学的教材过于理论化,因而到书店把全部跟编译原理有关的书籍通通买回了家,固然这也包括你们公认的编译原理三大经典书籍龙书、 虎书、鲸书龙书在内,每一本我都从头至尾翻一遍,脑子里好像什么都懂了,又感受要真的本身动手写个编译器仍然是只有大师才能完成,对本身仍是可望而不可及的事情。而且全部讲述编译原理的书中几乎都有这样一句话:“现有的编译器都是用Lex,和Yacc构造的,从头开始手工编写一个完整的编译器几乎是不可能的。”可做者恰恰是那种种明知山有虎,偏向虎山行的人,要知道早期的编译可都是纯手工构造的,苦辣酸甜的征程就此开始,但是写个什么语言的编译器?这个编译器怎么定位?这一切都很茫然。性能
我开始研究编译原理书上的样例,但愿能从中找到灵感,给上述问题找到答案。世界著名计算机科学家N.Worth编写的“PL/0语言的编译程序”是做者最早研究的编译器,它功能简单、结构清晰、可读性强,被认为是一个很是合适的小型编译程序的学习模型,可做者对这个编译程序感受不够过瘾,由于它不支持数组,结构体、字符串,而且是以假想的栈式机器为例来编写的,而不是直接生成在某种CPU,某种操做系统环境下直接能够运行的目标语言程序。“PL/0语言的编译程序”做为编译原理教学的教学模型,也只能算“矬子里面拔将军”,由于没有更好的,也只好将就着用了。至此,编译器定位问题算有了些眉目,做者但愿构造一个更适合教学的编译器。学习
但是,另外一个问题接踵而至,为何那么多开源编译器不能直接用做编译原理教学模型呢?我开始研究各个开源编译器的源代码,其中包括GCC的源代码,因为GCC支持多个前端语言,和各类后端机器平台,AST(abstract Syntax Tree),RTL(Register Transfer Language)又成了绕不过去的坎,咱们还没学会怎么编写针对一种源语言、一种目标机器的编译器,就要去学习支持多个源语言多个机器平台的编译器,就比如一个婴儿还没学会走路就要学跑,这注定是要跌跟头的。操作系统
一面是过于简化的编译器教学模型,一面是过于复杂的开源编译器,做为教学模型都不太合适。到这里,编译器定位问题算是完全想清楚了,做者要构造一个教你们如何本身动手写编译器的教学模型。这个模型包括两大部分,第一部分是语言定义,第二部分是这个语言编译器的实现, 这个编译器只支持一种源语言,目标语言也只支持一种。这个语言应该具有目前流行的高级语言的最主要特征。这个编译器要结构清晰,代码量要尽量少,要能体现编写一个实用的编译器的完整过程与技术。这个编译器能生成真正能在操做系统中运行的exe文件,只要双击或是在命令行执行就能看到结果的那种。命令行
接下来做者开始思考另外一个问题,编写什么语言的编译器?做者研究了目前最流行的几种编程序语言C、C++、C#、Objective-C、Java,其中C语言是最简单的了,只有32个关键字,可是做者研究发现,C语言还有许多冗余的成份,做为学习模型还能够更简单一些。做者最终以C语言为蓝本,进行适当简化定义了一门新的语言,仅有15个关键字,称之为SC语言。目标语言选择你们熟悉的Intel X86机器语言,咱们的编译器命名为SCC编译器。设计
在本书中,读者将看到从SC语言定义,到SCC编译器开发的完整过程。读完后你将知道一门全新的语言如何定义,一个真实的编译器如何编写,这些对你来讲也将再也不神秘,编译原理讲的理论与本文中讲述的SC语言定义及SCC编译器开发过程,是理论联系实际在编译领域的最好阐释。开发