本章包括作者的序言、文章的体例(
convention
)以及其它一些“每本书开头都会的内容”。
0.1 序言
目前很多程序语言都专注于帮你编写成千上万行的代码,所以此类型的语言所提供的包、命名空间、复杂的类型系统及无数的结构,有上千页的文档需要操作者学习。
而
Lua
并不帮你编写大量的代码的程序,相反的,
Lua
仅让你用少量的代码解决关键问题。为实现这个目标,像其他语言一样
Lua
依赖于其可扩展性。但是与其他语言不同的是,不仅用
Lua
编写的软件易于扩展,而且用其他语言比如
C/C++
编写的软件也很容易使用
Lua
扩展其功能。
一开始,
Lua
就被设计成很容易和传统的
C/C++
整合的语言。这种语言的二元性带来了极大的好处。
Lua
是一个小巧而简单的语言,因为
Lua
不致力于做
C
语言已经做得很好的领域,比如:性能、底层操作以及与第三方软件的接口。
Lua
依赖于
C
去做完成这些任务。
Lua
所提供的机制是
C
不善于的:高级语言、动态结构、简洁、易于测试和调试等。正因为如此,
Lua
具有良好的安全保证,自动内存管理,简便的字符串处理功能及其他动态数据的改变。
Lua
不仅是一种易于扩展的语言,也是一种易整合语言(
glue language
);
Lua
支持基于组件的,我们可以将一些已经存在的高级组件整合在一起实现一个应用软件。一般情况下,组件使用像
C/C++
等静态的语言编写。但
Lua
是我们整合各个组件的粘合剂。又通常情况下,组件(或对象)表现为具体在程序开发过程中很少变化的、占用大量
CPU
时间的决定性的程序,例如窗口部件和数据结构。对那种在产品的生命周期内变化比较多的应用方向使用
Lua
可以更方便的适应变化。除了作为整合语言外,
Lua
自身也是一个功能强大的语言。
Lua
不仅可以整合组件,还可以编辑组件甚至完全使用
Lua
创建组件。
除了
Lua
外,还有很多类似的脚本语言,例如:
Perl
、
Tcl
、
Ruby
、
Forth
、
Python
。虽然其他语言在某些方面与
Lua
有着共同的特色,但下面这些特征是
Lua
特有的:
①
可扩展性
。
Lua
的扩展性非常卓越,以至于很多人把
Lua
用作搭建领域语言的工具(注:比如游戏脚本)。
Lua
被设计为易于扩展的,可以通过
Lua
代码或者
C
代码扩展,
Lua
的很多功能都是通过外部库来扩展的。
Lua
很容易与
C/C++
、
java
、
fortran
、
Smalltalk
、
Ada
,以及其他语言接口。
②
简单
。
Lua
本身简单,小巧;内容少但功能强大,这使得
Lua
易于学习,很容易实现一些小的应用。他的完全发布版(代码、手册以及某些平台的二进制文件)仅用一张软盘就可以装得下。
③
高效率
。
Lua
有很高的执行效率,统计表明
Lua
是目前平均效率最高的脚本语言。
④
与平台无关
。
Lua
几乎可以运行在所有我们听说过的系统上,如
NextStep
、
OS/2
、
PlayStation II (Sony)
、
Mac OS-9
、
OS X
、
BeOS
、
MS-DOS
、
IBM mainframes
、
EPOC
、
PalmOS
、
MCF5206eLITE Evaluation Board
、
RISC OS
,及所有的
Windows
和
Unix
。
Lua
不是通过使用条件编译实现平台无关,而是完全使用
ANSI (ISO) C
,这意味着只要你有
ANSI C
编译器你就可以编译并使用
Lua
。
Lua
大部分强大的功能来自于他的类库,这并非偶然。
Lua
的长处之一就是可以通过新类型和函数来扩展其功能。动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出。高级函数和匿名函数均可以接受高级参数,使函数更为通用。
Lua
自带一个小规模的类库。在受限系统中使用
Lua
,如嵌入式系统,我们可以有选择地安装这些类库。若运行环境十分严格,我们甚至可以直接修改类库源代码,仅保留需要的函数。记住:
Lua
是很小的(即使加上全部的标准库)并且在大部分系统下你仍可以不用担心的使用全部的功能。
0.2 Lua的使用者
Lua
使用者分为三大类:使用
Lua
嵌入到其他应用中的、独立使用
Lua
的、将
Lua
和
C
混合使用的。
第一:很多人使用
Lua
嵌入在应用程序,比如
CGILua
(搭建动态网页)、
LuaOrb
(访问
CORBA
对象。这些类型用
Lua-API
注册新函数,创建新类型,通过配置
Lua
就可以改变应用宿主语言的行为。通常,这种应用的使用者并不知道
Lua
是一种独立的语言。例如:
CGILua
用户一般会认为
Lua
是一种用于
Web
的语言。
第二:作为一种独立运行的语言,
Lua
也是很有用的,主要用于文本处理或者只运行一次的小程序。这种应用
Lua
主要使用它的标准库来实现,标准库提供模式匹配和其它一些字串处理的功能。我们可以这样认为:
Lua
是文本处理领域的嵌入式语言。
第三:还有一些使用者使用其他语言开发,把
Lua
当作库使用。这些人大多使用
C
语言开发,但使用
Lua
建立简单灵活易于使用的接口。
本书面向以上三类读者。书的第一部分阐述了语言的本身,展示语言的潜在功能。我们讲述了不同的语言结构,并用一些例子展示如何解决实际问题。这部分既包括基本的语言的控制结构,也包括高级的迭代子和协同。
第二部分重点放在
Lua
特有的数据结构——
tables
上
,
讨论了数据结构、持久性、包及面向对象编程,这里我们将看到
Lua
的真正强大之处。
第三部分介绍标准库。每个标准库一章:数学库、
table
库、
string
库、
I/O
库、
OS
库、
Debug
库。
最后一部分介绍了
Lua
和
C
接口的
API
,这部分介绍在
C
语言中开发应用而不是
Lua
中,应用对于那些打算将
Lua
嵌入到
C/C++
中的读者可能会对此部分更感兴趣。
0.3 Lua的相关资源
如果你真得想学一门语言,参考手册是必备的。本书和
Lua
参考手册互为补充,手册仅仅描述语言本身,因此他既不会告诉你语言的数据结构也不会举例说明,但手册是
Lua
的权威性文档,
http://www.lua.org
可以得到手册的内容。
-- Lua
用户社区,提供了一些第三方包和文档
--
本书的更新勘误表,代码和例子
另外本书仅针对
Lua 5.0
,如果你的版本不同,请查阅
Lua
手册或者比较版本间的差异。
0.4 本书的体例
<1>
字符串使用双引号,比如
"literal strings"
;单字符使用单引号,比如
'a'
;模式串也是用单引号,比如
'[%w_]*'
。
<2>
符号
-->
表示语句的输出或者表达式的结果
:
print(10) --> 10
13 + 3 --> 16
<3>
符号
<-->
表示等价,即对于
Lua
来说,用
this
与
that
没有区别。
this <--> that
0.5 关于本书
开始打算写这本书是
1998
年冬天
(
南半球
)
,那时候
Lua
版本是
3.1
;
2000
年
v4.0
;
2003
年
v5.0
。
很明显的是,这些变化给本书带来很大的冲击,有些内容失去了它存在理由,比如关于超值(
upvalues
)的复杂的解释。一些章节被重写,比如
C API
,另外一些章节被增加进来,比如协同处理。
不太明显的是,
Lua
语言本身的发展对本书的完成也产生了很大的影响。一些语言的变化在本书中并没有被涵盖进来,这并非偶然的。在本书的创作过程中,有的时候在某个章节我会突然感觉很困惑,因为我不知道该从何开始或者怎样去讲问题阐述清楚。当你想尽力去解释清楚如何使用的前提是你应该觉得使用这个东西很容易,这表明
Lua
某些地方需要被改进。还有的时候,我顺利的写完某个章节,结果却是没有人能看得懂我写的或者没有人对我在这个章节内表达的观点达成一致。大部分情况下,这是我的过错因为我是个作家,偶尔我也会因此发现语言本身的一些需要改进的缺陷(举例来说,从
upvalues
到
lexical scoping
的转变是由无意义的尝试所带来的抱怨所引发的,在此书的先前的草稿里,把
upvalues
形容成是
lexical scoping
的一种)。
本书的完成必须服从语言的变化,本书在这个时候完成的原因:
<1> Lua 5.0
是一个成熟的版本
<2>
语言变得越来越大,超出了最初本书的目标。此外一个原因是我迫切的想将
Lua
介绍给大家让更多的人了解
Lua
。
0.6 感谢
在完成本书的过程中,很多人给了我极大的帮助:
Luiz Henrique de Figueiredo
和
Waldemar Celes
给了我很大的帮助,使得本书能够更好完成,
Luiz Henrique
也帮助设计了本书的内部。
Noemi Rodriguez, Andr
é
Carregal, Diego Nehab,
以及
Gavin Wraith
阅读了本书的草稿提出了很多有价值的建议。
Renato Cerqueira, Carlos Cassino, Tom
á
s Guisasola, Joe Myers
和
Ed Ferguson
也提出了很多重要的建议。
Alexandre Nakonechnyj
负责本书的封面和内部设计。
Rosane Teles
负责
CIP
数据的准备。
谢谢他们所有人。