Lua - 轻巧好用的钥匙刀
Posted tms不熬夜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua - 轻巧好用的钥匙刀相关的知识,希望对你有一定的参考价值。
从去年(2020年)开始, 我主要使用 OpenResty
来做 Web 应用的开发, 不再在服务端使用 Node.js
.
这个转变最初是因为我发现有一些和运维相关的工作, 在 nginx
这一层完成起来更容易. 比如对 ip 限流, 动态配置 upstream, 配置 Websocket Server 等. 后来随着使用的深入, 更感受到 OpenResty
对开发效率的提升. OpenResty
开发 Web 应用主要使用 Lua
, 一种存在感不高, 但简单好用且使用广泛的语言.
#1. Lua 的来历?
Lua
1993年诞生在里约热内卢的天主教大学, 设计者是计算机图形学研究组的 Roberto Ierusalimschy, Luiz Henrique de Figueiredo 和 Waldemar Celes. 葡萄牙语的名字真难认啊, 另外 Lua
在葡萄牙语里是月亮的意思.
Lua
的设计思路, 发表在94年巴西软硬件研讨会上的一篇论文 The design and implementation of a language for extending applications (设计和实现一种用于扩展应用程序的语言)上. 从论文名字就看得出来, Lua 设计的目标是作为应用程序的扩展, 是一个辅助的角色.
那时候还没有 Java
, 网络也还没有兴起, 编程广泛使用的语言是 C/C++
. 编译完了装在机器上, 开发就结束了, 如果用户觉得不满意要改需求, 就得让开发人员改代码之后重新编译和安装, 非常麻烦. Lua
可以让程序跑起来之后做一些个性化的配置, 也能让用户自定义一些宏和脚本, 这样就方便很多. 当时人们也考虑过用 Lisp
或者 Shell
来做动态配置, 但 Lisp
和 Shell
的语法都不够简单, 尤其对于非专业人员来说, 使用并不方便.
Lua
在设计时有两个最主要的要求, 一是要和应用程序双向通信, 另一个是要足够简单.
为了和外部的应用程序通信, Lua
直接设计了两个类型: Cfunction
和 userdata
.
Cfunction
顾名思义是指 C
的函数, userdata
则是一个 void*
的 C
指针. Lua
从类型上就设计得方便和 C
语言通信. 为了简单好用, Lua
更是把类型系统设计得极为简单, 除了 Cfunction
和 userdata
之外, 就只有 nil
, number
, string
, function
和 table
5种类型.
#2. Lua 有什么特别的地方?
Lua
的数据类型设计得极其轻量. 所有的变量都是用 struct
(结构体)实现的:
struct Variable {
int type;
union data;
}
number
的值直接存到 union
里, string
是一个指向字符数组的指针, function
是一个指向 bytecode
数组的指针, Cfunction
和 userdata
直接是 C
的指针. table
是按 hashtable
实现的, 不过如果 table
只有数字索引, 那么会按 array
实现.
Lua
的垃圾回收是标准的 mark-and-sweep 算法, 从全局对象_G
开始做标记, 最后不可达的变量会被回收.
Lua
的设计, 最大的特点就是简单. 这样的设计让 Lua
小巧轻便, 执行也快速灵活. 在解释型语言里, 即使不考虑 JIT
, Lua
也可以说是最快的之一.
#3. Lua 用在哪些领域? 用得人多吗?
Lua
确实做到了它的设计目标, 在各个嵌入式场景(比较典型的是游戏)都可以看到它的应用.
比如云原生的 API 网关 Kong
, 高性能的 Web 平台 OpenResty
, 最流行的 no-sql 数据库 Redis
, 图片处理软件Adobe Photoshop Lightroom
, 国内最流行的 2D 游戏引擎Cocos2d
, C++
的 web server lighttpd
, RedHat 的软件包工具 RPM
, 著名的游戏 World of Warcraft (魔兽世界), 愤怒的小鸟...
用得人不少, 但没什么人会主动去说, 毕竟 Lua
不是 C++
和 Java
那样的通用型编程语言, 只是一个工具语言. 类似于武侠世界里, 江湖上的人都会带把短刀防身, 但没人会说自己专门用短刀, 报名号时都是自称剑侠刀客.
#4. Lua 的短板?
Lua
最大的短板是生态.
Lua
是大学研究的产出, 后续虽然开源在 Github 上, 但并没有专门的组织来负责维护它的语言标准, 导致 Lua
的更新缺乏与社区的互动, 和工业界有些脱节.
和工业界脱节的直接后果就是语言版本的割裂. Lua
目前最新的官方版本是5.4.2
, 但实际使用时5.1
, 5.2
,5.3
都有人用, 并且很多人意识不到版本区别带来的影响. 没有官方组织维护还意味着包管理器的缺失, 目前用得最多的包管理器 LuaRocks
也是社区的产物, 并且软件包也受到语言版本割裂的影响, 导致有时候不大容易找到合用的软件包.
和工业界脱节还导致了语言实现的分化. 比如现在用得最多的即时编译器 LuaJIT
并不是官方出品, OpenResty
也维护着自己的 LuaJIT
.
#5. Lua 的未来?
Lua
在编程语言的热度榜单上, 常年位于一个非主流但并不边缘的位置, 每年的排名都是30多, 非常稳定. 说明它确实有它的应用场景, 而且每年都能吸引一定数量的新人来学习.
Lua
的定位非常清晰, 就是做一个轻量可移植的, 方便和主程序通信的, 语法简单的辅助型脚本语言. 系统里确实需要这样一个功能型的语言, 所以Lua
的未来也很清晰: 不会大红大紫, 但是一定会长期占据稳定的一席之地.
#6. 和别的语言比较?
Lua
比几乎所有的主流语言都要小巧, 轻量, 简单, 自然功能上也就没有那么强大而全面. Lua
不能做为核心角色, 但却是顶级的辅助. 在和主要环境配合好的情况下, 可以极大的提高开发效率, 典型的是和 C/C++
配合. 对其他语言来说, Lua
并不是他们的竞争对手, 而是一个有力的伙伴. Lua
最直观的比较对象是 JS
, 它和 JS
有很多相似之处.
#7. 为什么要安利 Lua?
因为 Lua
基本对所有人都有用, 甚至是没有编程经验的人.
高性能的 Web 平台 OpenResty
, 高生产效率的游戏引擎 Cocos2d
, 以及系统运维方面的小技巧, 后续的这些文章中都还会用到 Lua
.
另外, Lua
本身是大学研究的产物, 从中可以学习到非常多的理论知识. LuaJIT
的实现本身就是一门精简的即时编译教程, OpenResty
的实现, 本身就是一个 Nginx C
扩展的范例. 因此 Lua
也是一个非常好的研究对象, 值得学习.
以上是关于Lua - 轻巧好用的钥匙刀的主要内容,如果未能解决你的问题,请参考以下文章