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 来做动态配置, 但 LispShell 的语法都不够简单, 尤其对于非专业人员来说, 使用并不方便.


Lua 在设计时有两个最主要的要求, 一是要和应用程序双向通信, 另一个是要足够简单.


为了和外部的应用程序通信, Lua 直接设计了两个类型: Cfunctionuserdata


Cfunction 顾名思义是指 C 的函数, userdata 则是一个 void*C 指针. Lua 从类型上就设计得方便和 C 语言通信. 为了简单好用, Lua 更是把类型系统设计得极为简单, 除了 Cfunctionuserdata 之外, 就只有 nil, number, string, functiontable 5种类型.


#2. Lua 有什么特别的地方?


Lua 的数据类型设计得极其轻量. 所有的变量都是用 struct (结构体)实现的:

struct Variable { int type; union data;}

number 的值直接存到 union 里, string 是一个指向字符数组的指针, function

是一个指向 bytecode 数组的指针, Cfunctionuserdata 直接是 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 - 轻巧好用的钥匙刀的主要内容,如果未能解决你的问题,请参考以下文章

几个轻巧好用的IDEA插件,基本上一站式开发了!

openresty 用啥ide

vim配置IDE,下载压缩包即拥有轻巧且强大的文本编辑器

openresty编写代码怎么用命令启动和执行

好用的编Lua Ide

Lua编辑工具汇总