为了可能的版权问题,特此说明《The design and implementation of a language for extendingapplications》版权属于原作者们,我翻译的此文档,网友最好加上原始链接再转载,但不强求,因为我不敢保证我翻译,表达的准确性,正确性。这只是用中文记录了当时对内容理解,同时也只翻译了我感兴趣的东西。有确实需要的人们可以去读原文进行自己的理解。
《The design andimplementation of a language for extending applications》我分为上中下三部分进行翻译发布。同时也欢迎专业人士对翻译不对的专有词进行指正,谢谢!!!
摘要
我们在本文中描述了Lua的设计与实现。Lua是一个简单而强大的应用程序扩展语言。虽然Lua是一个编程语言,但是它还具有数据描述能力,并且在产品中得到广泛应用。例如用户配置、一般的数据入口、用户接口描述、应用程序对象描述、结构化的图像文件存储。(user configuration,data entry,user interfaces,application objects,structured graphical metafiles)
简介
定制应用程序的需求越来越多,随着应用程序变得越来越复杂,通过简单的参数进行定制应用程序变得不可能:用户现在要在应用执行的时刻产生配置策略,用户还要编写宏和脚本来增加生产力(Ryan 1990)。因此现今的稍大些的应用程序都为最终用户可编程提供配置语言和脚本语言。这些语言虽然都很简单,但每个语言都有自己的特殊语法,导致用户不得不学习,开发人员不得不学习使用各种新语言工具进行设计,调试。
有关我们第一个私有脚本语言经验,来自于应用程序的data entry。这是一个非常简单的声明式语言(declarative language)(Figueiredo-Souza-Gattass-Coelho 1992)。(Data entry 是用户定义的动作集合,由于对于所有的应用程序来说,编码前进行充分的确认测试几乎不能,因此非常需要这样的动作定义。)当用户要求在这个语言上增加更强大的功能时,我们决定需要一个更通用的方法,并且开始进行通用的嵌入语言(embedded language)设计。当时我们为了描述数据(data description),在另一个应用程序中正在开发新的声明式语言。因此我们决定将2个语言合并为一个,将Lua设计成具有数据描述能力的编程语言。自此Lua得到快速的成长,并且在多个工业项目上得到应用。
这篇文章讲述了Lua的设计决策,以及Lua实现的细节。
扩展语言(Extension languages)
经过实践验证,应用程序扩展语言的作用是一种重要的设计技术。它使应用程序设计变得简单,但同时却为用户提供配置功能。因为很多扩展语言简单的只针对某一个任务,这样的语言叫做little languages(Bentley 1986 Valdes 1991),这个小是相对于当前编写应用的主流编程语言来说。但现在这样的差别越来越不明显,因为几个应用程序的主要部分就是使用扩展语言编写的。扩展语言出现了如下几种类型:
配置语言(configuration languages)用于选择参数,通常是从命令行获取参数列表或者从配置文件读取变量值。DOS的sys配置文件,MS Windows的ini文件,X11的资源文件,Motif的UIL文件等等都属于配置语言。
脚本语言(scripting languages)用于工作自动化,有限的流程控制,例如DOS的bat批处理文件,或者各种各样的Unix Shell。
宏语言(macro languages)也用于工作自动化,但是通常是无流程控制,只是一系列顺序执行的简单动作。
嵌入语言(embedded languages)用于扩展应用程序满足用户定制功能。这样的语言一般由应用程序提供。这些语言通常功能十分强大。而相对于LISP,C这样的主流编程语言,他们又非常简单。嵌入语言与独立语言(standalonelanguages)有哪些区别?嵌入语言只能在宿主程序里工作,由宿主程序调用嵌入语言。此外,宿主程序能够为嵌入语言提供针对专业领域的扩展。因此可以为一些特殊需求,专门定制创建一个嵌入语言版本,并且提供更高层次的抽象。为此,一个嵌入语言要有自己的编程语法(syntax),还要有应用程序(宿主程序)编程接口,用于与宿主程序联系。
所以,简单的扩展语言只能提供简单编程,为宿主程序提供顺序的执行动作。而在嵌入语言中,嵌入语言与宿主程序有2种通信方式,应用程序实现者可以使用嵌入式语言编程,反之应用程序的使用者可以独立的使用嵌入语言编程。
LISP已经是非常受欢迎的扩展语言,它的语法简单,容易解析,本身具有扩展性(Beckman1991;Nahaboo)。
例如,Emacs主要部件都是用LISP写的,后来一些其他的文本编辑器也采用同样的方法实现。但是LISP用于客户定制时,并不能叫做用户友好的编程语言。C和shell语言也都不是。这些语言的语法都复杂难懂,不常见。
Lua设计的一个基本原则就是要有一个简洁,熟悉的语法。我们很快解决这个问题,因为我们采用了简单的类Pascal语法。我们没有使用基于LISP或者C的语法,因为这样的语法增加外行或者没有编程经验的人学习/使用成本。因此,Lua首先是一个过程式语言(procedural language),另外Lua也是具有数据描述(data description)能力的语言,这更增加了Lua的表现能力。
通过《应用程序扩展语言的设计与实现(上)》,我了解了扩展语言分了几种类型:配置语言,脚本语言,宏语言,嵌入语言。而Lua是嵌入语言,但同时具有配置语言,脚本语言能力,Lua的语法采用了类Pascal语法。