【转】自己动手写SC语言编译器
自序
编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助。我们考究历史会发现那些人人称颂的程序设 计大师都是编译领域的高手,像写出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编译器开发过程,是理论联系实际在编译领域的最好阐释。
【转】自己动手写SC语言编译器的更多相关文章
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
- Swift 语言概览 -自己在Xcode6 动手写1
原文:Swift 语言概览 -自己在Xcode6 动手写1 Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,这里引用The Swift Programming Language ...
- 自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储载入指令:链接载入指令LL.条件存储指令SC,本次将介绍这两条指令.在兴许将实现这两条指令. 9 ...
- C语言编译器,写给萌新们看看。
就我已经经历过的大学课程,仿佛每一门计算机的专业课程的开头,都是在介绍计算机发展的历史,和大名鼎鼎的冯诺依曼结构. 譬如C语言,比较水的计算机导论,c++,数据结构,计算机组成原理,甚至是Linux实 ...
- 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍
将陆续上传本人写的新书<自己动手写处理器>(尚未出版).今天是第四篇.我尽量每周四篇 1.4 MIPS32指令集架构简单介绍 本书设计的处理器遵循MIPS32 Release 1架构,所以 ...
- 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图
我们会继续上传新书<自己动手写处理器>(未公布).今天是第十条.我每星期试试4 从本章開始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍 ...
- 自己动手写CPU 笔记
自己动手写CPU 跳转至: 导航. 搜索 文件夹 1 处理器与MIPS 2 可编程逻辑器件与Verilog HDL 3 教学版OpenMIPS处理器蓝图 4 第一条指令ori 5 逻辑.移位与nop ...
- C语言编译器不检查数组下标越界
这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以 ...
- 【原创】自己动手写工具----XSmartNote [Beta 3.0]
一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...
随机推荐
- Android ndk下用AssetManager读取assets的资源
转自:http://www.cppblog.com/johndragon/archive/2012/12/28/196754.html 在使用 cocos2dx 在 Android 上进行游戏开发时, ...
- Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的几个问题
1. namespace Snapsia.Web.Models { using System; using System.Data.Entity; using System.ComponentMode ...
- 由实现JavaScript中的Map想到的
项目中要用到JavaScript中的Map数据类型,它不像JDK那样有自带的,怎么办?搜了找到一个不错的(http://darkmasky.iteye.com/blog/454749).用这个可以满足 ...
- Codeforces Good Bye 2015 D. New Year and Ancient Prophecy 后缀数组 树状数组 dp
D. New Year and Ancient Prophecy 题目连接: http://www.codeforces.com/contest/611/problem/C Description L ...
- C#反射深入学习
C#反射 反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得 ...
- Android获取联系人示例,从数据库加载,带首字母标签
这几天打算学习下Android联系人方便的一些东西,之前稍有涉略,不过每次都是浅尝辄止. 推荐国内两个Link: http://fanfq.iteye.com/blog/779569 http://w ...
- “惊群”,看看nginx是怎么解决它的
在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群.可以想见,效率很 ...
- 在使用ICSharpCode.SharpZipLib进行目录压缩后,再解压缩是提示这个错误Size mismatch: 4294967295;126976 70202;126976
在压缩代码中加入entry.CompressionMethod = CompressionMethod.Stored
- Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)
1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...
- 基于SocketAsyncEventArgs的版本
文字水平差就慢慢开始练习,同时分享一下,项目中写的简单socket程序,不同方式的版本,今天上一个异步.可能实现高性能的处理方式.IOCP就不多说了,高性能的完成端口,可以实现套接字对象的复用,降低开 ...