关于Lua 5.1的变更
* 从版本5.0到5.1的变化
-------------------------------
语言:
+ 新模块系统。
+ 赋予for的控制变量新的语义。
+ 赋予setn/getn新的语义。
+ 赋予可变参数新的语法/语义。
+ 新型长字符串和注释。
+ 新“取模”操作符(‘%’)
+ 新取长操作符#t
+ 元表用于所有类型
API:
+ 新函数:lua_createtable、lua_get(set)field、lua_push(to)integer。
+ 用户提供内存分配器(lua_open变成lua_newstate)。
+ luaopen_*函数必须通过Lua调用。
实现:
+ 凭借luaconf.h的新的配置方案。
+ 增量垃圾收集。
+ 在词法分析器中更好地处理行尾。
+ 完全可重入的解析器(新Lua函数“load”)
+ 更好地支持64位机器。
+ 对Mac OS X提供本地loadlib支持。
+ 标准分发包放在唯一一个库中(lualib.a被合并入lua.a)
* 从版本4.0到5.0的变化
-------------------------------
语言:
+ 词法域。
+ Lua协程。
+ 标准库被打包在表中。
+ 元表取代标签,元表中的元方法取代标签方法。
+ 适当的尾调用。
+ 每个函数可拥有自己的全局表,它可被共享。
+ 新__newindex元方法,当向表中插入新键时调用。
+ 新的块注释:--[[ ... ]]。
+ 新的一般形式的for。
+ 新弱引用(weak)表。
+ 新布尔类型。
+ 新语法“局部函数”。
+ (f())返回f返回的第一个值。
+ {f()}用f返回的全部值填充表。
+ \n在[[\n中被忽略。
+ 修订and-or的优先级。
+ 更一般形式的函数定义语法(例如function a.x.y:f()...end)。
+ 更一般形式的函数调用语法(例如(print or write)(9))。
+ 新函数(time/date、tmpfile、unpack、require、load*,等等)。
API:
+ 代码单元(chunk)通过lua_load载入;新luaL_loadfile和luaL_loadbuffer。
+ 引入轻量级用户数据,一个不带元表的简单的“void*”。
+ 新错误处理协议:核心不再输出错误消息;所有错误被报告到栈上的调用者。
+ 用于宿主清理的新lua_atpanic。
+ 新的、信号安全的(signal-safe)hook方案。
实现:
+ 新许可证:MIT。
+ 新的、更快、基于注册的虚拟机。
+ 支持外部多线程和协同例程。
+ 新的且一致的错误消息格式。
+ 核心不再需要“stdio.h”(除了sprintf将数字转换为字符串单个用法)。
+ 如果存在环境变两LUA_INIT,lua.c处理它。它可为要运行的文件“@filename”或代码单元自身。
+ 在lua.c中支持用户扩展。给出了命令行编辑作为示例实现。
+ 新动态加载库,在一些平台上缺省是可用的。
+ 安全的垃圾收集器元方法。
+ 为完整性目的的预编译字节码检查。
+ 完全调整的字符串。
+ string.find中的位置捕获。
+ read('*l')可读取嵌入的0(embedded zero)。
* 从版本3.2到4.0的变化
-------------------------------
语言:
+ 新的“break”和“for”语句(数字的和for表)。
+ 对全局的统一处理:全局存储在一个Lua表中。
+ 改进的错误消息。
+ 不再使用“$debug”:全速*和*完整的调试信息。
+ 新读取形式:read(N)用于后续的N字节。
+ 不赞成使用一般的读取模式。(利用-DCOMPAT_READPATTERNS则仍然可用。)
+ 对于最后的函数,所有返回值作为参数传递(利用-DLUA_COMPAT_ARGRET则旧式的语义仍然可用)
+ 不赞成使用用于表的垃圾收集标签方法。
+ 对于排序只有一个标签方法。
API:
+ 新API:完全可重入、更简单且更高效。
+ 新调试API。
实现:
+ 比以往更快:更纯净的虚拟机和新散列算法。
+ 非递归的垃圾收集器算法。
+ 减少带很多字符串的程序的内存占用。
+ 改进度内存分配错误的处理。
+ 改进对16位机器的支持(我们希望)。
+ 代码可不加修改第通过ANSI C和C++编译。
+ 使用strtoul转换基数非10的数字。
+ 在Lua中新的-f选项以支持#!脚本。
+ luac可以联合文本和二进制。
* 从版本3.1到3.2的变化
-------------------------------
+ 重定向Lua核心中的所有输出到_ERRORMESSAGE和_ALERT。
+ 提高常量和每个函数中的全局变量的数量限制(从2^16到2^24)。
+ 调试信息(lua_debug和hook)移到lua_state中,并提供了新API函数获取和设置该信息。
+ 新调试库在Lua中提供完整的调试访问。
+ 新的表函数“foreachi”、“sort”、“tinsert”、“tremove”、“getn”。
+ 新的io函数“flush”、“seek”。
* 从版本3.0到3.1的变化
-------------------------------
+ 新特性:带闭包的匿名函数(通过“upvalue”)。
+ 新语法:
- 代码单元中的局部变量。
- 带DO block END的更好的作用域控制。
- 构造器也可写成:{ 记录部分; 列表部分 }。
- 函数调用和左值的更一般形式的语法,例如:
f(x).y=1
o:f(x,y):g(z)
f"string"是f("string")的语法糖
+ 字符串可包含任意二进制数据(例如,嵌入的0(embedded zeros))。
+ 重新组织和清理主要代码;降低模块依赖性。
+ 常量和全局变量的总数没有任何限制。
+ 支持多全局上下文。
+ 更好的语法错误消息。
+ 新的遍历函数“foreach”和“foreachvar”。
+ 数字缺省是双精度浮点数。很容易改为使用单精度浮点数或长整型。
+ 完整的调试信息存储在预编译的代码单元中(chunk)。
+ 当交互地运行时,示例解释器会提示用户,并且也可优雅地处理control-C中断。
* 从版本2.5到3.0的变化
-------------------------------
+ 新概念:“标签方法”。
标签方法取代fallback作为扩展Lua的语义的元机制。然而fallback具有全局的本性,
标签方法作用于具有相同标签的对象(比如一些表的分组)。
使用fallback的现存代码应该无需修改即可运行。
+ 新的、一般形式的构造器{[exp] = exp, ... }语法。
+ 在函数中提供对处理数量可变的参数的支持(vararg)。
+ 支持条件编译($if ... $else ... $end)。
+ API中更纯净的语义简化宿主代码。
+ 更好地支持编写库(auxlib.h)。
+ 标准库中更好的类型检查和错误消息。
+ luac也能逆转储(undump)。
* 从版本2.4到2.5的变化
-------------------------------
+ 基于模式匹配的io和string库;为了兼容性,旧式库仍然可用
+ dofile和dostring可返回值(通过返回语句)
+ 更好地支持16和64位机器
+ 文档扩容,带更多例子
* 从版本2.2到2.4的变化
-------------------------------
+ 外部编译器创建可移植的二进制文件可更快地加载
+ 调试和profiling的接口
+ 新的“getglobal”fallback
+ 新函数用于处理对Lua对象的引用
+ 标准库中的新函数
+ 每个字符串只存储一份拷贝
+ 文档扩容,带更多例子
* 从版本2.1到2.2的变化
-------------------------------
+ 可用“左值”作为名字声明函数
+ 函数的垃圾收集
+ 为管道提供支持
* 从版本1.1到2.1的变化
-------------------------------
+ 面向对象支持
+ fallbacks
+ 简化表语法
+ 很多内部改进
(变更结束)
阅读(1602) | 评论(0) | 转发(0) |