经过五年的开发,Lua 5.5 现已发布。Lua 是一种快速、简洁的脚本语言,广泛用作嵌入式配置和扩展开发的语言。Lua 解释器使用 C 语言编写,并采用 MIT 许可证。
Lua 结合了简洁的过程式语法和强大的数据描述能力,这得益于其关联数组和可扩展的语言语义。Lua 使用动态类型,其语言结构会被转换为字节码,并在基于寄存器的虚拟机上运行,该虚拟机具有自动垃圾回收机制。解释器以库的形式实现,可以集成到 C 和 C++ 项目中。
主要创新:
- 大多数垃圾回收操作使用增量模式,将垃圾回收周期分解为与程序执行穿插的多个步骤,从而消除内存中存在大量对象的应用程序执行过程中的长时间停顿。
- 本文提出了一种紧凑的数组实现方式,对于相同数据类型的数组,所需的内存减少了 60%(节省内存的原因是数据类型不是针对每个元素存储的,而是针对一组元素存储的)。
- 现在可以使用 `global` 关键字在任何代码块中显式声明全局变量。在代码块中使用 `global` 关键字指定表达式时,所有变量都必须显式声明。如果缺少 `global` 声明,则会隐式设置 `global *` 表达式,这保留了旧的行为,并将所有变量视为全局变量。此外,还添加了 `global` 表达式。 *”其中所有隐式定义的全局变量都变为只读。X = 1 — 正确,X 是一个全局变量,这是旧的默认行为。do global Y — 将变量 Y 声明为全局变量,代码块中的所有其他变量都必须显式声明。Y = 1 — 正确,变量 Y 之前已定义。X = 1 — 错误,变量 X 未定义。end X = 2 — 正确,在全局代码块之外,应用旧的行为。
- 在“for”循环中指定的控制变量现在是只读的,不能在循环体内修改。例如,在“for i = 1, 5 do”循环中声明的变量 i 不能在循环体内修改。
- 使用 print 函数打印浮点数时,现在可以打印足够多的数字,从而正确地将它们从字符串转换回其原始表示形式。
- 表构造函数允许的嵌套层数已增加。
- 添加了 table.create(nseq, nrec) 函数,用于添加空表并为指定数量的元素预先分配内存。
- utf8.offset 函数不仅返回字符开头的字节偏移量,还返回字符结尾的位置。
- 增加了对创建驻留在 Lua 垃圾回收器未管理的内存中的外部字符串的支持。
- 添加了 luaL_openselectedlibs 函数来加载选定的库,以及 luaL_makeseed 函数,该函数为 lua_newstate 函数生成种子。
- 在 lua.c 中,如果 'readline' 库可用,则可确保动态加载该库(如果系统中存在该库,则会加载它,并且行编辑功能将可用)。
- 启用优化以在加载预编译字节码时节省内存 - Lua 现在可以在加载重复字节码时重用某些内部结构中的内存,而不会创建重复项。
- 确保在转储和取消转储操作中所有行都被重用。
- 在辅助缓冲区中,创建最终字符串时,保证缓冲区重用(无需复制到新缓冲区)。
来源: opennet.ru
