自己动手写编译器之序

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

因为工作的关系,我经常和各企业的技术负责人交流。话题谈着谈着常常会转到他们目前共同的难题——技术人员招聘。这时不少人都会感慨,中国能做系统软件开发的技术人员太少,这方面的人太难找了。随着中国企业的发展,做系统和平台的需求不断增加,这种供需矛盾将越来越明显。

究其原因,很容易想到的是我们的高校教育、课程设置。美国顶尖大学计算机系基础课程教学里都非常重视项目实践,操作系统课往往要真的开发一个像模像样的操作系统原型,编译器课也真的要自己设计并实现一门有创新性的小语言……

在计算机科学的各门课程中,编译器的设计实践有着特殊的重要性。“龙书”的主要作者、哥伦比亚大学教授Alfred V. Aho曾经列举过编译器实践有诸多好处[1]

 能让学生领悟到理论与实践的完美结合。比如编译原理所涵盖的正则表达式和自动机,在各种场合的应用是极其广泛的,对正则的掌握程度,从某种意义上讲甚至可以作为技术人员水平的一种尺度。

 深入探索计算思维的多样性。与人类语言一样,不同类型的编程语言其实代表了不同的思维方式。只用过命令式语言的人可能没有想到,开启了大数据领域的Map与Reduce,其实在函数式语言是一种非常常见的东西。

的确,深入了解编译器和编译原理,对于技术人员更好地理解和掌握自己最常用的语言和系统,从而提升自己的内力是有极大好处的。另一方面,随着DSL(领域特定语言)的流行,需要技术人员开发自己语言的机会也越来越多。

然而,编译原理是计算机科学里公认比较难的一门课。虽然目前国外比较重要的编译理论教材(比如龙书的《编译原理》、虎书《现代编译原理》的C语言和Java版本、鲸书《高级编译器设计与实现》)基本上都有了中文版和英文影印版,但这些书往往更偏重理论,而且门槛较高,不太适合指导一线技术人员实践和自学。我认识的一位美籍华人技术专家Ronald Mak在Wiley出版过一本基于Java的“Writing Compilers and Interpreters”,比较贴近实践,但部头较大,而且没有看到中文版。

偶然的机会,我得知王博俊在工作之余,写了一本以简化的C语言为例子讲述编译器和链接器实践的书。浏览了初稿之后,感觉全书内容简明,容易上手,又不失全面和系统,正好弥补了这方面的空白。特向大家推荐。

[1] http://www.cs.columbia.edu/~aho/Talks/10-03-12_SIGCSE.pdf

CSDN暨《程序员》杂志总编刘江

时间: 2024-11-02 08:31:30

自己动手写编译器之序的相关文章

自己动手写编译器之TINY编译器词法分析

TINY是<编译原理与实践>一书中介绍的教学编程语言,该语言缺少真正程序设计语言的主要特征,但足以例证编译器的主要特征了.本文将介绍该编译器的实现过程,完整的实现代码loucomp_linux中,供编译原理初学者参考. 小试牛刀: 下载源码后,进入loucomp_linux, 在命令行输入 $make 便生成tiny程序,然后输入 $tiny sample.tny tiny 将sample.tny中的TINY源码生成tm指令.tm指令是TM虚拟机的汇编代码,TM虚拟机的源码在tm.c中,输入如

自己动手写编译器之Tiny语言语法分析器的实现

接着上一篇文章介绍的Tiny语言的词法分析的实现,本文将介绍Tiny语言的语法分析器的实现. 1 Tiny语言的语法 下图是Tiny在BNF中的文法, 文法的定义可以看出,INNY语言有以下特点: 1 程序共有5中语句:if语句,repea语句,read语句,write语法和assign语句. 2 if语句以end作为结束符号,if语句和repeat语句允许语句序列作为主体. 3 输入/输出由保留字read和write开始.read语句一次只读出一个变量,而write语句一次只写出一个表达式.

自己动手写处理器之第二阶段(3)——Verilog HDL行为语句

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第七篇,我尽量每周四篇 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包括有过程语句,过程语句有两种:initial.always.其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的.此外,always过程语句是可综合的,initial过程语句是不可综合的.       1.always过程语句 always过程语句的格式如图2-10所示.

自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第五篇,我尽量每周四篇 通过上一章的介绍,读者应该知道CPU内部有一些基本的电路,比如:译码电路.运算电路.控制电路,此外还有一些寄存器等.这些电路怎么实现呢?当然可以通过一大堆分立的元器件实现,实际上在2008年,美国加州的游戏开发人士Steve Chamberlin就自己制造了一款8位CPU,耗时18个月,花费1000美元,总共使用了1253条线缆,如图2-1所示,Steve Chamberlin为它起了一个十分贴切的名字--B

自己动手写处理器之第一阶段(1)——计算机的简单模型、架构、指令集

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第二篇,我尽量每周四篇 第1章 处理器与MIPS 时间开始了! --胡风 · 1949 让我们以一句诗意的话,开始本书的阅读. 时间从1971年11月15日开始,那一天,Intel发布了世界上第一款单芯片微处理器4004. 1.1 计算机的简单模型 计算机很复杂,可以听歌.看电影.上网.玩游戏,内部是怎么工作的,这个问题太可怕了,太复杂了. 计算机很简单,只有加.减.乘.除.逻辑.移位.转移.存储.加载等几类可以做的操作,太简单了.

自己动手写处理器之第四阶段(1)——第一条指令ori的实现

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第11篇,我尽量每周四篇 第4章 第一条指令ori的实现 前面几章介绍了很多预备知识,也描绘了即将要实现的OpenMIPS处理器的蓝图,各位读者是不是早已摩拳擦掌,迫切希望一展身手了,好吧,本章我们将实现OpenMIPS处理器的第一条指令ori,为什么选择这条指令作为我们实现的第一条指令呢?答案就两个字--简单,指令ori用来实现逻辑"或"运算,选择一条简单的指令有助于我们排除干扰,将注意力集中在流水线结构的实现

自己动手写处理器之第一阶段(3)——MIPS32指令集架构简介

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第四篇,我尽量每周四篇 1.4 MIPS32指令集架构简介 本书设计的处理器遵循MIPS32 Release 1架构,所以本节介绍的MIPS32指令集架构指的就是MIPS32 Release 1. 1.4.1 数据类型 指令的主要任务就是对操作数进行运算,操作数有不同的类型和长度,MIPS32提供的基本数据类型如下. 位(b):长度是1bit. 字节(Byte):长度是8bit. 半字(Half Word):长度是16bit. 字(

自己动手写处理器之第一阶段(2)——MIPS指令集架构的演变

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第三篇,我尽量每周四篇 MIPS指令集架构自上世纪80年代出现后,一直在进行着更新换代,从最初的MIPS I到MIPS V,发展到可支持扩展模块的MIPS32.MIPS64系列,再到集成代码压缩技术的microMIPS32.microMIPS64.每个MIPS ISA都是其前一个的超集,没有任何遗漏,只有增加新的功能.       1.MIPS Ⅰ 提供加载/存储.计算.跳转.分支.协处理及其它特殊指令.该指令集架构用于最初的MIP

自己动手写处理器之第二阶段(2)——Verilog HDL简介

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第六篇,我尽量每周四篇 2.3 Verilog HDL简介 本书实现的OpenMIPS处理器是使用Verilog HDL编写的,所以本章接下来的几节将介绍Verilog HDL的一些基本知识,包括语法.结构等.因为本书并不是一本讲授Verilog HDL的专门书籍,所以此处介绍的内容并不是Verilog HDL的全部,只是一些基础知识,以及在OpenMIPS处理器实现过程中会使用到的知识.读者如果对Verilog HDL有进一步了解