<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Lua on chengzhycn&#39;s blog</title>
		<link>https://blog.jinzhi.site/tags/lua/</link>
		<description>Recent content in Lua on chengzhycn&#39;s blog</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Sun, 14 Sep 2025 23:45:28 +0800</lastBuildDate>
		
			<atom:link href="https://blog.jinzhi.site/tags/lua/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Lua：Table 浅析</title>
				<link>https://blog.jinzhi.site/posts/2025-09/luatable-%E6%B5%85%E6%9E%90/</link>
				<pubDate>Sun, 14 Sep 2025 23:45:28 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2025-09/luatable-%E6%B5%85%E6%9E%90/</guid>
				<description>&lt;p&gt;本文的分析基于 OpenResty 的 Lua 分支（https://github.com/openresty/luajit2）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;核心-api&#34;&gt;核心 API&lt;/h2&gt;&#xA;&lt;p&gt;table 的 API 定义在 src/lib_table.c 中，API 分为三个部分：&lt;/p&gt;&#xA;&lt;p&gt;标准库函数：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;table.insert() - 向 table 插入元素&lt;/li&gt;&#xA;&lt;li&gt;table.remove() - 移除 table 元素&lt;/li&gt;&#xA;&lt;li&gt;table.concat() - 连接 table 元素为字符串&lt;/li&gt;&#xA;&lt;li&gt;table.sort() - 对 table 进行排序&lt;/li&gt;&#xA;&lt;li&gt;table.maxn() - 找到 table 中最大数字键&lt;/li&gt;&#xA;&lt;li&gt;table.move() - 移动 table 元素&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;LuaJIT 扩展函数：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;table.new() - 预分配指定大小的 table&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;OpenResty 扩展函数：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;table.clear() - 清空 table 内容&lt;/li&gt;&#xA;&lt;li&gt;table.clone() - 克隆 table&lt;/li&gt;&#xA;&lt;li&gt;table.nkeys() - 获取 table 键的数量&lt;/li&gt;&#xA;&lt;li&gt;table.isarray() - 检查是否为数组&lt;/li&gt;&#xA;&lt;li&gt;table.isempty() - 检查 table 是否为空&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;数据结构&#34;&gt;数据结构&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;TValue&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;         &lt;span class=&#34;c1&#34;&gt;// 值对象，必须是第一个字段&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;TValue&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;         &lt;span class=&#34;c1&#34;&gt;// 键对象&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;MRef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;          &lt;span class=&#34;c1&#34;&gt;// 哈希链指针&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#if !LJ_GC64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;MRef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;freetop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;// 32位架构下的空闲节点顶部指针(存储在node[0])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GCtab&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;GCHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;           &lt;span class=&#34;c1&#34;&gt;// GC 通用头部：nextgc, marked, gct&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;uint8_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nomm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;// 元方法负缓存掩码&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;int8_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;colo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// 数组共址标记 (-1表示已分离, &amp;gt;0表示共址大小)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;MRef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;         &lt;span class=&#34;c1&#34;&gt;// 数组部分指针&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;GCRef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gclist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;// GC 链表指针&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;GCRef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;metatable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// 元表引用&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;MRef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;          &lt;span class=&#34;c1&#34;&gt;// 哈希部分指针&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;uint32_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;asize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;// 数组部分大小 [0, asize-1]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;uint32_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hmask&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;// 哈希掩码 (哈希部分大小-1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#if LJ_GC64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;MRef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;freetop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;// 64位架构下的空闲节点顶部指针&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GCtab&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到，GCtab 中同时定义了数组部分 &lt;code&gt;array&lt;/code&gt; 和哈希部分 &lt;code&gt;node&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Lua：Concurrency</title>
				<link>https://blog.jinzhi.site/posts/2025-09/luaconcurrency/</link>
				<pubDate>Mon, 01 Sep 2025 00:27:09 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2025-09/luaconcurrency/</guid>
				<description>&lt;p&gt;Lua 的并发（Concurrency）设计核心在于其轻量级、嵌入式的哲学，以及对协作式多任务的首选。它通过强大的协程机制实现并发，但本身不提供多线程/多进程的并行能力。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;多线程多进程&#34;&gt;多线程/多进程&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;核心语言无内置支持：&lt;/strong&gt; Lua 语言本身的核心 VM 被设计为&lt;strong&gt;单线程&lt;/strong&gt;执行。它不提供内置的语法或标准库来直接创建和管理线程（&lt;code&gt;std::thread&lt;/code&gt;）或进程（&lt;code&gt;fork&lt;/code&gt;）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;独立的 Lua State：&lt;/strong&gt; 一个 Lua VM 实例被称为一个“Lua State”。每个 Lua State 是完全独立的运行时环境，拥有自己的全局变量、栈、打开的文件、垃圾回收器等。它们之间默认不共享任何数据。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;宿主语言的责任：&lt;/strong&gt; 如果需要在 Lua 中实现真正的并行（多核利用），必须依赖于&lt;strong&gt;宿主语言（如 C/C++）的多线程/多进程机制&lt;/strong&gt;。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;实现方式：&lt;/strong&gt; 在宿主语言的每个线程或进程中，创建并运行一个&lt;strong&gt;独立的 Lua State&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;数据交换：&lt;/strong&gt; 这些独立的 Lua State 之间无法直接共享内存。数据交换必须通过宿主语言提供的进程间通信 (IPC) 或线程间通信 (ITC) 机制（如消息队列、共享内存、管道、套接字等）来完成。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;优点：&lt;/strong&gt; 简单安全，因为 Lua State 之间是隔离的，避免了复杂的并发同步问题。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;缺点：&lt;/strong&gt; 额外的通信开销和复杂性，且无法在单个 Lua State 内部实现并行。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;第三方库（封装）：&lt;/strong&gt; 存在一些第三方库（如 LuaLanes）试图提供在 Lua 中模拟多线程/多进程的 API。这些库通常是在底层创建独立的 Lua State，并封装了 IPC 机制，方便 Lua 开发者使用，但其本质仍然是基于宿主语言的底层能力和独立的 Lua State。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;协程&#34;&gt;协程&lt;/h2&gt;&#xA;&lt;h3 id=&#34;协程的设计与实现&#34;&gt;协程的设计与实现&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;设计理念：&lt;/strong&gt; Lua 协程是为了提供&lt;strong&gt;协作式多任务 (Cooperative Multitasking)&lt;/strong&gt; 而设计。它们允许在单个线程中实现任务的暂停和恢复，以模拟并发，而无需复杂的锁机制。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;“有栈协程” (Stackful Coroutines)：&lt;/strong&gt; Lua 协程是&lt;strong&gt;有栈的&lt;/strong&gt;。这里的“栈”指的不是操作系统的 C 语言栈，而是 Lua 虚拟机内部维护的&lt;strong&gt;Lua VM 栈&lt;/strong&gt;。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lua VM 栈：&lt;/strong&gt; 每个协程在创建时都会分配一个独立的 Lua VM 栈（或在需要时动态扩展）。这个栈存储着协程的局部变量、函数参数、中间表达式结果和函数调用上下文。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;实现机制：&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;coroutine.create(function)&lt;/code&gt;：&lt;/strong&gt; 创建一个新的协程（一个&lt;code&gt;thread&lt;/code&gt;类型的值），但并不立即执行。它会分配并初始化一个新的 Lua VM 栈。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;coroutine.yield(...)&lt;/code&gt; (保存栈)：&lt;/strong&gt; 当一个协程调用 &lt;code&gt;yield&lt;/code&gt; 时，Lua VM 会：&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;保存当前 Lua VM 栈的完整状态&lt;/strong&gt;（包括所有活跃的栈帧、局部变量值、程序计数器等）。这些信息会被存储在协程对象本身（在堆上分配）中。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;暂停当前协程的执行。&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;将控制权返回给调用 &lt;code&gt;coroutine.resume&lt;/code&gt; 的那个协程或主线程。&lt;/strong&gt; C 语言栈会正常展开，&lt;code&gt;yield&lt;/code&gt; 作为一个 C 函数正常返回。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;coroutine.resume(co, ...)&lt;/code&gt; (恢复栈)：&lt;/strong&gt; 当一个协程被 &lt;code&gt;resume&lt;/code&gt; 时，Lua VM 会：&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;从协程对象中加载并恢复其之前保存的 Lua VM 栈状态。&lt;/strong&gt; 这包括设置栈顶指针、恢复所有栈帧和程序计数器，使得协程能够从上次 &lt;code&gt;yield&lt;/code&gt; 的点继续执行。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;将控制权转移给被恢复的协程。&lt;/strong&gt; C 语言栈上会为 &lt;code&gt;resume&lt;/code&gt; 函数创建一个新的栈帧，并在其中运行被恢复的 Lua 协程。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;优点：&lt;/strong&gt; 简单、高效、避免了与 OS 栈相关的复杂性，并且由于是协作式的，没有竞态条件和锁的开销。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;缺点：&lt;/strong&gt; 无法利用多核 CPU。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;协程示例：&lt;/p&gt;</description>
			</item>
			<item>
				<title>Lua - An Overview</title>
				<link>https://blog.jinzhi.site/posts/2025-08/lua-an-overview/</link>
				<pubDate>Sun, 31 Aug 2025 13:29:48 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2025-08/lua-an-overview/</guid>
				<description>&lt;h2 id=&#34;lua-和-luajit&#34;&gt;Lua 和 LuaJIT&lt;/h2&gt;&#xA;&lt;h3 id=&#34;lua&#34;&gt;Lua&lt;/h3&gt;&#xA;&lt;p&gt;Lua 是一个开源项目，由巴西里约热内卢天主教大学的 Roberto Ierusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes 创建。它的版本控制相对简单明了。&lt;/p&gt;&#xA;&lt;h4 id=&#34;lua-的版本体系&#34;&gt;Lua 的版本体系&lt;/h4&gt;&#xA;&lt;p&gt;Lua 的版本号通常是 &lt;code&gt;X.Y&lt;/code&gt; 的形式，例如 &lt;code&gt;5.1&lt;/code&gt;, &lt;code&gt;5.2&lt;/code&gt;, &lt;code&gt;5.3&lt;/code&gt;, &lt;code&gt;5.4&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;X&lt;/code&gt; (主版本号/Major Version):&lt;/strong&gt; 表示一个&lt;strong&gt;重大更新&lt;/strong&gt;，通常会引入不兼容的更改（breaking changes），新的核心特性，或者对虚拟机架构的显著改进。从 &lt;code&gt;5.x&lt;/code&gt; 到 &lt;code&gt;5.y&lt;/code&gt;，&lt;code&gt;y&lt;/code&gt; 增加通常意味着语法、API 或语义的更改，可能需要修改现有代码。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;例子:&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lua 5.0:&lt;/strong&gt; 引入了协程 (coroutines)。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lua 5.1:&lt;/strong&gt; 引入了模块系统 (module system)、&lt;code&gt;vararg&lt;/code&gt; 参数的改进。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lua 5.2:&lt;/strong&gt; 引入了 &lt;code&gt;goto&lt;/code&gt; 语句、环境 (environments) 的重新设计、新的 &lt;code&gt;_ENV&lt;/code&gt; 上值。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lua 5.3:&lt;/strong&gt; 引入了整数类型、位操作 (bitwise operations)、UTF-8 支持。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lua 5.4:&lt;/strong&gt; 引入了新的垃圾回收器、弱表 (weak tables) 的改进。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;Y&lt;/code&gt; (次版本号/Minor Version) 或补丁版本 (Patch Version):&lt;/strong&gt; 在主版本中，通常用于表示错误修复、性能优化或次要的功能增强。这些更改通常是&lt;strong&gt;向后兼容&lt;/strong&gt;的（backward compatible），不会破坏现有代码运行。有时候，一个版本号会是 &lt;code&gt;X.Y.Z&lt;/code&gt; 的形式，&lt;code&gt;Z&lt;/code&gt; 就代表补丁版本。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;例子:&lt;/strong&gt; &lt;code&gt;Lua 5.3.1&lt;/code&gt;, &lt;code&gt;Lua 5.3.2&lt;/code&gt;, &lt;code&gt;Lua 5.3.3&lt;/code&gt; 等等。这些通常是修复 bug。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;luajit&#34;&gt;LuaJIT&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/LuaJIT/LuaJIT&#34;&gt;https://github.com/LuaJIT/LuaJIT&lt;/a&gt;&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
