书海网短评:
适读人群:所有业务涉及Lua的程序员。本书由Lua语言作者亲自撰写,针对Lua语言本身由浅入深地从各个方面进行了完整和细致的讲解。所有与Lua语言打交道的人均能从本书受益。本书
《Lua程序设计(第4版)》由Lua语言作者亲自撰写,针对Lua语言本身由浅入深地从各个方面进行了完整和细致的讲解。所有与Lua语言打交道的人均能从《Lua程序设计(第4版)》受益。
《Lua程序设计(第4版)》由Lua语言作者亲自撰写,针对Lua语言本身由浅入深地从各个方面进行了完整和细致的讲解。作为第4版,《Lua程序设计(第4版)》主要针对的是Lua5.3,这是《Lua程序设计(第4版)》撰写时Lua语言的*新版本。作者从语言使用者的角度出发,讲解了语言基础、编程实操、高级特性及C语言API等四个方面的内容,既有Lua语言基本数据类型、输入输出、控制结构等基础知识,也有对模块、闭包、元表、协程、延续、反射、环境、垃圾回收、函数式编程、面向对象编程、C语言API等高级特性的系统讲解,还有对Lua5.3中引入的整型、位运算、瞬表、延续等新功能的细致说明。
RobertoIerusalimschy是Lua语言的首席架构师,从1993年Lua语言诞生起即进行Lua语言的开发工作,目前是巴西PUC-Rio(thePontificalCatholicUniversityofRiodeJaneiro)大学计算机科学专业的一名助理教授,主要从事编程语言的设计和实现工作。
梅隆魁,2013.4至今就职于中国民生银行总行信息科技部,擅长于Java企业级开发、嵌入式系统/软硬件、安卓逆向等方向,同时,对新技术也一直保有热情。
Lua是一门经过精心设计、足够精简的编程语言。作为嵌入式语言,它非常小巧,又可以方便地和C代码交互,是一门非常好的开源语言。基于这个优势,我们可以看到Lua在游戏、Web开发、人工智能等众多领域被广泛使用:以C等语言实现接口明确的高性能基础设施,用Lua支撑更具弹性的应用层。
要用好任何一门语言,都需要熟悉这门语言在多年使用中总结出来的惯用法。过去,我们也将这些惯用法称为设计模式,但这个称谓忽略了模式和语言本身的紧密联系。各流行编程语言并无绝对的优劣,也不能说哪一门语言性能更高或更容易解决问题,语言之间的区别多在于其适用领域以及程序员能否正确使用。《Lua程序设计(第4版)》正是Lua语言的发明者亲自传授Lua语言惯用法的书籍。对于Lua开发者而言,值得一读。
——游戏行业知名博主
云风(https://blog.codingnow.com)
在Redis的开发中,我常常使用Lua,它作为一把“瑞士军刀”,扩展实现了许多Redis自身API无法充分支持的功能。而对于Lua语言自身的学习,这本《Lua程序设计(第4版)》则能更好地帮助我进行Lua程序开发与调试。
——中国民生银行大数据工程师
《Redis4.xCookbook(中文版)》作者
黄鹏程
从事游戏安全研究的相关人员应该对Lua语言并不陌生,其简明、轻量、灵活、嵌入的特性使其在游戏领域占据了相当重要的地位。无论是端游、手游还是页游,有关Lua字节码的安全对抗时刻在上演,掌握Lua语言的基础则是这一切对抗技术的基础,而《Lua程序设计(第4版)》正是学习Lua语言的*二之选。
——看雪学院创始人,《加密与解密》作者
段钢
Lua是一门小而精的嵌入式语言,一个完整的Lua解释器不过200KB,与Python、Perl之类的脚本语言相比,Lua先天地更加适合嵌入式应用场景。无论是嵌入式实时操作系统还是嵌入式Linux,无论是路由器等典型的传统嵌入式设备还是物联网设备等,都在大量使用Lua语言。从语言的实现、原理、设计哲学等角度看,Lua也非常适合作为高校开展有关编译原理、虚拟机、脚本引擎等课程的教学素材。《Lua程序设计(第4版)》系统地讲解了有关Lua语言的方方面面,由Lua语言作者亲自撰写,是学习和使用Lua语言的好读物。
——北京邮电大学软件学院院长
邝坚
在我过往的工作经历中,有很长一段时间都在使用Lua语言,无奈的是一直没有找到系统介绍Lua的中文书籍。幸而《Lua程序设计(第4版)》出版了,相信这《Lua程序设计(第4版)》很快会成为游戏程序员的Lua开发利器。
——游戏行业资深程序员,《QQ炫舞》、《捕鱼达人》制作者
贾朝辉
与Lua语言结缘还是在OpenWRT的LuCI开发中。《Lua程序设计(第4版)》让我更加了解Lua语言的魅力,让我对KOS系统UI界面的开发更加得心应手。《Lua程序设计(第4版)》作为官方参考书籍,囊括了Lua语言各方面的丰富实例,便于新手入门。
——知名国产路由器操作系统KOS系统架构师
向俊霖
Lua语言是一门简单、高效的嵌入式脚本语言,非常适合与C/C++相互调用,在游戏开发、数据库插件、安全系统中均有广泛的应用。《Lua程序设计(第4版)》系统性地对Lua语言进行了介绍,译者倾注了大量心力来翻译此书,相信对中国开发者有很大的帮助。
——GrowingIO资深软件架构师
刘华清
第1部分语言基础1
1Lua语言入门2
1.1程序段3
1.2一些词法规范5
1.3全局变量7
1.4类型和值7
1.4.1nil8
1.4.2Boolean8
1.5独立解释器10
1.6练习12
2小插曲:八皇后问题13
2.1练习15
3数值17
3.1数值常量17
3.2算术运算19
3.3关系运算21
3.4数学库21
3.4.1随机数发生器22
3.4.2取整函数22
3.5表示范围24
3.6惯例25
3.7运算符优先级26
3.8兼容性27
3.9练习28
4字符串30
4.1字符串常量31
4.2长字符串/多行字符串33
4.3强制类型转换34
4.4字符串标准库36
4.5Unicode编码39
4.6练习41
5表43
5.1表索引44
5.2表构造器46
5.3数组、列表和序列48
5.4遍历表50
5.5安全访问52
5.6表标准库53
5.7练习54
6函数56
6.1多返回值58
6.2可变长参数函数61
6.3函数table.unpack64
6.4正确的尾调用65
6.5练习66
7输入输出68
7.1简单I/O模型68
7.2完整I/O模型72
7.3其他文件操作74
7.4其他系统调用75
7.4.1运行系统命令75
7.5练习77
8补充知识78
8.1局部变量和代码块78
8.2控制结构80
8.2.1ifthenelse81
8.2.2while81
8.2.3repeat82
8.2.4数值型for82
8.2.5泛型for83
8.3break、return和goto84
8.4练习88
第2部分编程实操90
9闭包91
9.1函数是第一类值92
9.2非全局函数94
9.3词法定界96
9.4小试函数式编程100
9.5练习103
10模式匹配105
10.1模式匹配的相关函数105
10.1.1函数string.find105
10.1.2函数string.match106
10.1.3函数string.gsub107
10.1.4函数string.gmatch107
10.2模式108
10.3捕获112
10.4替换114
10.4.1URL编码.116
10.4.2制表符展开118
10.5诀窍119
10.6练习123
11小插曲:出现频率最高的单词124
11.1练习126
12日期和时间128
12.1函数os.time129
12.2函数os.date130
12.3日期和时间处理132
12.4练习134
13位和字节135
13.1位运算135
13.2无符号整型数136
13.3打包和解包二进制数据139
13.4二进制文件142
13.5练习144
14数据结构145
14.1数组146
14.2矩阵及多维数组146
14.3链表149
14.4队列及双端队列150
14.5反向表151
14.6集合与包152
14.7字符串缓冲区154
14.8图形156
14.9练习158
15数据文件和序列化159
15.1数据文件160
15.2序列化162
15.2.1保存不带循环的表165
15.2.2保存带有循环的表167
15.3练习169
16编译、执行和错误171
16.1编译171
16.2预编译的代码175
16.3错误177
16.4错误处理和异常179
16.5错误信息和栈回溯180
16.6练习182
17模块和包184
17.1函数require185
17.1.1模块重命名187
17.1.2搜索路径188
17.1.3搜索器190
17.2Lua语言中编写模块的基本方法190
17.3子模块和包193
17.4练习194
第3部分语言特性196
18迭代器和泛型for197
18.1迭代器和闭包197
18.2泛型for的语法200
18.3无状态迭代器201
18.4按顺序遍历表203
18.5迭代器的真实含义205
18.6练习206
19小插曲:马尔可夫链算法208
19.1练习211
20元表和元方法212
20.1算术运算相关的元方法213
20.2关系运算相关的元方法216
20.3库定义相关的元方法217
20.4表相关的元方法219
20.4.1__index元方法219
20.4.2__newindex元方法220
20.4.3具有默认值的表221
20.4.4跟踪对表的访问.222
20.4.5只读的表.224
20.5练习225
21面向对象(Object-Oriented)编程226
21.1类(Class)228
21.2继承(Inheritance).230
21.3多重继承(MultipleInheritance)232
21.4私有性(Privacy)235
21.5单方法对象(Single-methodObject)237
21.6对偶表示(DualRepresentation)238
21.7练习240
22环境(Environment)241
22.1具有动态名称的全局变量242
22.2全局变量的声明243
22.3非全局环境246
22.4使用_ENV248
22.5环境和模块251
22.6_ENV和load252
22.7练习254
23垃圾收集255
23.1弱引用表.255
23.2记忆函数(MemorizeFunction)257
23.3对象属性(ObjectAttribute)259
23.4回顾具有默认值的表260
23.5瞬表(EphemeronTable)261
23.6析构器(Finalizer)262
23.7垃圾收集器266
23.8控制垃圾收集的步长(Pace)267
23.9练习268
24协程(Coroutine)270
24.1协程基础.270
24.2哪个协程占据主循环273
24.3将协程用作迭代器276
24.4事件驱动式编程.279
24.5练习284
25反射(Reflection)285
25.1自省机制(IntrospectiveFacility)286
25.1.1访问局部变量288
25.1.2访问非局部变量289
25.1.3访问其他协程291
25.2钩子(Hook)292
25.3调优(Profile)293
25.4沙盒(Sandbox)296
25.5练习300
26小插曲:使用协程实现多线程301
26.1练习306
第4部分C语言API307
27C语言API总览308
27.1第一个示例309
27.2栈312
27.2.1压入元素313
27.2.2查询元素314
27.2.3其他栈操作317
27.3使用CAPI进行错误处理320
27.3.1处理应用代码中的错误320
27.3.2处理库代码中的错误321
27.4内存分配322
27.5练习324
28扩展应用325
28.1基础知识325
28.2操作表327
28.2.1一些简便方法331
28.3调用Lua函数333
28.4一个通用的调用函数334
28.5练习338
29在Lua中调用C语言339
29.1C函数339
29.2延续(Continuation)342
29.3C模块345
29.4练习347
30编写C函数的技巧349
30.1数组操作349
30.2字符串操作351
30.3在C函数中保存状态355
30.3.1注册表355
30.3.2上值358
30.3.3共享的上值(Sharedupvalue)361
30.4练习362
31C语言中的用户自定义类型363
31.1用户数据(Userdata)364
31.2元表(Metatable)367
31.3面向对象访问370
31.4数组访问372
31.5轻量级用户数据373
31.6练习375
32管理资源376
32.1目录迭代器376
32.2XML解析器380
32.3练习390
33线程和状态392
33.1多线程392
33.2Lua状态397
33.3练习406
推荐序一
Lua这种类似于“胶水”的语言在游戏行业被广泛应用。我已经在游戏行业摸爬滚打了很多年,对游戏行业的变化之快深有体会:游戏策划时常更改设计是行业特点,工程师必须把“不要写死,要能热更”这句话刻在心里。因此在做开发时,大家喜欢把逻辑放在Lua这种嵌入型语言中,一方面是因为Lua性能好,另一方面主流引擎都支持通过推送Lua脚本来实现热更新,这样在修改Bug或者更新内容时,用户就不需要重新下载整个游戏安装包。并且Lua上手难度不高,所以很多初入游戏行业的程序员往往先学Lua。但是,Lua的中文学习资料很有限,社区上的知识比较零碎,为数不多的英文书翻译本也质量平平或其中所讲的版本已经过时,增加了初学者系统学习Lua的难度。所以,现在我们手中的这本用心打磨的译本,无疑是初学者的福音。翻译一本有用的但不蹭热点的书,就像我们开发一款源自内心的喜爱却不跟风的游戏,也许不会成为爆款,但是总会对得起自己,也总能收获一群用户的喜爱。这本《Lua程序设计(第4版)》,体现了译者的“傻劲”——不追捧热点、专注自己想做的事情。这种“傻劲”是这个时代稀缺的。然而读者也好,游戏用户也好,往往就喜欢这种“傻人”和他们的“傻劲”,我真心希望这样的“傻人”“傻劲”能多一些。译者还计划要做一个Lua的社区,欢迎大家关注,也欢迎推荐给身边的朋友,独乐乐不如众乐乐。最后,开卷有益,祝大家学习愉快。
焦洋盖娅互娱CTO
推荐序二
这几年来,由于阅读Lua虚拟机实现源码的缘故,我深入了解了Lua的很多内部实现原理。Lua作为一门诞生已经超过20年的语言,在设计上是非常克制的,以Lua5.1.4版本来说,这个版本是Lua发展了十几年之后稳定使用了很长时间的版本,其解释器加上周边的库函数等不过就是一万多行的代码。在设计上,Lua语言从一开始就把简单、高效、可移植、可嵌入、可扩展等作为自己的目标。打一个可能不是太恰当的比方,Lua语言专注于做一个配角,作为胶水语言来辅助像C、C++这样的主角来更好地完成工作,当其他语言在前面攻城拔寨时,Lua语言在后方实现自己辅助的作用。现在大部分主流编程语言都在走大而全的路线,在号称学会某一门语言就能成为所谓的“全栈工程师”的年代,Lua语言始终恪守本分地做好“胶水语言”的本职工作,不得不说是一个异类的存在。“上善若水,水善利万物而不争”,这大概是我能想到的最适合用于来描述Lua语言设计哲学的句子。然而,我发现想找到一本关于Lua语言本身设计相关的书籍却很难。打开任何一个电商网站,以关键字“Lua”来进行搜索,能找到的相关书籍大多是如何基于Lua做应用开发,如游戏、OpenResty等。在2008年,国内曾引进并翻译了《Lua程序设计(第2版)》。然而,这一《Lua程序设计(第4版)》已经绝版不再印刷,而且Lua在这些年里也发生了不少的变化,从当时的5.1版本到了现在的5.3版本,也在更多领域有了广泛的应用。此时,引进并且翻译最新版本的《Lua程序设计(第4版)》就显得很有必要了。推荐那些常年要与Lua打交道的应用开发者都读一下这本由Lua创作者亲自编写的《Lua程序设计(第4版)》,系统了解一下这门精致的语言,这不但对于深入理解并且使用好Lua有帮助,同时其设计哲学和思想也能在某种程度上开阔我们的视野。
Codedump《Lua设计与实现》作者
译者序
2016年2月,时年27岁的我因春节期间暴饮暴食导致急性胰腺炎入院治疗两个余月。当真正别无选择地终日躺在病床上时,就似乎不可避免地开始面对和尝试回答那个亘古不变的问题:“假设有一天我死了,究竟能够留下什么?”Lua语言从1993年诞生至今已20余年,是开源嵌入式脚本语言领域中一门独树一帜的语言,在包括嵌入式、物联网、游戏、游戏外挂、软件安全、逆向工程等领域中均具有不可替代的重要地位和极为广泛的应用。截至2017年7月,Lua语言在IEEESpectrum编程语言排行榜中名列第21位(http://spectrum.ieee.org/static/interactive-the-topprogramming-languages-2017),在TIOBE排行榜中名列第27位(TheTIOBEProgrammingCommunityindex,https://www.tiobe.com/tiobe-index)。近年来,除了游戏领域典型的应用外,包括Redis、Nginx/OpenResty、NMAP、WOW、OpenWRT、PhotoShop等大量的著名产品也均使用Lua作为其嵌入式脚本引擎,以供开发者进行功能扩展和二次开发等。伴随着移动互联网、DevOps等的迅猛发展,Lua语言在包括热更新、不停机部署等的实现方面也提供了一种现实的解决方案(例如银行等金融应用中某些采用C语言编写的性能密集型核心交易逻辑)。在Lua语言多年的发展过程中,也有大量的第三方机构对Lua语言进行了多方面的改进和增强,诸如LuaJIT等的发展也十分迅速。除了语言本身的使用外,从语言的实现、原理、设计哲学等角度看,Lua语言也是学习编译原理、虚拟机、脚本引擎等的重要参考和现实依据,可以成为相关领域教科书式的典范,在国外也一直是部分高校计算机专业开展相关课程时的重要学习对象之一。在游戏领域,深入学习Lua语言后进行消化、吸收、优化、重构、增强甚至基于Lua语言的思想重新开发一种脚本语言或一个脚本引擎的例子屡见不鲜;在软件安全领域,基于虚拟机的思想设计出的各类混淆、VM保护产品更是有无数的先例;在各种灰色产业中,Lua语言也同样扮演了更加鲜为人知的重要角色。我在研究生期间学习嵌入式和游戏逆向领域的过程中涉猎了Lua语言,之后由于在工作中需要编写Nginx和Redis的Lua脚本(Redis的Lua脚本在原子性、执行效率等方面具有显著优势)才开始对Lua语言进行深入的学习。然而,在学习Lua语言的过程中,我发现国内对Lua语言的应用仍主要集中在传统的游戏领域,市面上有限的几本在售书籍也主要针对Lua语言在游戏开发中的使用,并没有一《Lua程序设计(第4版)》从语言本身的维度进行系统性介绍。目前网络上的各类中文资料、教程、手册也大多是碎片化的,而且面向的还主要是Lua语言的陈旧版本。对于有一定专业素养的从业人员而言,通常可以通过文档或速成式的教程在数天或数周内基本掌握一门语言,对于非计算机专业的开发人员或一般使用者则会难些。但我认为即便只考虑专业从业者,也需要一本权威、系统且工具性的书籍对Lua语言进行全面的介绍,以帮助实现低成本地快速学习和快速上手。此外,从事游戏逆向等软件安全领域的人士也有快速建立对Lua语言认知甚至进行深入学习的必要。2006年左右,《Lua程序设计(第4版)》的英文第2版出版后,国内出版了其中文译本,但至今已经超过10年,且《Lua程序设计(第4版)》的英文第3版也已经对《Lua程序设计(第4版)》的内容进行了重大重构,最新的Lua5.3也发生了较大的变化,因此之前的中文第2版和网络上流传的影印版PDF均已经不能满足读者现有的需求。在这样的情况下,加上机缘的巧合,我于2016年11月开始与电子工业出版社博文视点的符隆美编辑一起联系了远在巴西的Lua语言的作者,并最终从国内诸多出版商和译者中杀出重围,艰难地争取到了作者的翻译版授权。目前Lua语言在国内的发展不像Python语言、R语言等为人熟知,也不似Go语言等站在风口浪尖,但Lua语言在国外却一直保持着持续性的演进,在过去20年间表现出了极为强大的生命力(随便举一个嵌入式领域OpenWrt路由器操作系统的例子,目前在各大主流路由器品牌或KOS/小博无线等商业WIFI服务商中均扮演着不可替代的重要作用)。我相信,尽管略显小众,译文中也难免有值得商榷之处,这样一本针对Lua语言最新版本的权威、系统性的中文译本都应该能够为游戏、嵌入式、物联网、逆向工程、软件安全、移动互联网、C语言核心系统开发工程师等诸多领域的学生、爱好者和从业人员提供些许帮助——而这也是我作为一名计算机行业从业人员的愿望。在开始《Lua程序设计(第4版)》的翻译工作前,我自诩具有尚可的文字感知和表达能力,在多年的学习和工作中也阅读过计算机行业多个不同领域的大量中英文文档,力图以“信、达、雅”的原则要求自己,从一名计算机行业一线从业者的角度,在尽可能正确地理解了原著英文意思后,用尽可能专业的语言进行表述,避免出现读者“感觉还不如直接去看英本原版”的情况。但是,2017年4月20日我拿到《Lua程序设计(第4版)》的部分原稿并开始着手翻译后,我发现在“信、达、雅”三者间做好平衡着实不是一件易事。受精力和能力所限,我也并未在实际生产代码中使用过原著中讲解的所有机制,所以译文中也一定会有诸多不妥、失误甚至错误,如果读者有任何意见或建议可以直接通过我的邮箱(mlkui@163.com)或QQ读者交流群(QQ群号:662640785)联系我,我会虚心接受一切批评和指正。
最后,我要感谢我的父母、妻子及亲人们多年来给予的无限关心、支持和陪伴,你们是我今天幸福生活的缔造者和组成者,也是我奋斗的根本动力和首要原因。感谢中国民生银行、中国民生银行总行信息科技部的领导和同事们,尽管他们中的一些已经离开。中国民生银行是我走上社会后的第一个工作单位,感谢他们自我2012年入行实习以来在工作和生活上给予的无限支持、认可。









