《The Evolution of Lua》读书笔记 1
lua 的优点:
* 可移植性
* 容易嵌入
* 体积小
* 高效率
这些优点都来自于 lua 的设计目标:简洁。从 Scheme 获得了很多灵感,包括匿名函数,合理的语义域概念
lua 前身: 巴西被禁运,引入计算机软件和硬件受限,巴西人有强烈的民族情绪去创造自己的软件。三名作者都是同一个实验室 Tecgraf 的,这个实验室与很多工业实体有合作关系。成立的头十年,重点是创造交互性的图形软件,帮助合作伙伴进行设计。巴西石油公司是其中一个重要伙伴。有大量的遗留数据需要处理。于是诞生了 DEL,一个领域专用语言,主要用来描述数据流图的数据的。后来人们对 DEL 需求越来越多,不止是一门简单的数据描述语言可以解决的了。
lua 为解决实际问题而生,受到三位作者学过的语言影响。自己创造的是 ..(两个句号)连接字符串。自豪的是,在 13 年的演进里,lua 的类型系统只修改了两次。lua 诞生的时候,基本类型包括 nil,number,string,table,C function,Lua function,userdata。97 年的时候,Lua3.0 将 C function 和 Lua function 合并了。03 年的时候,提出了 boolean 值类型,增加了 thread 协程类型。
1993 年,第一版 Lua 由 Waldemar 在 Roberto 指导下完成。词法分析用了 Unix 上经典的 yacc 和 lex。解释器将 lua 代码翻译成针对一个基于栈的虚拟机的指令。C API 很容易扩展,因此最早只有 5 个函数(print,tonumber,type,next,nextvar)和 3 个库(input/output, string, math)。
Lua 的历史 lua 的发布模式和其他社区不一样。alpha 版本已经相当稳定,beta 版本几乎可以作为 final 版,除非是用来修复 bug。这个发布模式对于 lua 的稳定性有很大帮助,但不利于尝试新特性。因此,从 5.0 版本开始,添加了新的 work 版本。work 版本是 lua 当前开发版的 snapshot,有助于 lua 社区迈向开源社区的哲学:早发布、多发布。
lua 的标准库被刻意保持在一个很小的范围,因为大部分需要的功能都会由宿主或第三方库提供。4.0 对 C API 重新设计了,C API 有很大改动,之后就向着完美一点点前进了。结果是不再有任何内置函数,所有标准库都是基于 C API 实现,没有通过特别的后门去访问 Lua 内部结构。
Lua 的 vm 在 4.0 版本以前一直是基于栈的。在 3.1 版本,我们对多个指令添加了变量来提高性能。后来发现这个实现复杂度很高,性能提升不明显,于是在 Lua 3.2 版本去掉了。从 Lua 5.0 开始,vm 改为基于寄存器。代码生成器因此有更多机会去优化和减少常见 Lua 程序的指令数了。
Lua1 Lua 的成功使得 Lua 被大规模用在数据描述上,而预编译 Lua 代码为 VM 字节码的特性,迫使 Lua 编译器必须非常快,即使是对于大型项目。通过将 lex 产生的 scanner 替换为一个手写的版本,我们几乎让 Lua 编译器的速度翻了一倍。同时,我们修改了 Lua VM 的 table 构造函数,构造一个大型的表不再需要一条条指令传参数进去了,可以一次调用完成。从那以后,优化重点就变成了预编译时间。
1994 年,我们发布了带有这些优化的 lua 版本:Lua1.1。这次发布和第一篇描述 Lua 的设计和实现的文章是重合的。之前从未公开发布过的版本,就被称为 Lua 1.0(Lua1.0 的一个 1993 年 7 月的 snapshot 在 2003 年 10 月发布,以此庆祝 Lua 十周年)
Lua 1.1 最早以源码方式在 ftp 提供下载。这远在开源运动兴盛蓬勃之前。Lua1.1 有限制性的用户协议,对于学术用途是免费的,但是商业用途则需要协商。那部分协议没有凑效:尽管我们有一些初始联系人,从没有商业使用是经过协商的。其它脚本语言(比如 Tcl)的免费促使我们意识到,限制商用甚至会反过来影响学术用途的发展,因为一些学术项目是打算最终走向市场的。因此,当发布 Lua2.1 的时候,我们将 Lua 作为无限制免费软件发布了。我们天真的以一种学院气的口吻对之前的协议重新措辞,并觉得新协议写的很直观了。稍后,随着开源许可证的散播,我们的协议文本变成了干扰着一些用户的噪音:我们的协议没有清晰的说明是否和 GPL 协议相容。在 2002 年 5 月,在邮件列表里进行了冗长的讨论后,我们决定将来发布的 Lua 版本(从 Lua 5.0 开始)都使用非常清晰直观的 MIT 协议。2002 年 7 月,自由软件基金会(FSF)确认了我们之前的协议是 GPL 兼容的。但我们已经决定采纳 MIT 协议了。对我们协议的疑问从此都消失了。