BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #38997同步于 2010/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[zz]Lua语言简介

FadeToBlack
2010/8/10镜像同步9 回复
Lua 语言简介 1993年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人 员,他们给这门语言取了个浪漫的名字——Lua ,在葡萄牙语里代表美丽的月亮。 事实证明她没有糟蹋这个优美的单词,Lua 语言正如它名字所预示的那样成长为 一门简洁、优雅且富有乐趣的语言。 Lua 从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚 本语言来设计的,因此她一直遵从着简单、小巧、可移植、快速的原则,官方实 现完全采用ANSI C编写,能以C 程序库的形式嵌入到宿主程序中。Lua 的每个版 本都保持着开放源码的传统,不过各版采用的许可协议并不相同,自5.0 版(最 新版是5.1 ) 开始她采用的是著名的MIT 许可协议。正由于上述特点,所以Lua 在游戏开 发、机器人控制、分布式应用、图像处理、生物信息学等各种各样的领域中得到 了越来越广泛的应用。其中尤以游戏开发为最,许多著名的游戏,比如Escape from Monkey Island 、World of Warcraft 、大话西游,都采用了Lua 来配合引擎完 成数据描述、配置管理和逻辑控制等任务。 作为一门过程型动态语言,Lua 有着如下的特性:1 、变量名没有类型,值 才有类型,变量名在运行时可与任何类型的值绑定;2 、语言只提供唯一一种数 据结构,称为表(table ),它类似key-value 关联数组,可以用任何类型的值 作为key 和value.提供了一致且富有表达力的表构造语法,使得 Lua很适合描述 复杂的数据;3 、函数是一等类型,支持匿名函数和正则尾递归(proper tail recursion );4 、支持词法定界(lexical scoping )和闭包(closure ); 5 、提供thread类型和结构化的协程(coroutine )机制,在此基础上可方便实 现协作式多任务;6 、运行期能编译字符串形式的程序文本并载入虚拟机执行; 7 、通过元表(metatable )和元方法(metamethod)提供动态元机制(dynamic meta-mechanism),从而允许程序运行时根据需要改变或扩充语法设施的内定语 义;8 、能方便地利用表和动态元机制实现基于原型(prototype-based )的面 向对象模型;9 、从5.1 版开始提供了完善的模块机制,从而更好地支持开发大 型的应用程序; Lua 的语法类似PASCAL和Modula但更加简洁,所有的语法产生式规则(EBNF) 不过才60几个。熟悉C 和ASCAL 的程序员一般只需半个小时便可将其完全掌握。 而在语义上Lua 则与Scheme极为相似,她们完全共享上述的1 、3 、4 、6 点特 性,Scheme的 continuation 与协程也基本相同只是自由度更高。最引人注目的 是,两种语言都只提供唯一一种数据结构:Lua 的表和Scheme的列表(list)。 正因为如此,有人甚至称Lua 为“只用表的Scheme”。 库和工具 相比Java、Python、Perl,Lua 的开源工具和库可能并不算多,但其中不乏 优秀之作。以下介绍的资源均可在http://lua-users.org/wiki/LuaAddons 上找 到,而且绝大多数都遵循着与Lua 相同的许可协议。 一、Kepler Kepler是一个简单且轻量的Web 开发平台(但这并不意味着只能用它来开发 简单的应用),支持用Lua 撰写web 程序,因此相当易学易用,并且能较方便地 应用在一些资源受限的系统中。由于使用ANSI C和Lua 进行开发,所以它能移植 到任何支持ANSI C的平台上。 Kepler由多个Lua 扩展库组成,包括CGILua、LuaSocket 、LuaFileSystem 、 Copas 、LuaSQL、 LuaLDAP、LuaExpat、LuaXMLRPC 、LuaSOAP 、LuaZip、Xavante 等,它们可大致分为核心库和功能支撑库两部分。其中核心是CGILua和LuaSocket ,后者负责TCP/UDPsockets 的操作,前者则可以创建动态页面并处理web 表单上 的输入数据。 Kepler 通过CGILua起动器(launcher)使得Web 服务器执行CGILua 和Web 程序并与之通信。目前的版本已经包括适合CGI 、FastCGI 、Apache、IIS 、Tomcat 、Zope的CGILua起动器,因此用Lua 开发的Web 程序可以在这些种类的 服务器中自由迁移,只要同时安装上对应的CGILua起动器。 LuaFileSystem 是对标准Lua 库中文件读写功能的补充,它提供了一种可移 植的方法来访问系统的目录结构和文件属性。Copas 则是一个基于协程的服务调 度器。 Xavante 是一个用Lua 开发的支持HTTP 1.1的Web 服务器,它直接支持CGILua 而无需起动器。 其它的组件提供了SQL 数据库访问、XML 解析、LDAP、SOAP、XMLRPC、ZIP 文件操作等功能,用户如果只需要其中的某些功能,可以抽出相关组件(及其所 依赖的组件)来使用。 二、wxLua GUI 是开发人员花费气力比较大的一个领域,因此简化GUI 程序的编写一直 是广大程序员的努力方向。随着脚本语言的兴起,将动态、灵活、易用的脚本语 言引入到GUI 开发中是一种非常有价值的尝试。由于复杂的GUI 布局需要大量的 描述信息,所以比起其它脚本来,既适合编程又适合描述数据的Lua 语言在构建 GUI 上就具有独特的优势。 wxWidgets 是一个著名的跨平台C++GUI库,wxLua 在Lua 与wxWidgets 之间 架起了一座桥梁,通过它Lua 代码几乎可以调用 wxWidgets的所有功能。wxLua 基本将wxWidgets 的类体系映射到了Lua (基于原型)的对象模型中,这使得程 序员能以基于对象或面向对象的风格来开发wxLua 程序。一个Lua 脚本的撰写、 运行、测试和修改可以非常快速,这无疑大大提高了GUI 程序的开发效率,因此 wxLua 非常适合快速原型的构造。另外,Lua 本身以及wxWidgets 良好的可移植 性使得相应的Lua GUI 程序在许多平台上都能顺畅地运行。 三、Pluto 虽然Lua 中的表能通过表构造器以Lua 代码的形式保存到文件中从而实现持 久化,但当数据之间有着复杂的引用关系,并且存在循环引用、共享引用等特殊 情况时,这个任务就变得相当困难与繁琐了。Pluto 持久化库能够为用户解决这 个难题。在它的帮助下程序员可以将任意复杂的表数据保存到特殊格式的二进制 文件中以待将来恢复,库会自动处理循环引用之类的情况。 除表之外,Pluto 还支持函数(确切地说是闭包)、thread的持久化,这种 能力非常有意义。大家都知道程序调试中的一个基本动作就是复现 bug,但很多 时候bug 产生的条件是非常复杂的,依赖很多因素,开发者很难精确地构建出完 全一致的运行环境。而利用Pluto 对函数和thread的持久化能力,我们可以把bug 发生时程序的完整运行环境保存下来,今后就可凭此方便地复现bug.另外一个重 要应用是游戏进度的保存。实现游戏逻辑的Lua 脚本的运行状态能随时写入到文 件中留待将来恢复,这使得在任何时间点保存游戏成了一件非常容易的事情。 四、LuaCOM LuaCOM是一个支持Lua 与符合COM 规范的组件对象(确切一点说是自动化对 象)进行交互的扩展库。所谓交互包括了两个方面,首先是允许Lua 程序使用COM 对象。LuaCOM支持注册在系统注册表中的COM 对象的动态实例化,也支持动态访 问运行中的对象。在LuaCOM的帮助下,调用COM 对象方法就象调用普通Lua 函数 一样,存取属性也与存取表的字段类似,同时它还负责Automation数据类型与Lua 数据类型的自动转换。有了这些特性,Lua 程序操作COM 对象就变得容易多了, 再加上Lua 天生的动态性,这无疑使其成了一门非常灵活的组件装配语言。 交互的另外一个方面就是支持用Lua 来实现(自动化)组件对象并提供给外 部客户使用。LuaCOM同时支持进程内和进程外组件,它提供了一些辅助函数来处 理注册、对象实例化这类事情,从而简化了相关工作。由于LuaCOM实际上是根据 Lua 的表来构造一个COM 对象,所以我们可以做一些非常有趣的事情:在 userdata 数据类型(代表不属于Lua 世界的数据结构)和动态元机制的支持下,Lua 能通 过表访问各种各样的外部数据,包括C++ 对象、C 结构或者 CORBA对象等等;LuaCOM 可以很方便地将代表这些数据的表包装成一个COM 对象给外部使用,从而使得那 些老迈的应用程序和库无需太多的努力便能跻身于COM 世界。 五、tolua 直接用C 实现某些功能,然后将相应的函数导入到Lua 中是很常见的做法。 不过尽管Lua 提供了与C 语言交互的API ,但用户必需手工进行繁琐的 Lua栈 (用于与C 交换数据)操作,而且还需注意两种语言数据类型的正确转换。难怪 有人说使用Lua 的C API 就象在使用汇编语言一样。为了减轻程序员的负担,一 些C/C++ Wrapper 应运而生。 tolua 本身不是一个Wrapper ,但它是一个Wrapper 代码自动生成器。它使 用一种称为包(package )的文件来描述要导入到Lua 环境中的常量、变量、函 数、类和方法,这种文件按照简化了的C++ 头文件格式编写。使用时首先让tolua 解析包文件以生成含有相应胶水代码的C/C++ 源文件。然后将生成的源文件编译 并与那些具体实现功能的目标模块链接起来。 tolua 虽然自动产生胶水代码,但需另外撰写描述文件,所以仍然不够方便。 其它一些Wrapper 库则利用C++ 模板元编程技术来自动生成合适的连接代码,从 而避免了额外的描述文件,比如使用boost 库的luabind. 六、LuaJIT Lua 非常高效,它运行得比许多其它脚本(如Perl、Python、Ruby)都快, 这点在第三方的独立测评中得到了证实。尽管如此,仍然会有人不满足,他们总 觉得“嗯,还不够快!”。LuaJIT就是一个为了再榨出一点速度的尝试,它利用 JIT 编译技术把Lua 代码编译成本地机器码后交由CPU 直接执行。LuaJIT测评报 告表明,在浮点运算、循环和协程的切换等方面它的加速效果比较显著,但如果 程序大量依赖C 编写的函数,那么运行速度便不会有什么改进。目前LuaJIT只支 持X86 CPU. LuaJIT中包括一个名为Coco的库,用户可以单独使用它。Coco为C 函数提供 了真正的协程能力,用户能在C 函数内部的任何一点将协程挂起,然后在将来用 协程恢复操作返回到那一点。在标准Lua 中,协程的挂起与恢复是不允许跨越C 函数调用边界的。Coco使用了一些依赖于特定系统的特性,因此在移植程序时要 特别注意。 七、ChunkSpy Lua 的虚拟机字节码指令集并非语言定义的一部分,因此官方没有提供相应 的文档。用户当然可以通过查看相关源代码来获取信息,但这毕竟不方便。 ChunkSpy是一个Lua 虚拟机字节码反汇编器,可以将一个二进制Lua 代码块 输出为非常易读的各种格式(详细或简略,带或不带源程序)的字节码汇编文件。 而且它还支持交互式的反汇编,用户在敲入一行代码后立刻就能看到对应的字节 码指令。ChunkSpy的作者写过一篇详细的介绍 Lua5 虚拟机指令的文章,名为《 A No-Frills Introduction to Lua 5 VM Instructions 》,你在项目主页上能 找到它。这篇文章现在已经针对最新的Lua5.1做了更正。另外,他还是Yueliang 项目的开发者,这个项目采用Lua 语言本身来实现Lua.从项目名来看,作者应该 是个华人。 八、其它 另外一些库与工具还包括LuaEDIT 、LuaEclipse、VS‘05LuaLangPack (它 们都是IDE 或IDE 插件),LuaWrapper、CaLua 、CPB 、CppLua(Wrapper 库), LuaProfiler (性能测量工具)等,读者可以在lua- user.org 与luaforge.net 网站上找到它们以及其它有用资源。 PS. 附件为Programming In Lua的中文版,在http://www.lua.org/pil/index.html 有英文电子版。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
wodetiandi机器人#1 · 2010/8/11
谢谢lz介绍,Programming In Lua不错,写的很详细,有时间研究一下
gucheng机器人#2 · 2010/8/14
lua脚本语言非常强大啊,公司做组件测试就使用的lua,大家有时间可以学习一下,很有用的。 我搭建的论坛,上面有lua教程:http://www.feifanbbs.com/,有感兴趣的同学可以申请版主。
FadeToBlack机器人#3 · 2010/8/14
讨厌注册才能下载的论坛,至于注册才能访问的论坛…… 【 在 gucheng (古城) 的大作中提到: 】 : lua脚本语言非常强大啊,公司做组件测试就使用的lua,大家有时间可以学习一下,很有用的。 : 我搭建的论坛,上面有lua教程:http://www.feifanbbs.com/,有感兴趣的同学可以申请版主。
memory3608机器人#4 · 2010/8/14
赫赫 【 在 FadeToBlack 的大作中提到: 】 : 讨厌注册才能下载的论坛,至于注册才能访问的论坛…… : 【 在 gucheng (古城) 的大作中提到: 】 : : lua脚本语言非常强大啊,公司做组件测试就使用的lua,大家有时间可以学习一下,很有用的。 : ...................
James机器人#5 · 2010/8/14
【 在 FadeToBlack 的大作中提到: 】 : Lua 语言简介 : 1993年在巴西里约热内卢天主教大学(Pontifical Catholic University of : Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人 : ................... Lua 很有前途,连最新版的 Vim 都有 Lua interface 了。
ericyosho机器人#6 · 2010/8/14
还是觉得lua快,是因为暂时语言本身简单的关系。 希望慢慢往后,也不要慢下来。
FadeToBlack机器人#7 · 2010/8/14
这tn不是和金瓜娘起名的memory361娘吗? 【 在 memory3608 (魔蝎·蝴蝶) 的大作中提到: 】 : 赫赫
liaowang11机器人#8 · 2010/8/14
最近在看awesome,满屏幕的lua啊..
gucheng机器人#9 · 2010/8/14
【 在 FadeToBlack 的大作中提到: 】 : 讨厌注册才能下载的论坛,至于注册才能访问的论坛…… : 【 在 gucheng (古城) 的大作中提到: 】 : : lua脚本语言非常强大啊,公司做组件测试就使用的lua,大家有时间可以学习一下,很有用的。 : ................... 多谢仁兄的建议,这个论坛刚搭建好,已经修改权限了,游客可以访问。