1.6.1 搭建开发环境 本书的开发语言是C 语言,辅助工具是yacc 和lex。 UNIX(包含Linux 等)大部分都已经预装了开发所需的yacc 和lex,当然也有例外,而Windows 则默认没有预装。不过无需担心这些,我们完全可以全部使用自由软件来搭建一个可用的开发环境。 那么,下面我们就开始介绍这些软件的获取途径。 1. C 编译器 免费的C 编译器可以使用GNU 项目提供的GCC(GNU.Compiler.Collection)。 Linux 等免费的UNIX 环境下大多都预装了GCC*。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,至少还是要安装其中一个的*。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 *最近Linux 不预装GCC的情况似乎越来越多了。 *m4 其实也可以单独安装,但似乎没有独立的安装包,可能会非常麻烦。 4. flex 同理,如果环境无法直接运行lex,可以使用lex 的免费版flex。 http:/ /gnuwin32.sourceforge.net/packages/flex.htm 补充知识关于bison与flex的安装 bison由GNU项目提供。GNU项目是由理查德•斯托曼(Richard Matthew Stallman)创立的项目,目标在于建立一个完全相容于UNIX的自由软件环境。GNU项目提供的软件的许可证为GPL(通用公共许可协议,General Public License)。粗略地说,GPL是这样一种许可证: ●●发行GPL的程序时,必须公开源代码并且声明源代码的出处; ●●包含GPL源代码的程序,必须受GPL许可证条款约束; ●●程序即使以动态链接方式使用GPL程序,也必须受GPL许可证条款约束。不过这个限制在LGPL许可证(LesserGPL)中有所放宽。 也就是说,你的程序中只要用到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。