<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Archive for 2025-09 on chengzhycn&#39;s blog</title>
		<link>https://blog.jinzhi.site/posts/2025-09/</link>
		<description>Recent content in Archive for 2025-09 on chengzhycn&#39;s blog</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Wed, 17 Sep 2025 21:45:28 +0800</lastBuildDate>
		
			<atom:link href="https://blog.jinzhi.site/posts/2025-09/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Go 汇编分析</title>
				<link>https://blog.jinzhi.site/posts/2025-09/go-%E6%B1%87%E7%BC%96%E5%88%86%E6%9E%90/</link>
				<pubDate>Wed, 17 Sep 2025 21:45:28 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2025-09/go-%E6%B1%87%E7%BC%96%E5%88%86%E6%9E%90/</guid>
				<description>&lt;p&gt;Go的汇编不是像 C/C++ 一样，对机器码的直接描述，而是兼容跨平台需求实现的半抽象化的指令集。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://go.dev/doc/asm&#34;&gt;https://go.dev/doc/asm&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;汇编分析go-117&#34;&gt;汇编分析（Go 1.17）&lt;/h2&gt;&#xA;&lt;p&gt;我们用一个简单的例子来开始汇编分析：&lt;/p&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#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;w&#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;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#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;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#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;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#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;w&#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;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#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;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;w&#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;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;汇编结果，删去了一些无关的输出：&lt;/p&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# go tool compile -S -l -N main.go&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;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.main STEXT &lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;54&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x0 &lt;span class=&#34;nv&#34;&gt;locals&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x18 &lt;span class=&#34;nv&#34;&gt;funcid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        TEXT    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.main&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, ABIInternal, &lt;span class=&#34;nv&#34;&gt;$24&lt;/span&gt;-0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        CMPQ    SP, 16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;R14&lt;span class=&#34;o&#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;        0x0004 &lt;span class=&#34;m&#34;&gt;00004&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0004 &lt;span class=&#34;m&#34;&gt;00004&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        JLS     &lt;span class=&#34;m&#34;&gt;47&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0006 &lt;span class=&#34;m&#34;&gt;00006&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0006 &lt;span class=&#34;m&#34;&gt;00006&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        SUBQ    &lt;span class=&#34;nv&#34;&gt;$24&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000a &lt;span class=&#34;m&#34;&gt;00010&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    BP, 16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#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;        0x000f &lt;span class=&#34;m&#34;&gt;00015&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        LEAQ    16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0014 &lt;span class=&#34;m&#34;&gt;00020&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#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;        0x0014 &lt;span class=&#34;m&#34;&gt;00020&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#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;        0x0014 &lt;span class=&#34;m&#34;&gt;00020&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVL    &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, AX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0019 &lt;span class=&#34;m&#34;&gt;00025&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVL    &lt;span class=&#34;nv&#34;&gt;$3&lt;/span&gt;, BX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x001e &lt;span class=&#34;m&#34;&gt;00030&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x001e &lt;span class=&#34;m&#34;&gt;00030&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        NOP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0020 &lt;span class=&#34;m&#34;&gt;00032&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        CALL    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#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;        0x0025 &lt;span class=&#34;m&#34;&gt;00037&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    16&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002a &lt;span class=&#34;m&#34;&gt;00042&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        ADDQ    &lt;span class=&#34;nv&#34;&gt;$24&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002e &lt;span class=&#34;m&#34;&gt;00046&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        RET&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        NOP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002f &lt;span class=&#34;m&#34;&gt;00047&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        CALL    runtime.morestack_noctxt&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#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;        0x0034 &lt;span class=&#34;m&#34;&gt;00052&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        PCDATA  &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;$-&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0034 &lt;span class=&#34;m&#34;&gt;00052&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        JMP     &lt;span class=&#34;m&#34;&gt;0&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;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add STEXT nosplit &lt;span class=&#34;nv&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;56&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x10 &lt;span class=&#34;nv&#34;&gt;locals&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x10 &lt;span class=&#34;nv&#34;&gt;funcid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        TEXT    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, NOSPLIT&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;ABIInternal, &lt;span class=&#34;nv&#34;&gt;$16&lt;/span&gt;-16&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0000 &lt;span class=&#34;m&#34;&gt;00000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        SUBQ    &lt;span class=&#34;nv&#34;&gt;$16&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0004 &lt;span class=&#34;m&#34;&gt;00004&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    BP, 8&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#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;        0x0009 &lt;span class=&#34;m&#34;&gt;00009&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        LEAQ    8&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#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;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;, gclocals·33cdeccccebe80329f1fdbee7f5874cb&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#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;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        FUNCDATA        &lt;span class=&#34;nv&#34;&gt;$5&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.add.arginfo1&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SB&lt;span class=&#34;o&#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;        0x000e &lt;span class=&#34;m&#34;&gt;00014&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    AX, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.i+24&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#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;        0x0013 &lt;span class=&#34;m&#34;&gt;00019&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    BX, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.j+32&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#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;        0x0018 &lt;span class=&#34;m&#34;&gt;00024&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:7&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    &lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.~r2&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#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;        0x0020 &lt;span class=&#34;m&#34;&gt;00032&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.i+24&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, AX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0025 &lt;span class=&#34;m&#34;&gt;00037&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        ADDQ    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.j+32&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, AX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x002a &lt;span class=&#34;m&#34;&gt;00042&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    AX, &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.~r2&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#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;        0x002e &lt;span class=&#34;m&#34;&gt;00046&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        MOVQ    8&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;SP&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, BP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0033 &lt;span class=&#34;m&#34;&gt;00051&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        ADDQ    &lt;span class=&#34;nv&#34;&gt;$16&lt;/span&gt;, SP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        0x0037 &lt;span class=&#34;m&#34;&gt;00055&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;main.go:8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        RET&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;FUNCDATA&lt;/code&gt;和&lt;code&gt;PCDATA&lt;/code&gt;是由编译器引入的，主要包含垃圾回收时使用的信息，这里略过。&lt;/p&gt;</description>
			</item>
			<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>
	</channel>
</rss>
