1.6 环境搭建

1.6.1 搭建开发环境

本书的开发语言是C语言,辅助工具是yacc和lex。

UNIX(包含Linux等)大部分都已经预装了开发所需的yacc和lex,当然也有例外,而Windows则默认没有预装。不过无需担心这些,我们完全可以全部使用自由软件来搭建一个可用的开发环境。

那么,下面我们就开始介绍这些软件的获取途径。

1. C编译器

免费的C编译器可以使用GNU项目提供的GCC(GNU Compiler Collection)。

Linux等免费的UNIX环境下大多都预装了GCC [6]。Windows下可以使用MinGW(Minimalist GNU for Windows)。

可以从下面的URL下载。

http://www.mingw.org/download.shtml

安装MinGW时,UNIX环境下的程序会将构建(build)时使用到的make工具也一并安装。不过,安装完毕后可执行文件名有点奇怪,是 mingw32-make. exe,我将其复制并重命名为 gmake.exe以方便使用。

2. cygwin或MSYS

cygwin是可以运行在Windows上的类UNIX环境。比如说想在命令行提示符中列出当前文件夹内的文件时,Windows(DOS)会使用 DIR指令,UNIX则使用 ls指令。一般用惯了UNIX的人,往往会在Windows的命令行提示符中不自觉地敲出 ls却尴尬地发现指令不存在,而安装了cygwin就可以避免这样的情况发生。那么对于不经常使用UNIX的人还有必要装cygwin吗?因为在后文中提到的bison要使用UNIX中的m4工具,所以无论是cygwin还是MSYS,至少还是要安装其中一个的 [7]。MSYS与cygwin都是在Windows上模拟UNIX环境的软件。

cygwin可以从下面的网址中获取:

http://cygwin.com/

MSYS可从MinGW页面中下载:

http://www.mingw.org/download.shtml

此外,因为cygwin也包含GCC,可以没有MinGW而通过cygwin安装GCC。但是使用cygwin安装的GCC编译,运行时需要依赖cygwin1.dll文件,在其他机器运行还需要把DLL也复制过去,所以还是使用MinGW更方便。

3. bison

如果环境无法直接运行yacc,可以使用GNU项目提供的bison。

http://gnuwin32.sourceforge.net/packages/bison.htm

4. flex

同理,如果环境无法直接运行lex,可以使用lex的免费版flex。

http://gnuwin32.sourceforge.net/packages/flex.htm

补充知识 关于bison与flex的安装

bison 由 GNU 项目提供。GNU 项目是由理查德·斯托曼(Richard MatthewStallman)创立的项目,目标在于建立一个完全相容于UNIX的自由软件环境。

GNU 项目提供的软件的许可证为 GPL(通用公共许可协议,General PublicLicense)。粗略地说,GPL是这样一种许可证:

发行GPL的程序时,必须公开源代码并且声明源代码的出处;

包含GPL源代码的程序,必须受GPL许可证条款约束;

程序即使以动态链接方式使用GPL程序,也必须受GPL许可证条款约束。不过这个限制在LGPL许可证(Lesser GPL)中有所放宽。

也就是说,你的程序中只要用到GPL的程序,哪怕这部分再小,你的程序也会自动变成GPL程序,必须与源代码同时公开。这对于那些为了防止盗版而不得不采取一些措施的商用软件来说简直是致命的。因此也有人戏称GPL的这个特性是“GPL传染”或“GPL病毒”。

那么bison是否也是如此呢?后文会有说明,bison的作用是将用户编写的配置文件输出为C语言格式的代码。这里的C代码中会包含一些属于bison的代码。那么是不是说使用bison去制作编程语言,所做出的编程语言在发行上也必须遵守GPL许可证呢?关于bison输出的C代码这一点,是GPL的一个特例,可以不受GPL许可证约束。此处在GNU项目有关GPL的FAQ页面中有如下的记载:

碰巧的是,Bison也可以用于开发非自由软件。这是因为我们明确允许在Bison的输出结果中包含的Bison的标准解析程序可以不受限制。我们做此决定,是因为已经存在与Bison类似的工具被用于非自由软件的开发。

http://www.gnu.org/licenses/gpl-faq.ja.html

另一方面,flex则是遵循BSD许可证(Berkeley Software Distribution,加州大学伯克利分校开发的软件套件集合)的(不是修订版BSD)。BSD许可证的程序再次发行时,文档中必须要附加BSD的版权信息。

flex会像bison一样输出C代码,这里的C代码也像bison一样,会包含一些属于flex的代码。但是这部分代码并不需要附加BSD的版权信息。因为flex-2.5.34携带的COPYING文件中有这样的描述:

Note that the “flex.skl” scanner skeleton carries no copyright notice. You are free to do whatever you please with scanners generated using flex; for them, you are not even bound by the above copyright.

1.6.2 本书涉及的源代码以及编译器

本书所涉及的源代码,可以在作者的网站上下载:

http://avnpc.com/pages/devlang#download

在开始撰写本书之前,crowbar和Diksam就已经存在一些公开的版本了,本书所用到的代码都对其进行了重新的整理和修正,因此本书相关的代码将重新以 book_ver 作为版本号。比如本书最开始制作的crowbar 的版本号就是crowbar.book_ver.0.1。

注 释

[1]. 当然,在早年原始的研发条件下,人们为了开发第一个编程语言编译器还是花费了相当大的精力,据说实现初版的FORTRAN编译器所花费的工时,累计达到了216人月 [1]

[2]. 从这个定义来说,Lisp严格讲还不能算是函数式编程语言。

[3]. 为了解决这个问题,一般的编译器都会将依赖CPU生成的机器码的部分单独归为一个名为Backend的模块,根据不同的CPU可以更换相应的Backend,就可以支持其他型号的CPU了。

[4]. 代码中的 hoge、 piyo 这两个单词,经常在输出无意义的语句时使用(多见于日本,英语国家则较多使用 foo、 bar)。详细请参考以下的页面: http://avnpc.com/pages/devlang#hoge

[5]. Perl 6还不知道什么时候出来,就不管它了:-)

[6]. 最近Linux不预装GCC的情况似乎越来越多了。

[7]. m4其实也可以单独安装,但似乎没有独立的安装包,可能会非常麻烦。