Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158585
  • 博文数量: 13
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 329
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-31 08:48
个人简介

爱学习,喜欢技术。

文章分类
文章存档

2017年(1)

2014年(7)

2011年(5)

我的朋友

分类: C/C++

2011-06-20 18:47:45

初衷

某天,在读《编程人生-15位软件先驱访谈录》的时候,书中有一段,Seibel问Fitzpatrick:“对于那些自学的程序员,你有什么建议吗?”,答曰:“要试着做点更难的东西,超出能力范围的东西……”。这句话触动了我——是该做点东西了。大学毕业已经四年,开始做了一年多的测试,之后一直在做JAVA方面的WEB开发,到现在还没有花很多功夫做过什么有很大挑战的东西。

那么我应该选择什么来做呢?超出能力范围的东西很多,可选择面很广。

最初的想法是做一个虚拟机(如JVM)或编译器(如Java编译器)。这两种软件以前都有动手去做过:在上大学的时候,我们的“编译原理”课程设计是实现一个SNL语言的编译器,我当时用了最简单同时也是比较粗糙的方法实现了词法分析与语法分析;2009年初的时候,我买了一本书《计算机系统要素-从零开始构建现代计算机》,我照着作者的设计,并用作者提供的HDL语言模拟器实现了一个简单的虚拟机。这两者如果只是做最简单的,可能很容易,但要做成一个产品,那就远超过我的能力了,同时正因为此二者都已经参与实现过,所以从这两者其中之一开始,不至与摸不着头脑。

最后在两者之间我选择了编译器,原因是:

  1. 编译器相关的资料多,当自己能力不足的时候,可能选择有参考资料的东西去实现是一个好的选择。虚拟机方面的资料相对于编译器来说就少得可怜了。
  2. 编译器相对于虚拟机,实现简单一些。

确定实现编译器之后还要面临其它的选择:

  1. 用什么语言去实现呢?这个问题并没有给我带来什么困扰,我选择C++。原因是C++是我所学的语言中,我花最多的时间去学习的,同时也是我所学的语言中最复杂的,虽然已经很久没用C++了,但仍然对C++感情浓厚——不过若从语法简洁性或开发速度上来说,或许选择GROOVY或JAVA都要比C++要好一些,因为它们不需要我关注太多的语言细节,而只花心思在编译器相关的算法上。不过我还是选择用C++,这只是个人偏爱的问题。
  2. 要实现什么语言的编译器呢?当时手头上刚好有一本《现代编译器的JAVA实现》,那就选择JAVA吧。不过这个想法没过多久就发生了变化。一方面JAVA语言规范读起来实在是太枯燥,要保持现在的热情就一定要快一点做出个能运行的东西出来——甭管这东西有多么粗糙——要我看完那几百页的语言规范,可能到候可能已经不想再去做了,另一方面是Unicode并不是编译技术的主要相关部分(JAVA的词法是允许Unicode编码的),或许不对任何宽字符做处理会让我写起代码来更顺手一些。在写这些文字的时候,我已经做完了词法分析器,这个问题我是边做东西,边想的。在这段时间也看了一些相关书藉,最后决定做一个类似JAVA语法的语言的编译器,并且以JVM为目标机器。我手头上只有C语言的规范文档和JAVA语言的规范文档,C语言并不适合在JVM上运行,而我选择JVM是因为:(1).JVM的指令相对高级,对于编译器实现后期的目标代码生成来说,或许不会让我太头疼;(2).我所用的C++编译器是GCC,GCC的汇编器是AT&T形式的汇编,万一到实现后期我想要用汇编做为目标代码生成前的中间形式,我倒是不太喜欢AT&T形式的汇编(还是个人喜好的问题);(3).如果我做完编译器之后还打算做虚拟机,那么如果我的目标机器是JVM,也可以为以后的实现铺路。

当时的想法大概就是这个样子。现在已经实现了词法分析,在这里记下来一些关键的东西,做为一个积累。

编译概述
  • 什么是编译?
  • 一个编译器的结构?
  • 编译与解释的区别?
  • 静态语义与动态语义的区别?
阅读(1793) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~