- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1 介绍 - 云风的blog
摘要 我们探讨 Lua5.0 的主要特点:基于寄存器的虚拟机、散列表用做数组时
的新优化算法,闭包的实现以及协程的加入。
1. 介绍
Lua 作为一个内部的软件开发工具,诞生于学院实验室,然而,不知何故,
很快被全世界的几个工业项目所采用,而且目前正被广泛运用于游戏行业。1
如何看待 Lua 被广泛使用的这种现象?我们认为,答案在于对Lua 的设计
和实现目标:提供一种嵌入式的脚本编程语言,它简洁、高效、可移植并且是轻
量级的。自1993年 Lua 诞生以来,这些就一直是我们主要的目标,而且随着 Lua
的演变,这个目标一直被我们所追求。2
Lua 广泛的用途催生了对语言特性的需求。Lua 的多种特性已经被工业需求
和用户反馈所提出。在 Lua5.0 中引入协程以及在即将发布的 Lua5.1 版中实现
增量式垃圾回收就是重要的例证。
本文中,我们探讨与 Lua4.0相比,Lua5.0 的主要的特点。
基于寄存器的虚拟机:传统上,大部分虚拟机都是基于堆栈的。这种形势自
Pascal 的 P-虚拟机开始一直持续到今天的 Java 虚拟机(JVM )以及 Microsoft
.Net 环境。 然而近来,基于寄存器的虚拟机正日益激起人们的兴趣(例如,规
划中的Perl6(Parrot)虚拟机将会是基于寄存器的)。据我们所知,Lua5.0 的虚
拟机是第一个广泛使用的基于寄存器的虚拟机。该虚拟机将在第7节中介绍。
散列表用做数组时的新优化算法:不同于其他脚本编程语言,Lua不提供数
组类型。取而代之的是,Lua 程序员用表和整数索引来实现数组。Lua5.0用一种
1 2003年一个由重量级的游戏开发网站发起的一项非正式调查显示,Lua是游戏开发行业最受
欢迎的脚本语言。更详细的信息请浏览网页/gdpolls/viewpoll.asp?ID=163。
2 采用了类MIT版权许可证也有助于Lua的推广。
新的算法来检测散列表是否被用作数组并且自动地将与数值索引相关的值存储
在一个实际的数组中,而不是将其加入散列表。这个算法在第四节中讨论。
闭包的实现:Lua5.0支持带作用域的嵌套函数。该机制给那些用一个堆栈来
存储活动记录的语言出了个大难题。Lua 用一种新颖的方法来实现函数闭包。函
数闭包将局部变量保存在(基于数组的)栈中,只有当某局部变量在被嵌套函数
引用期间超出作用域时,它们才被移入堆中。
协程的加入:Lua5.0在语言中引入协程的概念。虽然协程的实现多少有些老
套,不过出于完整性的考虑,我们还是会在第六节对它做个简介。
其他各小节会详细论述以上各项内容,第二节我们对Lua 的设计目标以及此
目标如何影响语言的实现做一个总览。第三节介绍在Lua内部,值是如何表示的。
虽然值的表示方法本身没什么新颖之处,但在其他小节我们需要这一内容。最后,
第八节将给出一个小的对比测试结果并得出某些结论。
2. Lua的设计和实现总览
正如介绍中提到的,我们实现Lua 的目标是:
简洁:我们寻求最简化的语言和最小化的源码(以C语言实现)。这意味着
Lua 只有一些类似传统编程语言的简单的语法和少量的语言结构。
高效:我们希望快速编译并执行Lua 程序。这意味着需要一个快速、智能、
一遍编译的编译器和一个快速执行指令的虚拟机。
可移植:我们希望Lua能够在尽可能多的平台上运行。希望Lua 内核能够
在不做任何修改的情况下,在任何平台上都能顺利编译通过。并且希望Lua 程序
在任何平台上都不需要修改就能顺利执行,只要该平台上有一个Lua解释器。这
意味着需要用纯ANSIC实现Lua并注意移植问题,避开C语言及其库的阴暗面,
并保证在C++编译器上也能顺利通过编译,而不希望看到警告信息。
可嵌入:Lua是一种可扩展的语言,它的设计目标是在大型程序中提供脚本
支持。这些目标都需要一个形式简单、功能强大,但依赖于C语言内建数据类
型的编程接口(CAPI)。
容易嵌入:我们希望能够很容易地将Lua 嵌入到应用程序中,而不会显得臃
肿。这意味着需要紧凑的C代码和小巧的Lua 内核,同时可通过用户库扩展Lua
的功能。
这些目标有些矛盾。例如,Lua 常常被用作数据描述语言,用于存取配置文
件,有时甚至是大型数据库(数MB的Lua 程序并非罕见)。这就需要一个快速
的Lua 编译器。另一方面,我们也希望Lua程序能快速执行。这需要编译器够聪
明,能够为虚拟机生成好的指令代码。因此,Lua 编译器的实现必须权衡这两种
需求。然而
原创力文档


文档评论(0)