标题说是 4.0,其实这里分析的是 4.0.1。不过按照 Lua 的版本号规则,小号只做 bug fix 。所以,下面的所说的 4.0 指的就是 release 4.0.1(在不引起混淆的情况下)。
4.0 发布于 2000 年 11 月,4.0.1 发布于 2002.7,我们看的上一个版本 2.4 则是发布于 1996 年 5 月,怎么说这个版本也是二十一世纪的了。
4.0 算是比较新的版本了,因为它有在线版的代码和文档。
在线文档在 http://www.lua.org/manual/,其实从 2.1 版开始就已经有在线的文档了。
在线代码在 http://www.lua.org/source/, 最早的则是版本 4.0 。
下载代码 www.lua.org/ftp/lua-4.0.1.tar.gz, 解压,编译。
同样,还是在 Linux 里比较省事儿,直接 make 就完事儿了。 而在 Win 里,还是上 VS,建工程,自己编译。INSTALL 文件里有如何在 Win 里编译,给出了一块模块信息。更好的模块描述信息在 http://www.lua.org/source/4.0.1/ ,内容如下:
头文件:
lua.h
lauxlib.h
luadebug.h
lualib.h
核心:
lapi.c
lcode.c
ldebug.c
ldo.c
lfunc.c
lgc.c
llex.c
lmem.c
lobject.c
lparser.c
lstate.c
lstring.c
ltable.c
ltm.c
lundump.c
lvm.c
lzio.c
(上面的的 .c 文件相应的同名 .h 头文件)
llimits.h
lopcodes.h
库:
lauxlib.c
lbaselib.c
ldblib.c
liolib.c
lmathlib.c
lstrlib.c
解释器:
lua.c
编译器:
dump.c
luac.c
luac.h
opt.c
print.c
print.h
stubs.c
代码位于 src, include, etc 目录里。其中 src 和 include 目录内是所有的 Lua 代码。etc 目录里是一些可能有用的代码,这个目录不是我们所关注的。
在 VS 里编译解释器 lua 时可以把所有的 Lua 代码文件(就是 src 和 include 目录里的)除 luac 目录里的放到一个目录里,新建 lua 工程,添加所有的该目录里的文件,编译。
编译编译器 luac 时是把所有的 Lua 代码文件(就是 src 和 include 目录里的)除 lua, lib (因为对于编译器来说,库是没有意义的。库只在运行时有意义。)目录里的放到一个目录里,新建 luac 工程,添加所有的该目录里的文件,编译。出错,链接错误集中于 stubs.obj 中
error LNK2005: _lua_error already defined in ldo.obj
error LNK2005: _luaD_breakrun already defined in ldo.obj
error LNK2005: _lua_open already defined in lstate.obj
error LNK2005: _luaG_getline already defined in ldebug.obj
把 ldo.c,lstate.c,ldebug.c 从工程里去掉,又中更多的链接错误,
把 lapi.c,lgc.c,lvm.c,ltm.c 也从工程里去掉,编译完成。
参见 stubs.c 里的一个注释
/*
* avoid lapi ldebug ldo lgc lstate ltm lvm
* use only lcode lfunc llex lmem lobject lparser lstring ltable lzio
*/
试验下,写个 "hello world",编译器和解释器都可以跑。初步说明程序的编译是没有问题的。
对于编译器工程来说,可能还有别的没用的文件在里面。因为一些执行相关的代码对于编译器来说是调不到了,这里不再深究了。
文档位于 doc 目录里,readme.html 索引了所有的文档,包括当前目录里的 html 文档及代码里的 README 自述文档。