Lua4.0 开篇

标题说是 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 自述文档。

时间: 2024-08-25 18:25:25

Lua4.0 开篇的相关文章

Lua4.0 语法分析

Lua 最初使用的是 Yacc 生成的语法分析器,后来改为手写的递归下降语法分析器(Recursive descent parser).因为一般在语言发展的早期,语言的语法还没有稳定下来,变动可能会比较多,用工具可以快速的验证自己的想法.当语法稳定下来之后,一般都会采用手写的语法分析器.因为这样程序员是调试可控的,并且一般也能有更好的性能表现.递归下降的语法分析对编程语言的语法有要求.因 Lua 的语法比较简单,是 LL(1) 文法.所以,手工编写语法分析也就是情理之中的事了. 关于递归下降的语

Lua4.0 参考手册(一)1-3

说明:这个文档是 doc 目录里的 manual.html 文件.原文版权归原作者所有,这篇翻译只是作为学习之用.如果翻译有不当之处,请参考原文.-------------------以下是正文-------------------编程语言 Lua4.0 的参考手册--------------------------------------1 简介--------------------------------------Lua 是一个扩展编程语言,支持通用编程功能与数据描述功能.作为一个强大

Lua4.0 代码

这个标题是 2014.11.13 号写的,今天总算是写入内容了. 离上次写代码分析时间有点长,都忘记自己之前是如何写的了. 不管这些历史包袱了,这次轻装上阵,想到哪就写到哪. 开始. 参照 4.0 的 INSTALL 文档内容,编译下.在 Linux 机器上比较简单,make 一下就好了. 在 Windows 上建工程的话,也算是比较容易.这部分之前有描述,这里就不再重复了. 简单的说一下这次的代码分析可能会写什么内容.(注意,这里用"可能"的原因的是,依目前的想法,最大程度上会这么写

Lua4.0 字符串相关

这节看一下字符串相关的: TString 数据结构如下所示,可以看到,TString 不单用于处理字符串,还可用于处理用户自定义数据. /* ** String headers for string table */ /* ** most `malloc' libraries allocate memory in blocks of 8 bytes. TSPACK ** tries to make sizeof(TString) a multiple of this granularity, t

Lua4.0 翻译小结

4.0 手册翻译完了,小结一下. 这一次从 2.4 跳到 4.0,手册绝大部分都得从头翻译.以前的 2.4 的只参考了一小部分,所以,翻译得进度比较慢.不过,好在现在已经翻译完了. 翻译过程中,有几节内容不太熟悉,翻译的可能不好.也有的是因为英语的意思没有太明白.不过,如果遇到不了解的,还是以英文为主. 另外,有一点需要解释一下.为什么一个完整的手册要分这么多篇?一个主要的原因是发博客时的字数限制.博客的字数限制是一万字.为了不破节,就自己这么分篇儿了.再者,觉得一篇太长的话, 每次看后面的内容

Lua4.0 参考手册(八)6.2-6.5

(接上篇)-------------------6.2 字符串处理-------------------这个库提供字符串处理的通用函数,如查找,提取子串和模式匹配.在 Lua 中索引一个字符串的时候,第一个字符的索引是 1(不像 C 中是 0).另外,索引可以为负数,负数被解释为逆向索引,从字符串的结尾开始.所以,最后一个字符位置是 -1,以此类推. strbyte (s [, i])返回 s 的第 i 个字符的内部数值码(例如:ASCII 码).如果没有 i,它被认为是 1 .i 可以为负.

Lua4.0 参考手册(六)5.8-5.14

(接上篇)-------------------5.8 执行 Lua 代码-------------------一个宿主程序可以执行写在文件中或在字符串中的 Lua 块,使用下面的函数:     int lua_dofile (lua_State *L, const char *filename);     int lua_dostring (lua_State *L, const char *string);     int lua_dobuffer (lua_State *L, const 

Lua4.0 参考手册(二)4.1-4.4

(接上篇)--------------------------------------4 语言--------------------------------------这节描述 Lua 的词法,语法和语义. -------------------4.1 词法约定-------------------Lua 中的标识符可以是任何字母,数字,下划线组成的字符串,且首字母不可为数字.这符合大多数语言中标识符的定义,除了字母的字义依赖于当前的区域设置:所有的在当前的区域设置中被认为是字母的字符可以被用

Lua4.0 参考手册(七)6.1

(接上篇)--------------------------------------6 标准库--------------------------------------标准库提供了一些有用的函数,这些函数直接由标准 API 实现.因此,它们并非语言必需的部分,并且作为单独的 C 模块被提供.目前,Lua 有以下标准库:> 基本库:> 字符串处理:> 数学函数(sin, log, 等)> 输入输出(和一些系统功能) 为了能使用这些库,宿主程序必须调用函数 lua_baselibo