SCC编译器设计与实现

转:https://www.cnblogs.com/boyublog/p/4967274.html

《自己动手写编译器、链接器》

源代码下载:http://www.tup.com.cn/upload/books/kj/059284-01.rar


编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助。我们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的比尔·盖茨,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编译器开发过程,是理论联系实际在编译领域的最好阐释。

 如本书作为编译原理实践教材,作者建议安排10学时讲授。

本书投稿后,有幸请CSDN暨《程序员》杂志总编、刘江老师阅读了本书的初稿,并为本书作序,在此向刘老师表示最衷心的感谢。

本书临近出版之际,承蒙清华大学王生原老师阅读了本书终稿,并对书稿做了中肯评价: “本书特色鲜明,内容有深度,文笔也很不错,很值得出版。本书最大的特色是所选的目标平台,即x86处理器以及微软系统的COFF目标文件格式,这在教材中很少见到,可为国内的编译教学实践提供别具一格的素材。”同时,王老师还对本书提出了宝贵建议。在这里,向王老师表示由衷的敬意和最诚挚的感谢。

我还要感谢我的家人,他们的支持与鼓励是本书得以完成的保障。

要列出所有对本书出版有所帮助的人名是不可能的,因为有些困难是通过互联网解决的,我甚至不知道他们的名字。在此,谨向他们一并表示感谢! 

最后,回想本书6年的写作历程,愿以蒲松龄的一副对联与读者共勉:

有志者,事竟成,破釜沉舟,百二秦关终属楚;

苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,085评论 1 32
  • 职场糟心的事情很多 1.自身业务能力不行,很多事情做不好,被主管批评,很糟心呐; 2.同事不好相处,使绊子,很糟心...
    喜斯陶阅读 732评论 0 0
  • 送你一片秋日的红叶, 那是来自春天的信帖, 纤纤叶脉记述着春日的情节, 细读那童稚的缘契, 便能打开你忧郁的心结,...
    北塔雪松阅读 2,256评论 130 272