巴西工程应用中的小语言

Lua诞生于1993年的巴西里约热内卢。里约热内卢天主教大学的计算机图形技术团队Tecgraf为工业客户开发软件,罗伯托·耶鲁萨林斯奇、路易斯·恩里克·德·菲格雷多和瓦尔德马尔·塞莱斯在这里合作设计语言。三人的背景分别侧重计算机语言、数学与软件工具、工程图形应用。

巴西石油公司Petrobras是重要合作方。工程师需要频繁给数值模拟器准备严格排版的输入文件,直接编辑数字列容易出错;另一项岩性剖面报告工作,则要求地质人员自行选择曲线、位置、字体和比例尺。Lua首先回应的是这些现实的软件配置与数据描述需求,而不是为某个游戏专门创造的语言。

参考:[3]

从DEL和SOL合并需求

Tecgraf先为数据录入设计了DEL,即Data Entry Language,借助图形界面让使用者输入并检查参数。随着用户要求增加条件判断和循环,纯描述式设置已经不够。报告生成项目则使用SOL,即Simple Object Language,描述对象及其属性,并把信息交给C语言主程序。

1993年中,团队决定用一种既能描述数据、又能编写过程的新语言满足两类需求。它需要赋值、函数和控制结构,同时保持简洁,并能适应客户手中不同类型的计算机。SOL在葡萄牙语中也有“太阳”之意,新语言于是取名Lua,即“月亮”。这个名称不是英语缩写,不应把每个字母都解释为某个术语。

参考:[2] [3]

作为程序库进入宿主应用

Lua的早期实现以C函数库提供给宿主程序。宿主可以执行Lua代码、读取和写入变量,也可以注册自己的C函数供Lua调用。因而,一套共同语法可以服务不同领域:工程软件仍掌握绘图或模拟等专门功能,用户则通过脚本组合它们,而不必重新编译整个应用。

塞莱斯到1993年7月完成了第一套实现。最初的词法与语法分析借助lex、yacc工具,把源程序转换成栈式虚拟机指令,再由解释器执行。这种安排把语言处理与具体机器隔开,也让实现保持较小。早期Lua成功进入数据录入和岩性报告项目,随后被Tecgraf内部更多项目采用。

参考:[1] [3]

用一张表同时表达数据与检查

1994年的原始论文给出记录构造例子:“t = @employee{name="john smith", age=34}”。这里先产生带有name、age字段的表,再调用employee函数检查字段或补充默认值。表把名称与取值关联起来,程序也可以用数字作索引,因此记录与列表不必各自建立一套完全不同的内部机制。

这段带有@的写法属于早期Lua,不能直接当作现代版本语法。它展示的关键方法是:配置文件可以同时携带结构化资料和必要计算,验证规则也能由普通函数表达。语言本身维持通用机制,特定行业的规则留给应用编写者;这种分工减少了为每个程序另造一门不兼容小语言的需要。

参考:[1] [2]

1993年的实现与1994年的公开版本

1993年7月,Lua已有可运行的内部实现,后来被称为Lua 1.0。它用于Tecgraf的工程项目,没有在当时向公众发布。团队于同年10月在巴西软件工程研讨会上公开介绍早期应用;1993年由此标示语言的形成与内部使用。

1994年7月,团队发布Lua 1.1,通过文件传输服务提供下载,并在这一时期发表介绍语言设计与实现的论文。Lua 1.1是首个公开版本,当时学术用途免费,商业用途仍需另行协商。1995年2月发布的Lua 2.1改为包括商业用途在内均可自由使用。

参考:[3] [2]

早期选择留下的方向

Lua把配置、数据描述和用户可编程行为放在同一语言中,让应用开发者能够区分核心技术与经常变化的配置逻辑。1994年的论文列举了界面描述、对象描述、数据录入验证和图形元文件存储等生产用途;这些具体工作说明,早期价值已经超出简单读取几项参数。

不过,今天熟悉的Lua特性不是在1993年一次完成的。设计者在2007年的语言史论文中,把后来的对象扩展机制、匿名函数、完整词法作用域和协程分别放在后续版本中。回看起点,更准确的结论是:一个为工程应用做的小型嵌入式语言,先用清晰语法、表和C接口解决问题,再在真实使用中逐步改变,而非从诞生时就具备后来全部能力。

参考:[1] [3]