<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tony Bai &#187; Linux</title>
	<atom:link href="http://tonybai.com/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>https://tonybai.com</link>
	<description>一个程序员的心路历程</description>
	<lastBuildDate>Sun, 19 Apr 2026 03:13:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Kelsey Hightower 退休后的冷思考：为什么 10 年过去了，我们还在谈论容器？</title>
		<link>https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age/</link>
		<comments>https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age/#comments</comments>
		<pubDate>Thu, 22 Jan 2026 00:23:51 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[apple/container]]></category>
		<category><![CDATA[ChasingHype]]></category>
		<category><![CDATA[cloudnative]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[Context]]></category>
		<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[FinishingWork]]></category>
		<category><![CDATA[FreeBSDServiceJails]]></category>
		<category><![CDATA[InvisibleTechnology]]></category>
		<category><![CDATA[KelseyHightower]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[LargeLanguageModel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[MichaelCrosby]]></category>
		<category><![CDATA[NativeIntegration]]></category>
		<category><![CDATA[Opensource]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[PromptEngineer]]></category>
		<category><![CDATA[Standardization]]></category>
		<category><![CDATA[TsunamiCycle]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[上下文]]></category>
		<category><![CDATA[云原生]]></category>
		<category><![CDATA[原生集成]]></category>
		<category><![CDATA[完成工作]]></category>
		<category><![CDATA[容器]]></category>
		<category><![CDATA[工匠精神]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[提示词工程师]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[标准化]]></category>
		<category><![CDATA[海啸循环]]></category>
		<category><![CDATA[烂尾工程]]></category>
		<category><![CDATA[追逐热点]]></category>
		<category><![CDATA[隐形化]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=5760</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age 大家好，我是Tony Bai。 “如果你在 2014 年告诉我，十年后我们还在讨论容器，我会觉得你疯了。但现在是 2025 年，我们依然在这里，谈论着同一个话题。” 在去年中旬举行的 ContainerDays Hamburg 2025 上，早已宣布“退休”的云原生传奇人物 Kelsey Hightower 发表了一场发人深省的主题演讲。在这个 AI 狂热席卷全球的时刻，他没有随波逐流地去谈论大模型，而是回过头来，向所有技术人抛出了一个灵魂拷问： 为什么我们总是在追逐下一个热点，却从来没有真正完成过手头的工作？ 烂尾工程的诅咒——技术圈的“海啸”循环 Kelsey 首先回顾了他职业生涯中经历的三次技术浪潮：Linux 取代 Unix(AIX、Solaris等)、DevOps 的兴起、以及 Docker/Kubernetes 的容器革命。 他敏锐地指出，技术圈似乎陷入了一个无休止的“海啸循环”： 热点爆发：一个新的技术（如 Docker）出现，VC 资金涌入，所有人都在谈论它。 疯狂追逐：为了抢占市场，大家都只做“足够发布”的工作，追求速度而非完美。 未竟而散：还没等这项技术真正成熟、稳定、标准化，下一个热点（如 AI）就来了。于是，半数工程师跳船去追新热点，留下一地鸡毛。 “我们就像一群踢足球的孩子，看到球滚到哪里，所有人就一窝蜂地冲过去，连守门员都离开了球门。结果是，球门大开，后方空虚。” 这就是为什么 10 年过去了，我们还在谈论容器。因为我们当年并没有真正“完成”它。我们留下了无数的复杂性、不兼容和“企业级发行版”，却忘了初衷。 Apple 的“非性感”工作——这才是未来 在演讲中，Kelsey 分享了他最近的一个惊人发现：Apple 正在 macOS 中原生集成容器运行时。 这不是 Docker Desktop，也不是虚拟机套娃，而是操作系统级别的原生支持。这就是 GitHub 上的一个名为 apple/container 的 Apple [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2026/why-are-we-still-talking-about-containers-in-ai-age-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age">本文永久链接</a> &#8211; https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age</p>
<p>大家好，我是Tony Bai。</p>
<p>“如果你在 2014 年告诉我，十年后我们还在讨论容器，我会觉得你疯了。但现在是 2025 年，我们依然在这里，谈论着同一个话题。”</p>
<p>在去年中旬举行的 ContainerDays Hamburg 2025 上，早已宣布“退休”的云原生传奇人物 <strong>Kelsey Hightower</strong> 发表了<a href="https://www.youtube.com/watch?v=x1t2GPChhX8">一场发人深省的主题演讲</a>。在这个 AI 狂热席卷全球的时刻，他没有随波逐流地去谈论大模型，而是回过头来，向所有技术人抛出了一个灵魂拷问：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/why-are-we-still-talking-about-containers-in-ai-age-2.png" alt="" /></p>
<p><strong>为什么我们总是在追逐下一个热点，却从来没有真正完成过手头的工作？</strong></p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/distributed-system-guide-qr.png" alt="" /></p>
<h2>烂尾工程的诅咒——技术圈的“海啸”循环</h2>
<p>Kelsey 首先回顾了他职业生涯中经历的三次技术浪潮：Linux 取代 Unix(AIX、Solaris等)、DevOps 的兴起、以及 Docker/Kubernetes 的容器革命。</p>
<p>他敏锐地指出，技术圈似乎陷入了一个无休止的“海啸循环”：</p>
<ol>
<li><strong>热点爆发</strong>：一个新的技术（如 Docker）出现，VC 资金涌入，所有人都在谈论它。</li>
<li><strong>疯狂追逐</strong>：为了抢占市场，大家都只做“足够发布”的工作，追求速度而非完美。</li>
<li><strong>未竟而散</strong>：还没等这项技术真正成熟、稳定、标准化，下一个热点（如 AI）就来了。于是，半数工程师跳船去追新热点，留下一地鸡毛。</li>
</ol>
<blockquote>
<p>“我们就像一群踢足球的孩子，看到球滚到哪里，所有人就一窝蜂地冲过去，连守门员都离开了球门。结果是，球门大开，后方空虚。”</p>
</blockquote>
<p>这就是为什么 10 年过去了，我们还在谈论容器。因为我们当年并没有真正“完成”它。我们留下了无数的复杂性、不兼容和“企业级发行版”，却忘了初衷。</p>
<h2>Apple 的“非性感”工作——这才是未来</h2>
<p>在演讲中，Kelsey 分享了他最近的一个惊人发现：<strong>Apple 正在 macOS 中原生集成容器运行时。</strong></p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/why-are-we-still-talking-about-containers-in-ai-age-3.png" alt="" /></p>
<p>这不是 Docker Desktop，也不是虚拟机套娃，而是操作系统级别的原生支持。这就是 GitHub 上的一个名为 <strong>apple/container</strong> 的 Apple 开源项目：</p>
<p><img src="https://tonybai.com/wp-content/uploads/2026/why-are-we-still-talking-about-containers-in-ai-age-4.png" alt="" /></p>
<p>Kelsey 提到 contributors 中有 Docker 元老 Michael Crosby ，Michael Crosby 正在 Apple 做着这件“不性感”但极其重要的事情。</p>
<p>Kelsey 认为，这才是容器技术的<strong>终局</strong>：</p>
<ul>
<li><strong>标准化</strong>：容器运行时将成为像 TCP/IP 协议栈一样的操作系统标配，无论你是 Linux、macOS 还是 Windows。</li>
<li><strong>隐形化</strong>：你不再需要安装 Docker，不再需要关心运行时。它就在那里，像水和电一样自然。</li>
<li><strong>应用商店的重构</strong>：未来，App Store 分发的可能就是容器镜像，彻底解决依赖冲突和安全沙箱问题。</li>
</ul>
<p>这正是那些没有去追逐 AI 热点，而是选择留在“球门”前的人，正在默默完成的伟大工程。</p>
<h2>关于 AI——不要做“盲目的复制者”</h2>
<p>作为 Google 前员工，Kelsey 对 AI 并不陌生。但他对当前的 LLM 热潮保持着清醒的警惕。</p>
<p>他现场演示了一个有趣的实验：询问一个本地运行的 LLM “FreeBSD Service Jails 需要什么版本？”<br />
*   <strong>AI 的回答</strong>：FreeBSD 13（一本正经的胡说八道）。<br />
*   <strong>真相</strong>：FreeBSD 15（尚未发布）。</p>
<p>Kelsey 指出，现在的 AI 就像一个热心但糊涂的路人，它不懂装懂，只想取悦你。</p>
<p><strong>他的建议是</strong>：</p>
<ol>
<li><strong>不要迷信生成</strong>：不要因为 AI 生成了代码就直接用，就像你不会盲目复制 Stack Overflow 的代码一样。</li>
<li><strong>上下文为王</strong>：AI 不是魔法，它只是一个强大的搜索引擎。如果你想得到正确答案，你必须先给它提供正确的<strong>上下文（Context）</strong>。</li>
<li><strong>先训练自己，再训练模型</strong>：在成为“提示词工程师”之前，先成为一名合格的工程师。只有当你自己深刻理解了问题，你才能判断 AI 的回答是天才还是垃圾。</li>
</ol>
<h2>给技术人的最后忠告</h2>
<p>演讲的最后，Kelsey 回答了关于开源、职业发展和未来的提问。他的几条忠告，值得每一位技术人铭记：</p>
<ul>
<li><strong>关于职业</strong>：“你的职业生涯不应该是一场马拉松，而应该是一场<strong>接力赛</strong>。当你到达巅峰时，想的应该是如何把接力棒交给下一个人，而不是霸占着位置直到倒下。”</li>
<li><strong>关于开源</strong>：“不要被商业公司的许可证游戏迷惑。如果代码是公开的，你可以 fork，可以学习。真正的开源精神在于分享和协作，而不在于谁拥有控制权。”</li>
<li><strong>关于专注</strong>：像那家只做钳子的德国公司（Knipex）一样，专注做好一件事。技术圈不缺追风者，缺的是能够沉下心来，把一项技术打磨到极致、直到它变得“无聊”和“隐形”的工匠。</li>
</ul>
<h2>小结</h2>
<p>Kelsey Hightower 的这场演讲，是对当前浮躁技术圈的一剂清醒剂。</p>
<p>他提醒我们，技术的真正价值，不在于它有多新、多热，而在于它是否真正解决了问题，是否被<strong>完整地</strong>交付了。在所有人都在谈论 AI 的今天，或许我们更应该关注那些被遗忘的“球门”，去完成那些尚未完成的伟大工程。</p>
<p>资料链接：https://www.youtube.com/watch?v=x1t2GPChhX8</p>
<hr />
<p><strong>你的“烂尾”故事</strong></p>
<p>Kelsey 的“海啸循环”论断让人深思。在你的职业生涯中，是否也经历过这种“还没做完旧技术，就被迫去追新热点”的无奈？你认为在这个 AI 时代，我们该如何保持“工匠精神”？</p>
<p>欢迎在评论区分享你的经历或思考！让我们一起在喧嚣中寻找内心的宁静。</p>
<p>如果这篇文章让你停下来思考了片刻，别忘了点个【赞】和【在看】，并转发给那些还在焦虑中奔跑的同行！</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2026, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2026/01/22/why-are-we-still-talking-about-containers-in-ai-age/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Goroutine 栈增长机制新提案：用缺页中断替代栈检查？Rob Pike 亲自下场“劝退”</title>
		<link>https://tonybai.com/2025/11/20/proposal-improve-goroutine-stack-using-page-faults/</link>
		<comments>https://tonybai.com/2025/11/20/proposal-improve-goroutine-stack-using-page-faults/#comments</comments>
		<pubDate>Thu, 20 Nov 2025 13:13:01 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[ArsenySamoylov]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[CPU开销]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang-nuts]]></category>
		<category><![CDATA[goroutine]]></category>
		<category><![CDATA[Goroutine栈]]></category>
		<category><![CDATA[Go语言]]></category>
		<category><![CDATA[GuardPage]]></category>
		<category><![CDATA[L1iCache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[nil]]></category>
		<category><![CDATA[PageFaults]]></category>
		<category><![CDATA[POC]]></category>
		<category><![CDATA[ResizableStacks]]></category>
		<category><![CDATA[Rob Pike]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[runtime.morestack]]></category>
		<category><![CDATA[上下文切换]]></category>
		<category><![CDATA[中断处理]]></category>
		<category><![CDATA[代码体积膨胀]]></category>
		<category><![CDATA[信号处理器]]></category>
		<category><![CDATA[创始人]]></category>
		<category><![CDATA[劝退]]></category>
		<category><![CDATA[可移植性]]></category>
		<category><![CDATA[可行性]]></category>
		<category><![CDATA[复杂性]]></category>
		<category><![CDATA[大胆设想]]></category>
		<category><![CDATA[审慎权衡]]></category>
		<category><![CDATA[工程经验]]></category>
		<category><![CDATA[平衡]]></category>
		<category><![CDATA[序言]]></category>
		<category><![CDATA[性能]]></category>
		<category><![CDATA[性能提升]]></category>
		<category><![CDATA[最小栈]]></category>
		<category><![CDATA[栈增长]]></category>
		<category><![CDATA[栈检查]]></category>
		<category><![CDATA[栈检查指令]]></category>
		<category><![CDATA[概念验证]]></category>
		<category><![CDATA[物理内存消耗]]></category>
		<category><![CDATA[生命力]]></category>
		<category><![CDATA[社区]]></category>
		<category><![CDATA[缺页中断]]></category>
		<category><![CDATA[虚拟地址空间]]></category>
		<category><![CDATA[警戒页]]></category>
		<category><![CDATA[运行时]]></category>
		<category><![CDATA[非叶子函数]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=5415</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/11/20/proposal-improve-goroutine-stack-using-page-faults 大家好，我是Tony Bai。 Go 语言的 goroutine 以其轻量和高效著称，而其背后一个关键的“魔法”便是可动态增长的栈 (Resizable Stacks)。然而，支撑这个魔法的机制——在几乎每个函数入口处插入的“栈检查”指令——也并非毫无代价。 近日，在 golang-nuts 邮件组，一位名叫 Arseny Samoylov 的年轻开发者发起了一场引人深思的讨论，提出了一个颇具“革命性”的提案：我们能否借鉴 Linux 内核管理线程栈的方式，用“缺页中断”(Page Faults) 机制来取代 Go 现有的“栈检查”？ 这个旨在挑战 Go 运行时基石的大胆设想，引来了 Go 语言联合创始人 Rob Pike 的亲自下场。本文中，我们就来简单看看这个看似优雅的提案，为何会引来社区的质疑，并最终被 Rob Pike 本人以“实现过于复杂”为由，泼上一盆“冷水”。 现状的“痛点”——无处不在的“栈检查” 在深入新提案之前，我们必须先理解 Go 当前的栈增长机制及其代价。 当前，Go 编译器会在几乎每一个非叶子函数的序言 (prologue) 部分，插入几条特殊的指令。这些指令的作用是在函数开始执行前，检查当前 goroutine 的剩余栈空间是否足够。如果不足，运行时 (runtime.morestack) 就会介入：分配一个更大的新栈，将旧栈的内容复制过去，调整所有指向栈上变量的指针，然后才继续执行函数。 提案者指出的当前机制的两大痛点： CPU 开销：频繁的栈检查本身就是一种 CPU 开销，尤其是在调用链很深或存在大量无法内联的间接调用（如接口方法调用）时。 代码体积膨胀：每个函数都增加了额外的序言指令（提案者估计约 10 条指令），这会增加 L1 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/proposal-improve-goroutine-stack-using-page-faults-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/11/20/proposal-improve-goroutine-stack-using-page-faults">本文永久链接</a> &#8211; https://tonybai.com/2025/11/20/proposal-improve-goroutine-stack-using-page-faults</p>
<p>大家好，我是Tony Bai。</p>
<p>Go 语言的 goroutine 以其轻量和高效著称，而其背后一个关键的“魔法”便是<strong>可动态增长的栈 (Resizable Stacks)</strong>。然而，支撑这个魔法的机制——在几乎每个函数入口处插入的“栈检查”指令——也并非毫无代价。</p>
<p>近日，在 golang-nuts 邮件组，一位名叫 Arseny Samoylov 的年轻开发者发起了<a href="https://groups.google.com/g/golang-nuts/c/q3iZk0phN9E">一场引人深思的讨论</a>，提出了一个颇具“革命性”的提案：<strong>我们能否借鉴 Linux 内核管理线程栈的方式，用“缺页中断”(Page Faults) 机制来取代 Go 现有的“栈检查”？</strong></p>
<p>这个旨在挑战 Go 运行时基石的大胆设想，引来了 Go 语言联合创始人 <strong>Rob Pike</strong> 的亲自下场。本文中，我们就来简单看看这个看似优雅的提案，为何会引来社区的质疑，并最终被 Rob Pike 本人以“实现过于复杂”为由，泼上一盆“冷水”。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/go-testing-journey-qr.png" alt="" /></p>
<h2>现状的“痛点”——无处不在的“栈检查”</h2>
<p>在深入新提案之前，我们必须先理解 Go 当前的栈增长机制及其代价。</p>
<p>当前，Go 编译器会在几乎每一个非叶子函数的<strong>序言 (prologue)</strong> 部分，插入几条特殊的指令。这些指令的作用是在函数开始执行前，检查当前 goroutine 的剩余栈空间是否足够。如果不足，运行时 (runtime.morestack) 就会介入：分配一个更大的新栈，将旧栈的内容复制过去，调整所有指向栈上变量的指针，然后才继续执行函数。</p>
<p><strong>提案者指出的当前机制的两大痛点</strong>：</p>
<ol>
<li><strong>CPU 开销</strong>：频繁的栈检查本身就是一种 CPU 开销，尤其是在调用链很深或存在大量无法内联的间接调用（如接口方法调用）时。</li>
<li><strong>代码体积膨胀</strong>：每个函数都增加了额外的序言指令（提案者估计约 10 条指令），这会增加 L1 指令缓存 (L1i Cache) 的压力，对计算密集型任务的性能产生负面影响。</li>
</ol>
<p>基于此，提案者估计，消除栈检查可能会为真实的 Go 应用带来 <strong>3% &#8211; 5%</strong> 的性能提升。</p>
<h2>“革命”的设想——通过“缺页中断”实现栈增长</h2>
<p>Arseny Samoylov 的提案，其灵感源自现代操作系统（如 Linux）管理原生线程栈的方式。</p>
<p><strong>核心思想</strong>：</p>
<ol>
<li>在创建一个 goroutine 时，不再只分配一个很小的物理内存（当前为 2KB），而是为其预留 (reserve) 一大块<strong>虚拟地址空间</strong>（例如 8MB），但不立即分配物理内存。</li>
<li>在这块虚拟地址空间的末尾，设置一个<strong>“警戒页”(Guard Page)</strong>，标记为不可访问。</li>
<li>移除编译器插入的所有“栈检查”指令。</li>
<li>当 goroutine 的栈增长，触及到未分配的内存页时，会触发一次<strong>缺页中断 (Page Fault)</strong>。操作系统内核会捕获这个中断，并“懒惰地”为其分配一页新的物理内存。</li>
<li>当 goroutine 的栈增长到极致，最终触及到那个“警戒页”时，Go 运行时捕获这个特定的信号，<strong>此时才执行</strong>现有的栈扩容逻辑。</li>
</ol>
<p>这个设计的精妙之处在于，它将<strong>持续的、遍布每个函数的“栈检查”开销</strong>，转变成了<strong>仅在栈空间真正耗尽时才发生的一次性、代价较高的“异常处理”</strong>。</p>
<h2>社区的讨论——一场关于性能、复杂性与可行性的权衡</h2>
<p>这个看似优雅的方案，立刻引发了社区开发者的辩论。经验丰富的工程师们很快指出了这个方案背后隐藏的巨大挑战：</p>
<ol>
<li><strong>中断处理的巨大开销</strong>：Jason E. Aten 指出，处理一次缺页中断并由信号处理器接管，其过程极其缓慢。它涉及<strong>至少 4 次昂贵的上下文切换</strong>（用户态 -> 内核态 -> 信号处理器 -> 内核态 -> 用户态）。这个开销，可能远高于 Go 运行时目前高效的内存分配器。</li>
<li><strong>区分“好”与“坏”的中断</strong>：Go 运行时如何能精确地区分出，一次缺页中断是因为“栈需要正常增长”，还是因为一个真正的 Bug（如 nil 指针解引用）？这是一个极其棘手的问题。</li>
<li><strong>虚拟地址空间的消耗</strong>：虽然 64 位系统的虚拟地址空间极其巨大，但为每一个 goroutine 都预留 8MB，依然是一个不小的负担。10 万个 goroutine 将消耗 800GB 的虚拟地址空间。</li>
<li><strong>最小栈的增加</strong>：最小的物理内存分配单位是一个页（通常是 4KB）。这意味着 goroutine 的最小栈大小将从 2KB 翻倍到 4KB，对于那些拥有数百万个小 goroutine 的应用，这可能会导致<strong>物理内存消耗翻倍</strong>。</li>
</ol>
<h2>Rob Pike 的“劝退”——来自创始人的最终裁决</h2>
<p>当讨论进入白热化时，Go 语言的联合创始人 Rob Pike 亲自下场，给出了他的最终点评。他的观点，冷静而深刻，几乎为这场辩论画上了句号。</p>
<p>首先，他认为提案者<strong>夸大了“栈检查”的成本</strong>：</p>
<blockquote>
<p>“我相信你夸大了（栈检查的）成本。它是可测量的，但并没有你说的那么严重。并且，随着函数内联越来越普遍，函数的体积变大，摊销后的实际成本都在降低。”</p>
</blockquote>
<p>更重要的是，他指出了这个提案在工程上的<strong>历史困境</strong>，这正是“劝退”的核心理由：</p>
<blockquote>
<p>“此外，在过去，使用内核traps 来实现栈增长一直都问题重重。我曾见过其他系统尝试这样做，但最终都因为无法预见的复杂性而放弃了。我不是说这做不到，但这绝非易事。而且，由于细节依赖于架构和操作系统，要做到可移植性非常困难。”</p>
</blockquote>
<p>最后，他给出了一个简洁而有力的结论：</p>
<blockquote>
<p><strong>“这事不归我管，但我不会这么做。”</strong><br />
  (It&#8217;s not up to me, but I wouldn&#8217;t do this.)</p>
</blockquote>
<h2>小结：永不停歇的探索，Go 演进的生命力</h2>
<p>这场关于 goroutine 栈的“革命”提案，最终在创始人的“劝退”中似乎逐渐平息。然而，将此视为一次简单的“失败”，或许会错失其更深远的意义。</p>
<p>Rob Pike 的点评，以其数十年的工程经验和对复杂性的深刻洞察，为这个提案的技术路径亮起了警示的红灯。他指出的<strong>“无法预见的复杂性”</strong>和<strong>“难以解决的可移植性”</strong>，是任何试图修改语言运行时的工程师都必须敬畏的“冰山”。</p>
<p>然而，无论这位提案者 Arseny Samoylov 最终是选择接受劝告，还是不顾一切地继续探索并拿出概念验证 (PoC)，这场讨论本身，对 Go 社区而言，都是一件<strong>弥足珍贵的好事</strong>，它完美地体现了 Go 社区的生命力所在。</p>
<p>Go 语言的演进，正是在这种“大胆设想”与“审慎权衡”的持续张力中，稳步前行的。</p>
<p>资料链接：https://groups.google.com/g/golang-nuts/c/q3iZk0phN9E</p>
<hr />
<p>还在为“复制粘贴喂AI”而烦恼？我的新专栏 <strong>《<a href="http://gk.link/a/12EPd">AI原生开发工作流实战</a>》</strong> 将带你：</p>
<ul>
<li>告别低效，重塑开发范式</li>
<li>驾驭AI Agent(Claude Code)，实现工作流自动化</li>
<li>从“AI使用者”进化为规范驱动开发的“工作流指挥家”</li>
</ul>
<p>扫描下方二维码，开启你的AI原生开发之旅。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/ai-native-dev-workflow-qr.png" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/11/20/proposal-improve-goroutine-stack-using-page-faults/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go GUI 开发的“绝境”与“破局”：2025 年现状与展望</title>
		<link>https://tonybai.com/2025/11/03/go-gui-development-2025/</link>
		<comments>https://tonybai.com/2025/11/03/go-gui-development-2025/#comments</comments>
		<pubDate>Mon, 03 Nov 2025 08:52:44 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[amd64]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[API 笨重]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[arm64]]></category>
		<category><![CDATA[Bubbletea]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C 库]]></category>
		<category><![CDATA[C 编译器]]></category>
		<category><![CDATA[C 语言共享库]]></category>
		<category><![CDATA[C/C++ GUI 框架]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[ccgo]]></category>
		<category><![CDATA[Cgo]]></category>
		<category><![CDATA[CGO 痛点]]></category>
		<category><![CDATA[CGO 绑定流]]></category>
		<category><![CDATA[CGO 薄层]]></category>
		<category><![CDATA[cgo-free]]></category>
		<category><![CDATA[CLI/TUI]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[C代码转译流]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[FFI]]></category>
		<category><![CDATA[FFI 方案]]></category>
		<category><![CDATA[Fyne]]></category>
		<category><![CDATA[Fysion]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Go GUI 开发]]></category>
		<category><![CDATA[Go 世界]]></category>
		<category><![CDATA[Go 初学者]]></category>
		<category><![CDATA[GoBinding]]></category>
		<category><![CDATA[GoIdiomaticAPI]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GoUI]]></category>
		<category><![CDATA[GTK]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[helloworld]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[libtk9.0]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[MaterialDesign]]></category>
		<category><![CDATA[MAUI]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[PureFFI]]></category>
		<category><![CDATA[purego]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[SelfDrawing]]></category>
		<category><![CDATA[Svelte]]></category>
		<category><![CDATA[SwiftUI]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[Tcl/Tk]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[UI 开发体验]]></category>
		<category><![CDATA[UI 控件]]></category>
		<category><![CDATA[Vue]]></category>
		<category><![CDATA[Wails]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web 前端技术]]></category>
		<category><![CDATA[Web 技术流]]></category>
		<category><![CDATA[WebKit]]></category>
		<category><![CDATA[Webview]]></category>
		<category><![CDATA[WebView2]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WinForms]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[wrapper]]></category>
		<category><![CDATA[wxWidgets]]></category>
		<category><![CDATA[专业领域]]></category>
		<category><![CDATA[事件循环]]></category>
		<category><![CDATA[二进制文件]]></category>
		<category><![CDATA[云原生]]></category>
		<category><![CDATA[交叉编译]]></category>
		<category><![CDATA[交叉编译困难]]></category>
		<category><![CDATA[代码转译路径]]></category>
		<category><![CDATA[低资源占用]]></category>
		<category><![CDATA[保真度]]></category>
		<category><![CDATA[兼容性问题]]></category>
		<category><![CDATA[内存占用]]></category>
		<category><![CDATA[分发]]></category>
		<category><![CDATA[前后端逻辑]]></category>
		<category><![CDATA[前端框架]]></category>
		<category><![CDATA[功能等价]]></category>
		<category><![CDATA[动态加载]]></category>
		<category><![CDATA[动态库]]></category>
		<category><![CDATA[单一二进制文件]]></category>
		<category><![CDATA[原生 C 代码]]></category>
		<category><![CDATA[原生 GUI 框架]]></category>
		<category><![CDATA[原生 GUI 解决方案]]></category>
		<category><![CDATA[原生体验]]></category>
		<category><![CDATA[原生控件]]></category>
		<category><![CDATA[原生窗口]]></category>
		<category><![CDATA[去CGO化]]></category>
		<category><![CDATA[可维护性]]></category>
		<category><![CDATA[可读性]]></category>
		<category><![CDATA[后端]]></category>
		<category><![CDATA[后端心脏]]></category>
		<category><![CDATA[命令行工具]]></category>
		<category><![CDATA[图形用户界面]]></category>
		<category><![CDATA[外部依赖]]></category>
		<category><![CDATA[多元化]]></category>
		<category><![CDATA[学习成本]]></category>
		<category><![CDATA[完全静态]]></category>
		<category><![CDATA[官方支持]]></category>
		<category><![CDATA[展望]]></category>
		<category><![CDATA[工具链]]></category>
		<category><![CDATA[工程挑战]]></category>
		<category><![CDATA[平台原生感]]></category>
		<category><![CDATA[底层图形 API]]></category>
		<category><![CDATA[底层操作系统]]></category>
		<category><![CDATA[性能]]></category>
		<category><![CDATA[性能开销]]></category>
		<category><![CDATA[成熟工具包]]></category>
		<category><![CDATA[抽象渲染层]]></category>
		<category><![CDATA[控件实现]]></category>
		<category><![CDATA[极致功能]]></category>
		<category><![CDATA[构建依赖]]></category>
		<category><![CDATA[构建环境]]></category>
		<category><![CDATA[桌面应用]]></category>
		<category><![CDATA[桥接机制]]></category>
		<category><![CDATA[渲染机制]]></category>
		<category><![CDATA[源代码翻译器]]></category>
		<category><![CDATA[状态管理]]></category>
		<category><![CDATA[现状]]></category>
		<category><![CDATA[生态碎片化]]></category>
		<category><![CDATA[生态系统特殊性]]></category>
		<category><![CDATA[真正的 CGO-free]]></category>
		<category><![CDATA[破局]]></category>
		<category><![CDATA[破局之路]]></category>
		<category><![CDATA[社区解决方案]]></category>
		<category><![CDATA[社区驱动创新]]></category>
		<category><![CDATA[简化的构建过程]]></category>
		<category><![CDATA[纯 Go 代码]]></category>
		<category><![CDATA[组件库]]></category>
		<category><![CDATA[绑定探索]]></category>
		<category><![CDATA[绘制指令]]></category>
		<category><![CDATA[绝境]]></category>
		<category><![CDATA[维护成本高]]></category>
		<category><![CDATA[编译时]]></category>
		<category><![CDATA[编译速度慢]]></category>
		<category><![CDATA[胶水代码]]></category>
		<category><![CDATA[自动转换]]></category>
		<category><![CDATA[自绘]]></category>
		<category><![CDATA[自绘渲染流]]></category>
		<category><![CDATA[资源占用]]></category>
		<category><![CDATA[跨平台一致性]]></category>
		<category><![CDATA[转译的复杂性]]></category>
		<category><![CDATA[运行性能]]></category>
		<category><![CDATA[运行时]]></category>
		<category><![CDATA[部署]]></category>
		<category><![CDATA[部署便利性]]></category>
		<category><![CDATA[零运行时依赖]]></category>
		<category><![CDATA[非原生观感]]></category>
		<category><![CDATA[驱动层]]></category>
		<category><![CDATA[驱动适配器]]></category>
		<category><![CDATA[高性能]]></category>
		<category><![CDATA[黑魔法]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=5348</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/11/03/go-gui-development-2025 大家好，我是Tony Bai。 “Go 语言能写桌面应用吗？” 这个问题，如同一个幽灵，常年盘旋在 Go 社区的上空。作为一门在后端、云原生和命令行工具领域所向披靡的语言，Go 在图形用户界面（GUI）开发上的“短板”，一直是其支持者心中一个难以言说的痛。 长期以来，Go GUI 开发似乎陷入了一种“绝境”：缺乏官方支持、生态碎片化、方案选择困难。然而，绝境之中，总有勇敢的“破局者”。社区的力量，正以多种不同的路径，顽强地探索着 Go GUI 的未来。 本文将基于当前Go社区的最新现状，为你系统性地梳理 2025 年 Go GUI 开发的几大流派，剖析其现状、权衡其利弊，并展望未来的破局之路。 “绝境”的根源：为何 Go GUI 如此之难？ 在探讨解决方案之前，我们必须先理解问题的根源。长期以来，Go GUI 开发的困境，主要源于几个核心因素： CGO 的“原罪”：几乎所有成熟的、跨平台的 GUI 工具包（如 Qt, GTK, wxWidgets）都是用 C/C++ 编写的。在 Go 中使用它们，就必须通过 CGO。这不仅打破了 Go 引以为傲的一键交叉编译能力，还带来了复杂的构建依赖和运行时的性能开销。 缺乏“亲儿子”：与 Java 的 Swing/JavaFX、.NET 的 WinForms/WPF/MAUI、或苹果生态的 SwiftUI 不同，Go 语言官方从未推出或背书过任何一个原生的 GUI 框架。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/go-gui-development-2025-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/11/03/go-gui-development-2025">本文永久链接</a> &#8211; https://tonybai.com/2025/11/03/go-gui-development-2025</p>
<p>大家好，我是Tony Bai。</p>
<p>“Go 语言能写桌面应用吗？”</p>
<p>这个问题，如同一个幽灵，常年盘旋在 Go 社区的上空。作为一门在后端、云原生和命令行工具领域所向披靡的语言，Go 在图形用户界面（GUI）开发上的“短板”，一直是其支持者心中一个难以言说的痛。</p>
<p>长期以来，Go GUI 开发似乎陷入了一种“绝境”：缺乏官方支持、生态碎片化、方案选择困难。然而，绝境之中，总有勇敢的“破局者”。社区的力量，正以多种不同的路径，顽强地探索着 Go GUI 的未来。</p>
<p>本文将基于当前Go社区的最新现状，为你系统性地梳理 2025 年 Go GUI 开发的几大流派，剖析其现状、权衡其利弊，并展望未来的破局之路。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/paid/go-micro-column-2025-pr.png" alt="" /></p>
<h2>“绝境”的根源：为何 Go GUI 如此之难？</h2>
<p>在探讨解决方案之前，我们必须先理解问题的根源。长期以来，Go GUI 开发的困境，主要源于几个核心因素：</p>
<ol>
<li><strong>CGO 的“原罪”</strong>：几乎所有成熟的、跨平台的 GUI 工具包（如 Qt, GTK, <a href="https://wxwidgets.org/">wxWidgets</a>）都是用 C/C++ 编写的。在 Go 中使用它们，就必须通过 CGO。这不仅打破了 Go 引以为傲的一键交叉编译能力，还带来了复杂的构建依赖和运行时的性能开销。</li>
<li><strong>缺乏“亲儿子”</strong>：与 Java 的 Swing/JavaFX、.NET 的 WinForms/WPF/MAUI、或苹果生态的 SwiftUI 不同，Go 语言官方从未推出或背书过任何一个原生的 GUI 框架。</li>
<li><strong>生态的“碎片化”</strong>：由于缺乏官方引领，Go社区涌现出了大量解决方案，但它们路径各异、成熟度参差不齐，让开发者在选择时感到困惑和不安。</li>
</ol>
<h2>“破局”的四大流派：2025 年的现实选择</h2>
<p>尽管困难重重，但社区的探索从未停止。如今，Go GUI 的解决方案已逐渐演化为四大主流派系。</p>
<h3>流派一：Web 技术流 —— “曲线救国”的务实主义者</h3>
<p>这是目前社区中<strong>最受欢迎、也最成熟</strong>的路径。其核心思想是：<strong>放弃原生 GUI 渲染，转而利用成熟的 Web 前端技术（HTML/CSS/JS）来构建界面，同时将 Go 作为强大的后端“心脏”。</strong></p>
<ul>
<li><strong>代表项目</strong>：<a href="https://github.com/wailsapp/wails"><strong>Wails</strong></a>，目前稳定版是v2.x (go install github.com/wailsapp/wails/v2/cmd/wails@latest)。Star数量> 30K。</li>
<li><strong>工作原理</strong>：这类框架通过在原生窗口中嵌入一个 Webview（通常是操作系统自带的，如 macOS 的 WebKit，Windows 的 WebView2），来渲染前端界面。Go 程序在后端运行，并通过一套轻量级的桥接机制，将 Go 的函数和方法暴露给前端的 JavaScript 调用，反之亦然。</li>
</ul>
<p><strong>优点</strong>：</p>
<ul>
<li><strong>UI 开发体验极佳</strong>：你可以使用 React, Vue, Svelte 等任何你喜欢的前端框架，享受现代 Web 开发带来的丰富生态和高效体验。尤其适合既懂前端，又懂Go的小伙伴儿们。</li>
</ul>
<p><img src="https://tonybai.com/wp-content/uploads/2025/go-gui-development-2025-2.png" alt="" /></p>
<ul>
<li><strong>完全摆脱 CGO</strong>：由于 Webview 是系统原生组件，整个构建过程是纯 Go 的，完美保留了 Go 的交叉编译优势。</li>
<li><strong>前后端逻辑清晰分离</strong>。</li>
</ul>
<p><strong>缺点</strong>：</p>
<ul>
<li><strong>资源占用</strong>：相比原生 GUI，Webview 会带来更高的内存占用。一个简单的“Hello World”应用，内存占用可能达到 100-200MB。</li>
<li><strong>非原生体验</strong>：虽然可以做到高度相似，但 UI 的外观和交互细节，终究与操作系统原生的控件有所差异。</li>
</ul>
<p>对于绝大多数需要构建现代化、美观界面的桌面应用，<strong>Wails 是当前 Go 社区的首选方案</strong>。它以可接受的资源开销，换来了无与伦比的开发效率和生态优势。</p>
<h3>流派二：自绘渲染流 —— Fyne 引领的“原生 Go-UI”探索</h3>
<p>这一流派的追求最为“纯粹”和“雄心勃勃”：<strong>在 Go 语言中，从头开始构建一套完整的、跨平台的 GUI 工具包。</strong> 它的核心思想不是去“绑定”一个现有的 C/C++ 框架，成为一个Go binding/wrapper，而是直接站在底层图形 API 的肩膀上，“自绘” (self-drawing) 所有的 UI 控件。这一流派的代表项目是<a href="https://github.com/fyne-io/fyne"><strong>Fyne</strong></a>。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/go-gui-development-2025-3.png" alt="" /></p>
<p>Fyne 的工作模式与 Web 技术流截然不同，它更接近于现代游戏引擎的渲染机制。其核心可以概括为以下几步：</p>
<ol>
<li>
<p><strong>Go 世界的 UI 描述</strong>：开发者完全使用 Go 语言来定义 UI 的结构。你通过创建 widget.NewLabel, widget.NewButton 等对象，并将它们组合在 container.NewVBox, container.NewHBox 等布局容器中，来构建你的界面树。</p>
</li>
<li>
<p><strong>抽象渲染层</strong>：Fyne 内部拥有一套名为 “Canvas” 的抽象渲染接口。当 UI 树需要被绘制时，Fyne 会将其转换为一系列与平台无关的绘制指令（如“在这里画一个矩形”、“在那里渲染一段文本”）。</p>
</li>
<li>
<p><strong>驱动层与 CGO “薄层”</strong>：这是 Fyne 与底层操作系统交互的关键。Fyne 为每个平台都实现了一个<strong>驱动 (Driver)</strong>。这个驱动的核心职责，就是将上一步中抽象的绘制指令，“翻译”成特定平台图形 API 的调用。这个“翻译”过程，正是 Fyne <strong>使用 CGO 的地方</strong>。</p>
<ul>
<li>在桌面端，它通过 CGO 调用 <strong>OpenGL</strong>（这是一个跨平台的图形标准）。</li>
<li>在移动端，它可能会调用 Android/iOS 的原生图形接口。</li>
</ul>
</li>
<li>
<p><strong>事件循环</strong>：Fyne 在后台运行一个事件循环，负责监听来自操作系统的事件（如鼠标点击、键盘输入、窗口大小改变），并将这些事件分发到 Go 世界中对应的控件上，触发你在 Go 代码中定义的响应逻辑。</p>
</li>
</ol>
<p>与<strong>CGO 绑定流</strong>（如 therecipe/qt）的UI 的所有核心逻辑——渲染、布局、事件循环——都发生在<strong>C++ 世界</strong>不同，Fyne几乎 100% 的 UI 逻辑、状态管理和控件实现，都发生在 Go 的世界里。CGO 在这里扮演的仅仅是一个薄薄的、与 GPU 对话的“驱动适配器”。</p>
<p><strong>优点</strong></p>
<ul>
<li><strong>Go-idiomatic API</strong>：Fyne 的 API 设计遵循 Go 的语言习惯，开发者可以像编写普通 Go 程序一样来构建 UI，心智负担较低。</li>
<li><strong>极致的跨平台一致性</strong>：由于所有控件都是 Fyne 自己绘制的，一个用 Fyne 编写的应用，在 Windows, macOS, Linux, Android, iOS 等所有平台上，都拥有<strong>完全一致</strong>的外观和行为。</li>
<li><strong>简化的构建过程</strong>：尽管使用了 CGO，但 Fyne 极大地简化了其构建依赖。在大多数情况下，你只需要安装好 Go 和一个 C 编译器，就可以轻松地构建跨平台应用，远比配置 Qt 或 GTK 的开发环境要简单。</li>
<li><strong>高性能与低资源占用</strong>：由于直接与 GPU 对话，其渲染性能通常很高，且最终生成的二进制文件和内存占用都非常小。</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li><strong>非原生观感</strong>：UI 的外观是 Fyne 自定义的“Material Design”风格，与操作系统原生控件（如 macOS 的 Aqua 风格）不同。这对于某些追求“平台原生感”的应用来说，可能是一个缺点。</li>
<li><strong>生态与成熟度</strong>：虽然 Fyne 近年来发展迅速，并拥有了像 Fysion 这样的图形化编辑器，但其组件库的丰富程度、第三方工具和社区解决方案，与 Web 生态或成熟的 C++ 框架相比，仍有一定差距。</li>
</ul>
<h3>流派三：CGO 绑定流 —— 拥抱经典的“实力派”</h3>
<p>这一流派选择了最传统、也最直接的路径：<strong>通过 CGO，将 Go 语言绑定到那些久经考验的 C/C++ GUI 框架上。</strong></p>
<ul>
<li><strong>代表项目</strong>：therecipe/qt, <a href="https://github.com/gotk3/gotk3">gotk3/gotk3</a>等。</li>
<li><strong>工作原理</strong>：编写大量的 CGO “胶水代码”，将 C/C++ 框架的 API 逐一映射为 Go 的函数和类型。</li>
</ul>
<p><strong>优点</strong>：<br />
*   <strong>功能极其强大</strong>：可以直接利用 Qt, GTK 等框架数十年来积累的、极其丰富和成熟的功能与组件。<br />
*   <strong>真正的原生控件</strong>：在某些情况下（如 GTK），应用使用的是操作系统原生的 UI 控件，能提供最原汁原味的平台体验。</p>
<p><strong>缺点</strong>：<br />
*   <strong>CGO 的所有痛点</strong>：构建环境配置复杂、交叉编译困难、编译速度慢。<br />
*   <strong>API 笨重</strong>：由于是 C API 的直接映射，其使用方式可能不那么符合 Go 的语言习惯。<br />
*   <strong>维护成本高</strong>：需要持续跟进上游 C/C++ 框架的更新。</p>
<h3>流派四：C代码转译流 —— modernc.org/tk9.0 引领的“去CGO化”绑定探索</h3>
<p>在与 C/C++ GUI 框架的搏斗中，还存在着第四条、也是最“激进”的一条道路。它不满足于“薄层”的 CGO 调用，而是试图从根本上<strong>消除 C 代码本身</strong>，将其<strong>转译 (Transpile)</strong> 为纯 Go 代码。<strong>代表项目</strong>：<strong>modernc.org/tk9.0</strong>。</p>
<p>modernc.org 生态系统的作者cznic，选择了两条并行且互补的路径，来实现真正的“CGO-free”绑定：</p>
<ol>
<li>
<p><strong>Pure FFI 路径 (基于 purego)</strong>: 在 purego 支持的主流平台（如 Linux/macOS/Windows 的 amd64/arm64 架构）上，modernc.org/tk9.0 会在<strong>运行时</strong>，通过 purego 动态加载并调用系统上预装的 Tcl/Tk C 语言共享库。这与我们之前讨论的 <a href="https://tonybai.com/2025/10/23/go-ffi-new-paradigm">purego 范式</a>一致，是一种轻量级的、无 CGO 编译时依赖的 FFI 方案。</p>
</li>
<li>
<p><strong>代码转译路径 (基于 ccgo)</strong>: 这才是其真正的“黑魔法”所在。对于 purego 不支持的平台，或者在希望构建完全无外部依赖的二进制文件时，modernc.org 的作者使用了他自己开发的工具 <a href="https://gitlab.com/cznic/ccgo">ccgo</a>。ccgo 是一个 C 语言到 Go 语言的<strong>源代码翻译器</strong>。它能够读取 Tcl/Tk 的 C 源代码，并将其<strong>自动转换</strong>为功能等价的、虽然可能不那么易读的 Go 源代码，比如<a href="https://gitlab.com/cznic/libtk9.0">libtk9.0</a>。</p>
</li>
</ol>
<p><strong>优点</strong></p>
<ul>
<li><strong>真正的 CGO-free</strong>：这是它最引人注目的优点。无论目标平台如何，Go 引以为傲的一键交叉编译能力被完美地保留了下来。</li>
<li><strong>零运行时依赖（在转译模式下）</strong>：通过将 Tcl/Tk 库本身转译为 Go 代码，你的应用可以被编译成一个<strong>完全静态、不依赖于目标系统上任何共享库</strong>的单一二进制文件。这对于应用的部署和分发来说，是一个巨大的福音。</li>
<li><strong>利用成熟的工具包</strong>：开发者可以享受到 Tk 这个经过数十年考验的、极其稳定的 GUI 工具包的所有功能，而无需承受 CGO 带来的痛苦。</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li><strong>转译的复杂性与保真度</strong>：C 到 Go 的自动转译是一个极其复杂的工程挑战。ccgo 虽然功能强大，但转译过程并非 100% 完美，可能会遇到 C 语言中某些特性的兼容性问题。</li>
<li><strong>性能与可读性</strong>：由 ccgo 生成的 Go 代码是机器生成的，其可读性和可维护性是个巨大的调整。同时，转译后的 Go 代码，其运行性能是否能与原生 C 代码媲美，也是一个需要具体场景具体测试的问题。</li>
<li><strong>生态系统特殊性</strong>：这种“转译”范式，目前是cznic 打造的modernc.org 生态系统独有的、高度集成的解决方案。选择它，意味着你需要信任并深度依赖于这个特定的、由社区英雄维护的工具链。</li>
</ul>
<h2>展望与建议：Go GUI 的破局之路在何方？</h2>
<p>Go GUI 的“绝境”，正在被社区以多元化的方式“破局”。展望 2025 年，我们不再只有一两条崎岖的小路，而是有了一幅更清晰、更多元的“路线图”。</p>
<ol>
<li>
<p><strong>Web 技术流仍是主流</strong>：在未来几年，以 <strong>Wails</strong> 为代表的 Web 技术方案，仍将是绝大多数 Go GUI 应用的最佳选择。它的生态优势和开发效率是其他方案难以比拟的。</p>
</li>
<li>
<p><strong>自绘渲染流是未来希望</strong>：<strong>Fyne</strong> 代表了 Go GUI 的“星辰大海”。随着其生态的不断成熟和完善，它有潜力成为 Go 语言未来真正的“原生” GUI 解决方案。</p>
</li>
<li>
<p><strong>CGO 绑定流是“重武器”</strong>：<strong>Qt/GTK</strong> 等传统框架的绑定，虽然沉重，但在需要极致功能和原生控件的专业领域，依然是不可或缺的“实力派”。</p>
</li>
<li>
<p><strong>C代码转译流是“黑科技”</strong>：以 <strong>modernc.org/tk9.0</strong> 为代表的转译方案，为“去 CGO 化”提供了一条全新的、激进的路径。它在部署上的巨大优势，可能会吸引越来越多的开发者关注。</p>
</li>
</ol>
<p><strong>给 Go 开发者的一些建议</strong>：</p>
<ul>
<li>如果你想快速构建一个功能丰富、界面美观的跨平台桌面应用：请毫不犹豫地选择 <strong>Wails</strong>。</li>
<li>如果你追求极致的部署便利性，并希望彻底摆脱 CGO：请深入研究 <strong>modernc.org/tk9.0</strong>。</li>
<li>如果你对性能和资源占用有极致要求，并愿意投入学习成本：请密切关注并尝试 <strong>Fyne</strong>。</li>
<li>如果你正在构建一个 CLI/TUI 应用：别忘了 <a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIyNzM0MDk0Mg==&amp;action=getalbum&amp;album_id=4108702531688333316#wechat_redirect"><strong>Bubbletea</strong></a>，它是这个领域的王者。</li>
</ul>
<p>Go GUI 的故事，是一个典型的“自下而上”的社区驱动创新的故事。虽然道阻且长，但行则将至。我们不再只有一个选择，而是可以在清晰的权衡之下，为我们的项目，找到最“恰如其分”的那条路。</p>
<p>最后，澄清一个很多Go初学者理解容易偏颇的内容，即究竟什么是”cgo-free” ？”cgo-free”的真正意思是：</p>
<ul>
<li>编译时不需要 C 编译器</li>
<li>可以交叉编译</li>
</ul>
<p>但”cgo-free”不代表程序运行时不会加载和调用对应架构的动态库(C库)。就像purego是”cgo-free”的，但使用purego的程序在运行时一般都是会调用某个依赖的C库。</p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p><strong>想系统学习Go，构建扎实的知识体系？</strong></p>
<p>我的新书《<a href="https://book.douban.com/subject/37499496/">Go语言第一课</a>》是你的首选。源自2.4万人好评的极客时间专栏，内容全面升级，同步至Go 1.24。首发期有专属五折优惠，不到40元即可入手，扫码即可拥有这本300页的Go语言入门宝典，即刻开启你的Go语言高效学习之旅！</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/go-primer-published-4.png" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/11/03/go-gui-development-2025/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2025年最佳机器人Linux操作系统——顶级发行版与最新进展！</title>
		<link>https://tonybai.com/2025/08/17/best-linux-os-for-robotics-in-2025/</link>
		<comments>https://tonybai.com/2025/08/17/best-linux-os-for-robotics-in-2025/#comments</comments>
		<pubDate>Sun, 17 Aug 2025 14:49:28 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[DDS]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Gazebo]]></category>
		<category><![CDATA[Humble]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[LIDAR]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[LTS]]></category>
		<category><![CDATA[MoveIt!]]></category>
		<category><![CDATA[NASA]]></category>
		<category><![CDATA[NVIDIA]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[OpenEmbedded]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[PyTorch]]></category>
		<category><![CDATA[reddit]]></category>
		<category><![CDATA[ROS]]></category>
		<category><![CDATA[ROS2]]></category>
		<category><![CDATA[Stackoverflow]]></category>
		<category><![CDATA[TensorFlow]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[UbuntuCore]]></category>
		<category><![CDATA[Yocto]]></category>
		<category><![CDATA[人工智能]]></category>
		<category><![CDATA[仿真]]></category>
		<category><![CDATA[具身智能]]></category>
		<category><![CDATA[内核]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[机器人]]></category>
		<category><![CDATA[机器人操作系统]]></category>
		<category><![CDATA[树莓派]]></category>
		<category><![CDATA[波士顿动力]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=5048</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/08/17/best-linux-os-for-robotics-in-2025 大家好，我是Tony Bai。 如果你正投身于机器人技术领域，选择正确的操作系统至关重要。随着人工智能、自动化和机器学习的进步，机器人正变得前所未有的复杂。在为这些智能机器提供动力方面，Linux凭借其开源的灵活性、稳定性以及对机器人框架的广泛支持，仍然是首选。 在本文中，我们将探讨2025年最佳的机器人Linux操作系统，帮助你为你的项目找到完美的发行版——无论你是从事工业自动化、人工智能驱动的机器人技术，还是业余爱好者的创作。我们还将介绍专注于机器人的Linux发行版的最新发展，让你保持领先。 1. Ubuntu机器人操作系统 机器人技术正以前所未有的速度发展，改变着医疗、自动化、制造乃至太空探索等行业。任何机器人系统的基础都是其操作系统，它决定了系统的效率、安全性和性能。 Ubuntu机器人操作系统 截至2025年，Ubuntu已成为机器人领域的最佳Linux操作系统。凭借其与机器人操作系统（ROS）的无缝集成、优化的实时性能以及对AI驱动机器人技术的扩展支持，Ubuntu成为开发者、研究人员和行业的首选。 为什么Ubuntu是机器人领域的最佳Linux操作系统 Ubuntu在机器人领域的主导地位并非偶然——它建立在多年的持续发展和强大的社区支持之上。以下是Ubuntu脱颖而出的一些关键原因： 1. 与ROS（机器人操作系统）的无缝集成 ROS已成为使用最广泛的机器人中间件，提供了一系列工具和库，帮助开发者构建复杂的机器人应用程序。由于ROS最初就是为Ubuntu设计的，因此集成非常无缝。 ROS 2与Ubuntu：到2025年，Ubuntu为ROS 2提供了内置支持，ROS 2提供了实时功能、安全增强和对多机器人系统更好的支持。 预装ROS软件包：Ubuntu通过预配置的软件包简化了ROS的安装，为开发者节省了大量时间。 强大的开发者社区：由于Ubuntu是机器人领域使用最多的操作系统，因此有庞大的支持网络可用于故障排除、教程和协作。 2. 针对嵌入式和边缘设备进行优化 并非所有机器人系统都是大型工业机器——许多现代机器人是需要轻量级和高效软件的小型嵌入式设备。Ubuntu Core是Ubuntu的最小化版本，专为边缘计算和嵌入式机器人技术而优化。 基于事务的更新：Ubuntu Core提供自动、故障安全的更新，确保机器人系统保持最新状态，而不会有破坏功能的风险。 注重安全的设计：Ubuntu Core包含内置的安全功能，如应用程序沙箱和验证启动机制，这对于在敏感环境中运行的机器人至关重要。 低系统资源占用：凭借其轻量级的特性，Ubuntu Core能在小型机器人硬件上高效运行，包括树莓派（Raspberry Pi）、NVIDIA Jetson和定制AI板卡。 3. 安全性与长期维护 安全性是机器人技术中的一个主要问题，尤其是在医疗和国防等行业。Ubuntu背后的公司Canonical提供扩展安全维护（ESM），确保基于Ubuntu的机器人系统获得长期的安全更新。 定期安全补丁：这可以防止可能被黑客利用的漏洞，使Ubuntu成为机器人项目最安全的选择之一。 行业采用：许多航空航天、汽车和工业自动化公司因其安全优先的方法而信任Ubuntu。 4. 硬件兼容性与行业采用 Ubuntu支持广泛的硬件，从AI驱动的机械臂到自动驾驶无人机。无论你是在开发工业机器人还是个人助理机器人，Ubuntu都为大量的传感器、执行器和计算单元提供驱动程序、库和支持。 可与流行的硬件平台配合使用，例如： NVIDIA Jetson AI驱动的机器人套件 树莓派（用于小型机器人项目） Intel RealSense（用于3D深度感应机器人） 定制的基于ARM的机器人系统 因为Ubuntu是一个开源操作系统，制造商也可以为其特定的机器人应用定制内核并进行优化。 Ubuntu机器人技术的最新发展（2025年） 过去一年，Ubuntu的机器人技术生态系统取得了显著进步。以下是2025年一些最激动人心的更新： 1. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/best-linux-os-for-robotics-in-2025-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/08/17/best-linux-os-for-robotics-in-2025">本文永久链接</a> &#8211; https://tonybai.com/2025/08/17/best-linux-os-for-robotics-in-2025</p>
<p>大家好，我是Tony Bai。</p>
<p>如果你正投身于机器人技术领域，选择正确的操作系统至关重要。随着人工智能、自动化和机器学习的进步，机器人正变得前所未有的复杂。在为这些智能机器提供动力方面，Linux凭借其开源的灵活性、稳定性以及对机器人框架的广泛支持，仍然是首选。</p>
<p>在本文中，我们将探讨2025年最佳的机器人Linux操作系统，帮助你为你的项目找到完美的发行版——无论你是从事工业自动化、人工智能驱动的机器人技术，还是业余爱好者的创作。我们还将介绍专注于机器人的Linux发行版的最新发展，让你保持领先。</p>
<h2>1. Ubuntu机器人操作系统</h2>
<p>机器人技术正以前所未有的速度发展，改变着医疗、自动化、制造乃至太空探索等行业。任何机器人系统的基础都是其操作系统，它决定了系统的效率、安全性和性能。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/best-linux-os-for-robotics-in-2025-2.png" alt="" /><br />
<center>Ubuntu机器人操作系统</center></p>
<p>截至2025年，Ubuntu已成为机器人领域的最佳Linux操作系统。凭借其与机器人操作系统（ROS）的无缝集成、优化的实时性能以及对AI驱动机器人技术的扩展支持，Ubuntu成为开发者、研究人员和行业的首选。</p>
<h3>为什么Ubuntu是机器人领域的最佳Linux操作系统</h3>
<p>Ubuntu在机器人领域的主导地位并非偶然——它建立在多年的持续发展和强大的社区支持之上。以下是Ubuntu脱颖而出的一些关键原因：</p>
<p><strong>1. 与ROS（机器人操作系统）的无缝集成</strong></p>
<p>ROS已成为使用最广泛的机器人中间件，提供了一系列工具和库，帮助开发者构建复杂的机器人应用程序。由于ROS最初就是为Ubuntu设计的，因此集成非常无缝。</p>
<ul>
<li>ROS 2与Ubuntu：到2025年，Ubuntu为ROS 2提供了内置支持，ROS 2提供了实时功能、安全增强和对多机器人系统更好的支持。</li>
<li>预装ROS软件包：Ubuntu通过预配置的软件包简化了ROS的安装，为开发者节省了大量时间。</li>
<li>强大的开发者社区：由于Ubuntu是机器人领域使用最多的操作系统，因此有庞大的支持网络可用于故障排除、教程和协作。</li>
</ul>
<p><strong>2. 针对嵌入式和边缘设备进行优化</strong></p>
<p>并非所有机器人系统都是大型工业机器——许多现代机器人是需要轻量级和高效软件的小型嵌入式设备。Ubuntu Core是Ubuntu的最小化版本，专为边缘计算和嵌入式机器人技术而优化。</p>
<ul>
<li>基于事务的更新：Ubuntu Core提供自动、故障安全的更新，确保机器人系统保持最新状态，而不会有破坏功能的风险。</li>
<li>注重安全的设计：Ubuntu Core包含内置的安全功能，如应用程序沙箱和验证启动机制，这对于在敏感环境中运行的机器人至关重要。</li>
<li>低系统资源占用：凭借其轻量级的特性，Ubuntu Core能在小型机器人硬件上高效运行，包括树莓派（Raspberry Pi）、NVIDIA Jetson和定制AI板卡。</li>
</ul>
<p><strong>3. 安全性与长期维护</strong></p>
<p>安全性是机器人技术中的一个主要问题，尤其是在医疗和国防等行业。Ubuntu背后的公司Canonical提供扩展安全维护（ESM），确保基于Ubuntu的机器人系统获得长期的安全更新。</p>
<ul>
<li>定期安全补丁：这可以防止可能被黑客利用的漏洞，使Ubuntu成为机器人项目最安全的选择之一。</li>
<li>行业采用：许多航空航天、汽车和工业自动化公司因其安全优先的方法而信任Ubuntu。</li>
</ul>
<p><strong>4. 硬件兼容性与行业采用</strong></p>
<p>Ubuntu支持广泛的硬件，从AI驱动的机械臂到自动驾驶无人机。无论你是在开发工业机器人还是个人助理机器人，Ubuntu都为大量的传感器、执行器和计算单元提供驱动程序、库和支持。</p>
<p>可与流行的硬件平台配合使用，例如：</p>
<ul>
<li>NVIDIA Jetson AI驱动的机器人套件</li>
<li>树莓派（用于小型机器人项目）</li>
<li>Intel RealSense（用于3D深度感应机器人）</li>
<li>定制的基于ARM的机器人系统</li>
</ul>
<p>因为Ubuntu是一个开源操作系统，制造商也可以为其特定的机器人应用定制内核并进行优化。</p>
<h3>Ubuntu机器人技术的最新发展（2025年）</h3>
<p>过去一年，Ubuntu的机器人技术生态系统取得了显著进步。以下是2025年一些最激动人心的更新：</p>
<p><strong>1. 针对机器人技术的实时内核增强</strong></p>
<p>实时性能在机器人技术中至关重要，微秒之差可能决定机器人是平稳运行还是彻底失败。2025年，Ubuntu引入了改进的实时内核支持，确保机器人应用满足低延迟处理要求。</p>
<ul>
<li>更快的响应时间：改进后的内核确保机器人的运动和决策能够无延迟地发生。</li>
<li>为多任务机器人提供更好的调度：对于同时执行多项操作的工业机器人非常有用。</li>
<li>增强的稳定性：减少机器人功能中的意外崩溃和延迟。</li>
</ul>
<p><strong>2. AI与机器学习集成</strong></p>
<p>现代机器人依赖于AI驱动的决策，Ubuntu已采取重要措施来优化机器人在机器学习方面的能力。</p>
<ul>
<li>内置的AI库，如TensorFlow、PyTorch和OpenCV，都为Ubuntu进行了预配置。</li>
<li>ROS 2现在包含了基于AI的运动规划和计算机视觉改进。</li>
<li>边缘AI支持：机器人可以在本地处理AI任务，而不是依赖云计算，从而减少延迟并改善实时决策。</li>
</ul>
<p><strong>3. 扩展对机器人硬件的支持</strong></p>
<p>Ubuntu已扩大其硬件支持范围，包括更多的工业机械臂、自动驾驶车辆和人形机器人。开发者现在可以将Ubuntu用于更广泛的机器人组件，包括：</p>
<ul>
<li>用于自动驾驶机器人的LIDAR传感器</li>
<li>用于云连接机器人的5G连接支持</li>
<li>用于基于感知的机器人的高级摄像头和深度感应模块</li>
</ul>
<p>通过这种扩展的兼容性，Ubuntu可以加快机器人应用程序的原型设计和部署。</p>
<p><strong>机器人社区对Ubuntu的评价</strong></p>
<p>机器人社区因其可靠性、灵活性和强大的开发者生态系统而广泛接受<a href="https://ubuntu.com/robotics">Ubuntu</a>。</p>
<ul>
<li>许多机器人专家认为精通Linux是必备技能，因为大多数机器人工具都是为Ubuntu构建的。</li>
<li>在Reddit和Stack Overflow等论坛的讨论中，经常强调Ubuntu相比其他操作系统选项提供了更好的支持、库和长期稳定性。</li>
<li>NASA、特斯拉和波士顿动力等公司都使用Ubuntu进行机器人研究和开发。</li>
</ul>
<p><strong>Ubuntu是机器人技术的未来</strong></p>
<p>凭借以下优势，Ubuntu已在2025年牢固确立了其作为最佳机器人Linux操作系统的地位：</p>
<ul>
<li>无缝的ROS 2集成</li>
<li>支持实时计算</li>
<li>AI和机器学习优化</li>
<li>增强的安全性和长期维护</li>
<li>广泛的行业采用</li>
</ul>
<p>无论你是在构建自动驾驶无人机、工业机器人，还是以研究为中心的AI驱动机器人系统，Ubuntu都为成功提供了最佳基础。</p>
<p>如果你计划进入机器人领域，学习Ubuntu、ROS和AI驱动的机器人开发是你能做出的最明智的决定。</p>
<h2>2. Debian机器人操作系统</h2>
<p>在快速发展的机器人世界中，选择正确的操作系统可以决定一个项目的成败。机器人工程师、研究人员和爱好者需要一个不仅稳定可靠，而且配备最新工具和库以支持开发的操作系统。在2025年，Debian机器人操作系统已成为机器人领域最佳的基于Linux的操作系统，提供了无与伦比的稳定性、灵活性和尖端软件支持的组合。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/best-linux-os-for-robotics-in-2025-3.png" alt="" /><br />
<center>Debian机器人操作系统</center></p>
<h3>为什么选择Debian用于机器人技术？</h3>
<p>Debian长期以来以其对自由和开源软件的承诺而闻名，这使其成为机器人开发者的一个有吸引力的选择。与专有系统不同，Debian确保了对庞大工具库的无限制访问，允许开发者在没有许可限制的情况下进行实验、创新和协作。</p>
<p>以下是Debian在2025年成为机器人领域首选Linux发行版的原因：</p>
<ul>
<li>稳定性和可靠性：Debian以其严格的测试过程而闻名。每个稳定版本都经过广泛审查，确保机器人应用程序平稳、一致地运行。</li>
<li>全面的软件包仓库：Debian维护着最大的软件仓库之一，其中包括数千个专门为机器人应用设计的软件包。</li>
<li>社区支持：一个强大而活跃的Debian社区为持续的改进、错误修复和功能增强做出贡献，使机器人开发者更容易解决问题和改进他们的项目。</li>
<li>安全性和性能：Debian增强的安全功能确保机器人系统免受潜在威胁，这在工业自动化和自主系统等关键应用中尤为重要。</li>
</ul>
<p><strong>与ROS的无缝集成</strong></p>
<p>机器人操作系统（ROS）是现代机器人开发的支柱。它提供了必要的工具、库和驱动程序，帮助开发者高效地创建复杂的机器人应用程序。Debian与ROS的深度集成确保了无缝的开发体验，允许用户在没有兼容性问题的情况下利用ROS的功能。</p>
<p>Debian的包管理系统使安装ROS变得简单直接。Debian科学团队积极维护一个专门用于机器人相关软件包的仓库，确保用户始终能访问到最新版本的基本工具。</p>
<p>对于那些从事高级机器人系统开发的开发者来说，Debian对ROS 2（ROS的下一代版本）的支持确保了与更新框架的兼容性、增强的实时性能和改进的安全功能。</p>
<h3>Debian机器人技术的最新发展</h3>
<p>Debian机器人技术在2025年持续发展，取得了显著进步。以下是一些最新的更新：</p>
<p><strong>1. 扩展的机器人软件包仓库</strong></p>
<p>Debian科学团队一直在积极扩展机器人软件包仓库。此次更新包括了流行工具的新的和改进的版本，例如：</p>
<ul>
<li>Gazebo – 一款强大的仿真工具，用于在虚拟环境中测试机器人应用。</li>
<li>MoveIt! – 一个广泛用于机械臂和操纵器的运动规划框架。</li>
<li>OpenCV – 这个计算机视觉库的最新版本现已针对机器人应用中的更佳性能进行了优化。</li>
<li>Navigation Stack – 升级的模块，用于改进自主机器人的路径规划和避障功能。</li>
</ul>
<p>通过这些更新，开发者无需安装第三方仓库即可访问最前沿的工具。</p>
<p><strong>2. 实时内核支持</strong></p>
<p>实时处理对于机器人技术至关重要，精确的计时和快速的响应率是必不可少的。Debian现在正式支持实时Linux内核（RT-PREEMPT），允许开发者以最小的延迟运行对时间敏感的机器人应用程序。</p>
<p>这项更新对于工业机器人、机器人手术和自主无人机尤其有益，因为在这些领域，即使是毫秒级的延迟也可能导致严重问题。</p>
<p><strong>3. 增强的安全功能</strong></p>
<p>随着机器人更多地融入工业和智能环境，安全风险也随之增加。作为回应，Debian为机器人系统引入了先进的安全功能，包括：</p>
<ul>
<li>强制访问控制（MAC） – 强制执行严格的安全策略，以防止对机器人系统的未授权访问。</li>
<li>安全启动支持 – 确保只有经过验证和信任的软件才能在机器人硬件上运行。</li>
<li>自动安全更新 – 实时保护机器人应用免受漏洞和新兴威胁的侵害。</li>
</ul>
<p>凭借这些增强功能，Debian机器人操作系统现在成为依赖机器人进行自动化、医疗和国防的行业的一个更安全的选择。</p>
<p><strong>社区与支持</strong></p>
<p>Debian最大的优势之一是其社区驱动的开发模式。与专有机器人软件不同，Debian受益于全球数千名开发者和研究人员对其改进的贡献。Debian科学邮件列表、论坛和Git仓库是宝贵的资源，用户可以在这些地方讨论问题、分享解决方案和协作项目。</p>
<p>Debian科学团队还确保Debian机器人操作系统与最新的技术进步保持同步，使初学者和专家都能更容易地开始机器人开发。</p>
<h3>为什么在2025年选择Debian机器人操作系统？</h3>
<p><a href="https://wiki.debian.org/DebianScience/Robotics/ROS">Debian机器人操作系统</a>不仅仅是一个操作系统；它是一个生态系统，使开发者、研究人员和企业能够充满信心地构建先进的机器人系统。从其无缝的ROS集成和实时内核支持，到其强大的安全功能和广泛的软件包仓库，Debian为2025年的机器人开发提供了一切所需。</p>
<p>无论你是从事自主机器人、工业自动化还是AI驱动的机器人应用，Debian机器人操作系统都提供了一个稳定、安全和强大的基础，以构建机器人技术的未来。</p>
<p>你在项目中使用Debian机器人操作系统吗？在下面的评论中分享你的想法和经验吧！</p>
<h2>3. 基于ROS的发行版 (ROS 2)</h2>
<p>机器人操作系统（ROS）一直是机器人行业的变革者，为开发机器人应用程序提供了一个强大而灵活的框架。多年来，ROS 2已发展成为致力于尖端机器人解决方案的开发者、研究人员和公司的首选。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/best-linux-os-for-robotics-in-2025-4.png" alt="" /><br />
<center>基于ROS的发行版 (ROS 2)</center></p>
<p>当我们进入2025年，ROS 2发行版已经成熟，提供了改进的实时能力、增强的安全性和更广泛的兼容性。如果你正在寻找最佳的机器人Linux操作系统，本指南将带你了解最新的ROS 2发行版、它们的特性以及运行它们的理想Linux发行版。</p>
<h3>理解ROS 2发行版</h3>
<p>ROS 2发行版是ROS 2框架的定期发布版本，包含了最新的改进、安全补丁和功能升级。</p>
<p>每个发行版都有一个定义的生命周期，通常每两年提供一次长期支持（LTS），而非LTS版本则作为实验性功能的测试平台。选择正确的ROS 2发行版取决于项目稳定性要求、硬件兼容性和功能需求等因素。</p>
<p><strong>2025年的关键ROS 2发行版</strong></p>
<p><strong>1. Jazzy Jalisco (LTS) – 2024年5月23日发布</strong></p>
<p>最新的LTS版本<a href="https://docs.ros.org/en/rolling/Releases/Release-Jazzy-Jalisco.html">Jazzy Jalisco</a>，将获得五年的支持，使其成为工业应用和长期项目的最佳选择。它引入了：</p>
<ul>
<li>针对时间敏感机器人操作的先进实时能力</li>
<li>通过加密通信和认证功能增强的安全性</li>
<li>扩展了对不同硬件平台的兼容性</li>
<li>更好的中间件支持，以提高性能和可伸缩性</li>
</ul>
<p><strong>2. Iron Irwini (非LTS) – 2023年5月23日发布</strong></p>
<p>虽然<a href="https://docs.ros.org/en/iron/Releases/Release-Iron-Irwini.html">Iron Irwini</a>不是LTS版本（支持期1.5年），但它充当了新创新的试验场。希望尝试尖端机器人功能的开发者可以从中受益：</p>
<ul>
<li>更快的开发周期和频繁的更新</li>
<li>实验性的中间件改进</li>
<li>提前接触可能包含在未来LTS版本中的功能</li>
</ul>
<p><strong>3. Humble Hawksbill (LTS) – 2022年5月23日发布</strong></p>
<p><a href="https://docs.ros.org/en/foxy/Releases/Release-Humble-Hawksbill.html">Humble Hawksbill</a>在2025年仍然是一个受欢迎的选择，因为它将获得支持直到2027年。它在以下方面发挥了关键作用：</p>
<ul>
<li>改进中间件通信协议</li>
<li>改进工具和调试能力</li>
<li>在基于ARM的平台上有更好的性能</li>
</ul>
<p>对于在Humble上启动的项目，迁移到Jazzy Jalisco可以确保长期稳定性。</p>
<h3>ROS 2的最新发展（2025年）</h3>
<p>ROS 2持续发展，为机器人技术生态系统带来了几项关键改进：</p>
<p><strong>1. 实时支持</strong></p>
<p>凭借改进的实时调度，ROS 2现在可以处理更复杂的机器人任务，并具有确定性的性能。</p>
<p><strong>2. 安全性增强</strong></p>
<p>通过安全的通信协议和更好的认证机制，ROS 2现在比以往任何时候都更安全，解决了工业机器人和自动驾驶汽车中的安全问题。</p>
<p><strong>3. 跨平台兼容性</strong></p>
<p>虽然Ubuntu仍然是主要的操作系统，但ROS 2已将其支持扩展到Debian、Fedora、Windows甚至macOS。</p>
<p><strong>4. 更好的中间件性能</strong></p>
<p>DDS（数据分发服务）中的中间件改进增强了大型机器人系统中的延迟、可靠性和可伸缩性。</p>
<p>随着机器人技术的不断进步，ROS 2仍然是行业领先的框架，其中Jazzy Jalisco（LTS）是2025年的首选。</p>
<p>对于ROS 2的最佳Linux操作系统，Ubuntu 22.04 LTS作为最稳定和得到最广泛支持的选项脱颖而出。然而，开发者也可以灵活选择Debian、Fedora和Arch Linux。</p>
<p>随着在实时性能、安全性和跨平台支持方面的持续改进，ROS 2正在塑造2025年及以后机器人技术的未来。保持对最新发展的了解，可以确保你的机器人项目保持未来竞争力。</p>
<h2>4. Fedora机器人操作系统</h2>
<p>在不断发展的机器人世界中，选择正确的操作系统对于无缝开发和部署至关重要。截至2025年，Fedora机器人操作系统凭借其专门的工具、强大的社区支持和对开源原则的承诺，已成为机器人领域最强大的Linux发行版之一。无论你是尝试自主机器人的业余爱好者，还是开发工业自动化解决方案的专业人士，Fedora机器人操作系统都提供了一个量身定制的综合平台，以满足你的需求。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/best-linux-os-for-robotics-in-2025-5.png" alt="" /><br />
<center>Fedora机器人操作系统</center></p>
<h3>为什么Fedora机器人操作系统脱颖而出</h3>
<p>Fedora机器人操作系统是Fedora项目的一个专门分支，专为机器人专家设计。它提供了一套精心策划的软件包，涵盖了机器人技术的各个方面，从仿真到硬件接口。以下是Fedora机器人操作系统在2025年广受欢迎的关键原因：</p>
<p><strong>1. 全面的软件套件</strong></p>
<p>Fedora机器人操作系统包含一套广泛的预装软件包，使开发者可以轻松上手，而无需花费数小时设置环境。Fedora机器人操作系统中的一些核心工具包括：</p>
<ul>
<li>Gazebo – 一款强大的3D机器人模拟器，使开发者能够在虚拟环境中测试机器人应用程序。</li>
<li>OpenCV – 广泛用于图像处理和机器学习任务的计算机视觉库。</li>
<li>Arduino IDE – 用于编程微控制器的流行开发环境。</li>
<li>Player/Stage – 在学术界和研究中广泛使用的仿真工具。</li>
<li>Gazebo, V-REP, and Webots – 先进的机器人仿真软件，用于训练AI模型和在虚拟环境中测试算法。</li>
</ul>
<p><strong>2. 与ROS（机器人操作系统）的无缝集成</strong></p>
<p>Fedora机器人操作系统的最大优势之一是其与ROS的无缝集成，ROS是使用最广泛的机器人软件框架。ROS提供了一些基本服务，例如：</p>
<ul>
<li>硬件抽象 – 使控制传感器、电机和执行器变得更加容易。</li>
<li>底层设备控制 – 提供对机器人硬件组件的直接访问。</li>
<li>进程间通信 – 促进不同机器人模块和进程之间的无缝通信。</li>
</ul>
<p>Fedora机器人操作系统预配置了最新版本的ROS 2，确保与尖端的机器人应用兼容。这种集成使开发者能够利用广泛的ROS生态系统，包括库、驱动程序和可视化工具。</p>
<p><strong>3. 强大的社区支持</strong></p>
<p>Fedora机器人操作系统得益于一个由开发者、研究人员和机器人爱好者组成的活跃社区。Fedora机器人特别兴趣小组（SIG）致力于确保Fedora用户能够获得最新的机器人软件和更新。该小组积极维护Fedora的机器人软件包，提供教程，并帮助用户解决问题。</p>
<h3>Fedora机器人技术的最新发展</h3>
<p>Fedora机器人团队一直积极地将该领域的最新进展融入其中。2025年一些最显著的更新包括：</p>
<p><strong>1. 增强的仿真工具</strong></p>
<p>仿真在机器人开发中起着至关重要的作用，它允许开发者在物理机器人上部署算法之前进行测试。Fedora机器人操作系统通过集成以下内容显著改善了其仿真能力：</p>
<ul>
<li>Ignition Gazebo – 一款提供高保真物理和传感器仿真的高级模拟器。</li>
<li>AI驱动的仿真环境 – 支持基于机器学习的仿真，机器人可以在其中学习并适应环境。</li>
</ul>
<p><strong>2. 改进的硬件支持</strong></p>
<p>随着机器人硬件的迅速扩展，Fedora机器人操作系统已包括对以下内容的支持：</p>
<ul>
<li>新的机器人传感器和执行器 – 确保软件和硬件组件之间的无缝通信。</li>
<li>树莓派和Jetson Nano优化 – Fedora机器人操作系统现在在低功耗硬件上运行更高效，非常适合DIY机器人项目。</li>
<li>扩展的驱动程序支持 – Fedora机器人操作系统现在包括用于机械臂、激光雷达传感器和人形机器人的额外驱动程序。</li>
</ul>
<p><strong>3. 教育资源和教程</strong></p>
<p>了解到机器人技术对初学者可能具有挑战性，Fedora机器人操作系统在教育资源上投入了大量资金。这些资源包括：</p>
<ul>
<li>分步教程 – 涵盖从设置开发环境到编程机器人运动的所有内容。</li>
<li>交互式学习模块 – 用户可以在虚拟训练环境中练习为不同的机器人任务编写代码。</li>
<li>在线社区论坛和黑客马拉松 – 为开发者提供协作、学习和分享见解的空间。</li>
</ul>
<p><strong>为什么开发者更喜欢Fedora机器人操作系统而非其他Linux发行版</strong></p>
<p>机器人社区经常争论用于开发的最佳操作系统。虽然像Ubuntu和Debian这样的其他Linux发行版被广泛使用，但Fedora机器人操作系统具有明显的优势：</p>
<ul>
<li>最新的内核和软件包 – Fedora以跟上最新技术而闻名，确保开发者能够访问尖端功能。</li>
<li>为性能和安全优化 – Fedora的安全特性使其成为工业和研究应用的首选。</li>
<li>使用DNF实现无缝包管理 – Fedora的包管理系统效率高，减少了在其他发行版中经常遇到的依赖问题。</li>
</ul>
<p>此外，基于Linux的操作系统通常比Windows更受机器人开发者的青睐，因为它们提供：</p>
<ul>
<li>更好地控制操作系统功能 – 直接访问系统资源。</li>
<li>更简便的依赖管理 – 简化了机器人库的安装。</li>
<li>开源的灵活性 – 可根据项目需求进行完全定制。</li>
</ul>
<p><a href="https://fedoraproject.org/wiki/Robotics">Fedora机器人操作系统</a>无疑是2025年最佳的机器人Linux发行版之一。凭借其广泛的软件套件、强大的ROS集成、改进的硬件支持和活跃的社区，它为机器人专家开发、测试和部署他们的项目提供了一个理想的环境。</p>
<p>随着机器人技术的不断发展，Fedora机器人操作系统仍然致力于走在创新的前沿，使其成为有抱负的和专业的机器人专家的首选。如果你正在寻找一个强大、可靠且面向未来的机器人Linux操作系统，Fedora机器人操作系统是完美的选择。</p>
<h2>5. 用于机器人的OpenEmbedded Linux (Yocto)</h2>
<p>机器人领域正以前所未有的速度发展，人工智能、自动化和边缘计算的进步推动了对强大且可定制的操作系统的需求。在2025年，由Yocto项目驱动的OpenEmbedded Linux，作为机器人领域最佳的基于Linux的操作系统之一脱颖而出。它提供灵活性、可扩展性和优化性能的能力，使其成为从事机器人应用的开发者的首选。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/best-linux-os-for-robotics-in-2025-6.png" alt="" /><br />
<center>用于机器人的OpenEmbedded Linux (Yocto)</center></p>
<p>如果你参与机器人开发——无论是在工业自动化、自动驾驶汽车、无人机还是AI驱动的机器人系统中——了解OpenEmbedded Linux和Yocto的能力将至关重要。在这篇博文中，我们将深入探讨OpenEmbedded Linux（Yocto）如何成为机器人的理想操作系统，探索其最新发展，并讨论其对机器人行业的影响。</p>
<h3>什么是OpenEmbedded Linux和Yocto项目？</h3>
<p><strong>OpenEmbedded Linux</strong></p>
<p>OpenEmbedded是一个开源的构建框架和交叉编译环境，专为创建针对嵌入式设备的Linux发行版而设计。与Ubuntu或Fedora等通用Linux发行版不同，OpenEmbedded允许开发者专门为他们的硬件和应用需求定制和优化他们的Linux构建。</p>
<p><strong>Yocto项目</strong></p>
<p>Yocto项目由Linux基金会于2010年发起，是一个与OpenEmbedded协同工作的合作项目，旨在简化和标准化为嵌入式和物联网设备定制Linux发行版的开发。以BitBake为核心构建系统，Yocto项目为开发者提供工具、模板和最佳实践，以创建最小化、高效且针对硬件优化的基于Linux的操作系统。</p>
<p>对于机器人开发者来说，OpenEmbedded和Yocto项目的结合使他们能够创建为机器人应用量身定制的轻量、快速且针对特定硬件的Linux发行版。</p>
<h3>为什么OpenEmbedded Linux (Yocto)是2025年机器人的理想选择</h3>
<p><strong>高度定制化与模块化</strong></p>
<ul>
<li>与传统的Linux发行版（预装了软件和功能）不同，OpenEmbedded Linux让开发者可以构建一个只包含其机器人系统所需内容的发行版。</li>
<li>这种模块化的方法确保了一个优化且轻量级的操作系统，从而提升性能。</li>
</ul>
<p><strong>硬件抽象与兼容性</strong></p>
<ul>
<li>机器人项目通常涉及各种各样的硬件组件，从传感器和执行器到专用处理器和AI加速器。</li>
<li>OpenEmbedded的基于层的结构使开发者能够创建板级支持包（BSP），从而可以轻松地与不同的硬件架构集成。</li>
</ul>
<p><strong>长期支持与安全性</strong></p>
<ul>
<li>Yocto项目定期发布带有安全补丁的LTS（长期支持）版本，使其成为机器人应用的一个安全稳定的选择。</li>
<li>安全性是机器人技术中的一个主要问题，尤其是在自主系统和工业自动化中，而OpenEmbedded Linux提供了安全启动、内核加固和访问控制策略等功能。</li>
</ul>
<p><strong>更好的资源效率</strong></p>
<ul>
<li>机器人应用通常在低功耗和资源受限的硬件上运行。</li>
<li>OpenEmbedded Linux允许开发者创建极简的Linux构建，减少系统开销并最大化效率。</li>
</ul>
<p><strong>强大的社区与行业采用</strong></p>
<ul>
<li>Yocto项目得到了嵌入式Linux社区和英特尔、高通、恩智浦和德州仪器等主要行业参与者的强力支持。</li>
<li>这意味着为机器人开发者提供了持续的改进、广泛的文档和长期的可靠性。</li>
</ul>
<h3>OpenEmbedded Linux在机器人技术领域的最新发展（2025年）</h3>
<p><strong>1. 上游Linux对机器人硬件的支持</strong></p>
<p>在2025年，像Linaro和高通这样的公司通过将对高通机器人RB5等机器人平台的支持上游化，为OpenEmbedded Linux做出了重大贡献。这一发展确保了下一代机器人系统更好的兼容性、实时处理和AI集成。</p>
<p><strong>2. 改进的培训与学习资源</strong></p>
<p>随着基于Yocto的Linux系统的日益普及，Bootlin和Yocto项目社区等组织推出了新的培训项目、研讨会和在线课程。这些资源使开发者更容易为机器人项目学习、实施和优化OpenEmbedded Linux。</p>
<p><strong>3. 扩展的AI与机器学习能力</strong></p>
<p>OpenEmbedded Linux在集成AI和机器学习框架（如TensorFlow Lite和ROS 2（机器人操作系统））方面取得了重大改进。这使得机器人系统能够执行边缘AI推理、实时决策和高级自动化。</p>
<p><strong>4. 全行业采用与标准化</strong></p>
<p>许多机器人公司和研究机构已转向使用基于Yocto的Linux发行版作为其嵌入式机器人平台。这一转变正在帮助创建一个更加标准化的软件生态系统，减少碎片化并改善机器人设备间的兼容性。</p>
<h3>OpenEmbedded Linux在机器人技术中的应用</h3>
<p><strong>工业自动化</strong></p>
<p>OpenEmbedded Linux正在为需要高性能计算、实时处理和强大安全功能的新一代自动化制造机器人提供动力。</p>
<p><strong>自动驾驶汽车与无人机</strong></p>
<p>机器人公司正在使用基于Yocto的Linux来开发自主无人机和自动驾驶汽车，确保低延迟通信和AI驱动的导航。</p>
<p><strong>医疗机器人</strong></p>
<p>医疗机器人，如手术机器人和康复设备，受益于OpenEmbedded Linux提供安全、实时和稳定操作系统环境的能力。</p>
<p><strong>AI驱动的家庭与服务机器人</strong></p>
<p>智能助手、配送机器人和其他AI驱动的机器人解决方案利用OpenEmbedded Linux进行定制化的AI模型和实时的语音/图像处理。</p>
<h3>OpenEmbedded Linux是2025年最佳的机器人操作系统吗？</h3>
<p>随着机器人行业的不断扩大，对可定制、轻量级和高性能操作系统的需求比以往任何时候都更加关键。由Yocto项目驱动的OpenEmbedded Linux无疑是2025年机器人领域最佳的Linux操作系统。</p>
<p>其提供针对特定硬件的优化、实时处理、安全性和AI集成的能力，使其成为全球机器人专家、工程师和开发者的首选。随着持续的进步和行业采用，OpenEmbedded Linux必将在未来几年塑造机器人技术的未来。</p>
<p>如果你正在开发一个机器人项目，并且需要一个可扩展且高效的Linux操作系统，那么OpenEmbedded Linux (Yocto)是2025年的最佳选择。</p>
<p><strong>下一步是什么？</strong></p>
<p>探索OpenEmbedded Linux：<a href="https://www.openembedded.org/wiki/Main_Page">https://www.openembedded.org/wiki/Main&#95;Page</a></p>
<p>了解更多关于Yocto项目的信息：<a href="https://techrefreshing.com/best-linux-os-for-robotics-in-2025/www.yoctoproject.org">www.yoctoproject.org</a></p>
<p>开始开发：<a href="https://docs.yoctoproject.org/">Yocto文档</a></p>
<p>你在机器人项目中使用OpenEmbedded Linux吗？在下面的评论中分享你的想法和经验吧！</p>
<h2>结论</h2>
<p>在2025年选择最佳的机器人Linux操作系统取决于你的具体需求。如果你需要一个支持良好、对初学者友好的选项，Ubuntu机器人操作系统是你的不二之选。对于稳定性和长期项目，Debian机器人操作系统是一个绝佳的选择。那些从事AI驱动或实验性机器人技术的人应该考虑Fedora机器人操作系统，而嵌入式系统开发者可以依赖基于Yocto的Linux发行版。随着ROS 2、AI和实时内核优化的不断进步，Linux仍然是塑造机器人技术未来的首选操作系统。</p>
<h2><strong>免责声明</strong></h2>
<p>本文中的信息基于截至2025年的最新可用更新。2025年最佳的机器人Linux操作系统可能因特定的硬件、软件更新和项目要求而异。在选择操作系统之前，请务必验证其与你的机器人框架的兼容性。本文仅供参考，不构成专业建议。</p>
<p>本文翻译自文章《<a href="https://techrefreshing.com/best-linux-os-for-robotics-in-2025/">Best Linux OS for Robotics in 2025</a>》- https://techrefreshing.com/best-linux-os-for-robotics-in-2025/</p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/08/17/best-linux-os-for-robotics-in-2025/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>内核之外的冰山：为什么说从零写一个操作系统已几乎不可能？</title>
		<link>https://tonybai.com/2025/08/16/brand-new-os-impossible/</link>
		<comments>https://tonybai.com/2025/08/16/brand-new-os-impossible/#comments</comments>
		<pubDate>Sat, 16 Aug 2025 00:03:53 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[cargo]]></category>
		<category><![CDATA[cgroups]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[Glibc]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[gomodule]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[libc]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[open]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[POSIX]]></category>
		<category><![CDATA[Printf]]></category>
		<category><![CDATA[proc]]></category>
		<category><![CDATA[Read]]></category>
		<category><![CDATA[Redox]]></category>
		<category><![CDATA[relibc]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[syscall]]></category>
		<category><![CDATA[write]]></category>
		<category><![CDATA[内核]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[补丁]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=5040</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/08/16/brand-new-os-impossible 大家好，我是Tony Bai。 对于许多心怀浪漫主义的开发者来说，“从零开始编写一个属于自己的操作系统”，或许是技术生涯中最终极、最性感的梦想。这几乎是现代编程世界的“创世纪”，是掌控计算机每一个比特的至高权力。 然而，最近一位名为 Wildan M 的工程师，在他的一篇博文中，用一次亲身参与 Redox OS 项目的经历，给我们所有人泼了一盆冷水。他的结论简单而又颠覆： 现在，从零开始编写一个全新的、能被广泛采用的操作系统，已几乎是一项不可能完成的任务。 而其真正的难点，并非我们想象中那个神秘而复杂的内核，而在于内核之外，那座看不见的、庞大到令人绝望的“冰山”。 冰山一角：内核，那个“最简单”的部分 故事的主角是 Redox OS，一个雄心勃勃的项目。它旨在用内存安全的 Rust 语言，构建一个现代的、基于微内核架构的、可以替代 Linux 和 BSD 的完整操作系统。 当我们谈论“写一个 OS”时，我们通常指的是编写内核。那么 Redox OS 的内核有多复杂呢？文章给出了惊人的数据： * 代码量： 约 3 万行 (30k LoC)。 * 启动速度： 大多数情况下，不到 1 秒。 在短短十年间，Redox 团队已经完成了动态链接、Unix 套接字等核心功能。这无疑是令人敬佩的工程壮举。但 Wildan 指出，这仅仅是浮出水面的冰山一角。一个能启动的内核，距离一个“能用”的操作系统，还有着遥远的距离。 冰山之下：生态移植的“五层地狱” 当作者兴致勃勃地想为 Redox OS 贡献力量，尝试将一些现代程序（如 Go, Node.js, Rust [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/brand-new-os-impossible-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/08/16/brand-new-os-impossible">本文永久链接</a> &#8211; https://tonybai.com/2025/08/16/brand-new-os-impossible</p>
<p>大家好，我是Tony Bai。</p>
<p>对于许多心怀浪漫主义的开发者来说，“从零开始编写一个属于自己的操作系统”，或许是技术生涯中最终极、最性感的梦想。这几乎是现代编程世界的“创世纪”，是掌控计算机每一个比特的至高权力。</p>
<p>然而，最近一位名为 Wildan M 的工程师，在<a href="https://blog.wellosoft.net/writing-a-brand-new-os-is-almost-impossible-by-now">他的一篇博文</a>中，用一次亲身参与 Redox OS 项目的经历，给我们所有人泼了一盆冷水。他的结论简单而又颠覆：</p>
<p><strong>现在，从零开始编写一个全新的、能被广泛采用的操作系统，已几乎是一项不可能完成的任务。</strong></p>
<p>而其真正的难点，并非我们想象中那个神秘而复杂的内核，而在于内核之外，那座看不见的、庞大到令人绝望的“冰山”。</p>
<h2>冰山一角：内核，那个“最简单”的部分</h2>
<p>故事的主角是 Redox OS，一个雄心勃勃的项目。它旨在用内存安全的 Rust 语言，构建一个现代的、基于微内核架构的、可以替代 Linux 和 BSD 的完整操作系统。</p>
<p>当我们谈论“写一个 OS”时，我们通常指的是编写内核。那么 Redox OS 的内核有多复杂呢？文章给出了惊人的数据：<br />
*   <strong>代码量：</strong> 约 3 万行 (30k LoC)。<br />
*   <strong>启动速度：</strong> 大多数情况下，不到 1 秒。</p>
<p>在短短十年间，Redox 团队已经完成了动态链接、Unix 套接字等核心功能。这无疑是令人敬佩的工程壮举。但 Wildan 指出，这仅仅是浮出水面的冰山一角。一个能启动的内核，距离一个“能用”的操作系统，还有着遥远的距离。</p>
<h2>冰山之下：生态移植的“五层地狱”</h2>
<p>当作者兴致勃勃地想为 Redox OS 贡献力量，尝试将一些现代程序（如 Go, Node.js, Rust 编译器）移植上去时，他才真正撞上了那座隐藏在水面之下的巨大冰山。</p>
<p>一个现代操作系统之所以“能用”，是因为它能运行我们日常使用的所有软件。而将这些软件“搬”到一个全新的操作系统上，需要闯过一重又一重难关。</p>
<p><strong>第一层：系统调用 (Syscall) 的鸿沟</strong></p>
<p>这是最底层的障碍。每个操作系统都有自己的一套与硬件和内核交互的“语言”，即系统调用。Redox OS 的 syscall 与我们熟知的 Linux 完全不同。这意味着，任何需要与内核打交道的程序（几乎是所有程序），都必须重写这部分逻辑，告诉它如何在新世界里“说话”。</p>
<p><strong>第二层：libc 的重担</strong></p>
<p>为了不让每个程序都去痛苦地学习 syscall 这门“方言”，操作系统通常会提供一个标准的“翻译官”——C 标准库 (libc)。它将复杂的 syscall 封装成开发者熟悉的函数（如 printf, open, read）。因此，一个新 OS 的核心任务之一，就是自己实现一个兼容的 libc。Redox 为此用 Rust 实现了一个名为 relibc 的项目，其工程量之浩大可想而知。</p>
<p><strong>第三层：POSIX 的“几乎兼容”陷阱</strong></p>
<p>即便新 OS 像 Redox 一样，努力兼容 POSIX 这个通用标准，噩梦也远未结束。因为无数现有的软件，早已深度依赖于 Linux 特有的、非 POSIX 的功能，比如解析 /proc 文件系统、操作 cgroups 等。结果就是，即使有了 relibc，你依然需要为这些软件挨个打上无数的“补丁”。文章提到，仅 Redox OS 的官方“软件食谱 (Cookbook)”中，就包含了<strong>约 70 个</strong>这样的补丁。</p>
<p><strong>第四层：编译器的“先有鸡还是先有蛋”</strong></p>
<p>你想在新 OS 上原生编译软件吗？那你首先需要一个能在这个 OS 上运行的编译器，比如 GCC、Rustc 或 Go 编译器。但问题是，移植编译器本身，就是所有软件移植任务中最复杂、最艰巨的一种。它需要处理极其底层的二进制格式、链接方式和系统调用。这形成了一个经典的“鸡生蛋还是蛋生鸡”的困局。</p>
<p><strong>第五层：语言生态的“次元壁”</strong></p>
<p>如果说移植 C 语言程序还只是“困难模式”，那么移植那些拥有自己庞大生态的现代语言程序（如 Rust, Go, Node.js），则是“地狱模式”。这些语言的包管理器（如 Cargo, Go Modules）会从中央仓库下载海量依赖，你很难像修改 C 代码一样，通过一个简单的 .patch 文件来修复所有问题。唯一的办法，往往是去 fork 无数个核心依赖库，然后逐一修改，这几乎是一项不可能完成的任务。</p>
<h2>小结：生态，才是那座无法逾越的山</h2>
<p>当 Wildan 经历过这一切后，他得出了文章开头的那个结论。</p>
<p>一个操作系统的成功，或许 <strong>20% 在于内核的精巧，而 80% 在于其上能否运行用户想要的所有软件。</strong> 后者，那个由编译器、标准库、第三方包、应用软件共同构成的庞大生态，才是真正的、几乎无法被复制的“护城河”。</p>
<p>这就像建造一座城市。你可以设计出最宏伟、最先进的市政厅（内核），但如果没有配套的道路、水电、学校、医院、商店（软件生态），这座城市就永远只是一座无法住人的“鬼城”。</p>
<p>这篇文章并非是要劝退所有对底层技术抱有热情的开发者。正如作者所说，如果你想<strong>学习</strong>，从零开始或加入 Redox 这样的项目，会是一段极其宝贵的经历。但如果你想构建一个<strong>被广泛采用</strong>的新 OS，你面对的将不仅仅是技术挑战，更是一个需要说服全球成千上万开发者为你“投票”的社会学难题。</p>
<p>这或许就是对那些仍在坚持构建新 OS 的探索者们，我们应该报以最高敬意的原因。因为他们挑战的，不仅仅是代码，更是一整个时代建立起来的软件文明。</p>
<p>资料链接：https://blog.wellosoft.net/writing-a-brand-new-os-is-almost-impossible-by-now</p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/08/16/brand-new-os-impossible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为何Go语言迟迟未能拥抱 io_uring？揭秘集成的三大核心困境</title>
		<link>https://tonybai.com/2025/08/11/why-go-not-embrace-iouring/</link>
		<comments>https://tonybai.com/2025/08/11/why-go-not-embrace-iouring/#comments</comments>
		<pubDate>Mon, 11 Aug 2025 00:06:40 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[CQ]]></category>
		<category><![CDATA[epoll]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[IO]]></category>
		<category><![CDATA[io_uring]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[P]]></category>
		<category><![CDATA[processor]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[scylladb]]></category>
		<category><![CDATA[SQ]]></category>
		<category><![CDATA[异步IO]]></category>
		<category><![CDATA[标准库]]></category>
		<category><![CDATA[运行时]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=5025</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/08/11/why-go-not-embrace-iouring 大家好，我是Tony Bai。 在 Linux I/O 的世界里，io_uring 如同划破夜空的流星，被誉为“终极接口”。它承诺以无与伦比的效率，为数据密集型应用带来革命性的性能提升。正如高性能数据库 ScyllaDB 在其官方博文中所展示的，io_uring 能够将系统性能推向新的高峰。 然而，一个令人费解的问题摆在了所有 Go 开发者面前：作为云原生infra和并发编程的标杆，Go 语言为何对这颗唾手可得的“性能银弹”表现得如此审慎，甚至迟迟未能将其拥抱入标准库的怀抱？一场在 Go 官方仓库持续了五年之久的 Issue 讨论（#31908），为我们揭开了这层神秘的面纱。这并非简单的技术取舍，而是 Go 在其设计哲学、工程现实与安全红线之间进行反复权衡的结果。本文将深入这场讨论，为您揭秘阻碍 io_uring 在 Go 中落地的三大核心困境。 io_uring：一场 I/O 模型的革命 要理解这场争论，我们首先需要明白 io_uring 究竟是什么，以及它为何具有革命性。 在 io_uring 出现之前，Linux 上最高效的 I/O 模型是 epoll。epoll 采用的是一种“拉（pull）”模型：应用程序通过一次 epoll_wait 系统调用来询问内核：“有我关心的文件描述符准备好进行 I/O 了吗？”。内核响应后，应用程序需要再为每个就绪的描述符分别发起 read 或 write 系统调用。这意味着，处理 N 个 I/O 事件至少需要 N+1 次系统调用。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/why-go-not-embrace-iouring-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/08/11/why-go-not-embrace-iouring">本文永久链接</a> &#8211; https://tonybai.com/2025/08/11/why-go-not-embrace-iouring</p>
<p>大家好，我是Tony Bai。</p>
<p>在 Linux I/O 的世界里，io_uring 如同划破夜空的流星，被誉为“终极接口”。它承诺以无与伦比的效率，为数据密集型应用带来革命性的性能提升。正如高性能数据库 ScyllaDB 在其<a href="https://www.scylladb.com/2020/05/05/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux/">官方博文</a>中所展示的，io_uring 能够将系统性能推向新的高峰。</p>
<p>然而，一个令人费解的问题摆在了所有 Go 开发者面前：作为云原生infra和并发编程的标杆，Go 语言为何对这颗唾手可得的“性能银弹”表现得如此审慎，甚至迟迟未能将其拥抱入标准库的怀抱？一场在 Go 官方仓库持续了五年之久的 <a href="https://github.com/golang/go/issues/31908">Issue 讨论（#31908）</a>，为我们揭开了这层神秘的面纱。这并非简单的技术取舍，而是 Go 在其设计哲学、工程现实与安全红线之间进行反复权衡的结果。本文将深入这场讨论，为您揭秘阻碍 io_uring 在 Go 中落地的三大核心困境。</p>
<h2>io_uring：一场 I/O 模型的革命</h2>
<p>要理解这场争论，我们首先需要明白 io_uring 究竟是什么，以及它为何具有革命性。</p>
<p>在 io_uring 出现之前，Linux 上最高效的 I/O 模型是 epoll。epoll 采用的是一种“拉（pull）”模型：应用程序通过一次 epoll_wait 系统调用来询问内核：“有我关心的文件描述符准备好进行 I/O 了吗？”。内核响应后，应用程序需要再为每个就绪的描述符分别发起 read 或 write 系统调用。这意味着，<strong>处理 N 个 I/O 事件至少需要 N+1 次系统调用</strong>。</p>
<p>而 io_uring 则彻底改变了游戏规则。它在内核与用户空间之间建立了两个共享内存环形缓冲区：<strong>提交队列（Submission Queue, SQ）</strong>和<strong>完成队列（Completion Queue, CQ）</strong>。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/why-go-not-embrace-iouring-2.png" alt="" /></p>
<p>其工作流程如下：</p>
<ol>
<li><strong>提交请求:</strong> 应用程序将一个或多个 I/O 请求（如读、写、连接等）作为条目（SQE）放入提交队列中。这仅仅是内存操作，<strong>几乎没有开销</strong>。</li>
<li><strong>通知内核:</strong> 应用通过一次 io_uring_enter 系统调用，通知内核“请处理队列中的所有请求”。在特定模式（SQPOLL）下，这个系统调用甚至可以被省略。</li>
<li><strong>内核处理:</strong> 内核从提交队列中批量取走所有请求，并异步地执行它们。</li>
<li><strong>返回结果:</strong> 内核将每个操作的结果作为一个条目（CQE）放入完成队列。这同样只是内存操作。</li>
<li><strong>应用收获:</strong> 应用程序直接从完成队列中读取结果，无需为每个结果都发起一次系统调用。</li>
</ol>
<p>这种模式的优势是颠覆性的：<strong>它将 N+1 次系统调用压缩为 1 次甚至 0 次</strong>，极大地降低了上下文切换的开销，并且首次为 Linux 带来了真正意义上的、无需 O_DIRECT 标志的<strong>异步文件 I/O</strong>。</p>
<h2>最初的希望：一剂治愈 Go I/O“顽疾”的良药</h2>
<p>讨论伊始，Go 社区对 io_uring 寄予厚望，期待它能一举解决 Go 在 I/O 领域的两大历史痛点：</p>
<ol>
<li><strong>真正的异步文件 I/O：</strong> Go 的网络 I/O 基于 epoll 实现了非阻塞，但文件 I/O 本质上是阻塞的。为了避免阻塞系统线程，Go 运行时不得不维护一个线程池来处理文件操作。正如社区所期待的，io_uring 最大的吸引力在于<strong>“移除对文件 I/O 线程池的需求”</strong>，让文件 I/O 也能享受与网络 I/O 同等的高效与优雅。</li>
<li><strong>极致的网络性能：</strong> 对于高并发服务器，io_uring 通过将多个 read/write 操作打包成一次系统调用，能显著降低内核态与用户态切换的开销，这在“熔断”和“幽灵”漏洞导致 syscall 成本飙升的后时代尤为重要。</li>
</ol>
<p>然而，Go 核心团队很快就为这股热情泼上了一盆“冷水”。</p>
<h2>核心困境一：运行时模型的“哲学冲突”</h2>
<p>这是阻碍 io_uring 集成最根本、最核心的障碍。Go 的成功很大程度上归功于其简洁的并发模型——goroutine，以及对开发者完全透明的调度机制。但 io_uring 的工作模式，与 Go 运行时的核心哲学存在着深刻的冲突。</p>
<p><strong>冲突的焦点在于“透明性”</strong>。Ian Lance Taylor 多次强调，问题不在于 io_uring 能否在 Go 中使用，而在于能否<strong>“透明地”</strong>将其融入现有的 os 和 net 包，而不破坏 Go 开发者早已习惯的 API 和心智模型。</p>
<p>io_uring 的性能优势源于<strong>批处理</strong>。但 Go 的标准库 API，如 net.Conn.Read()，是一个独立的、阻塞式的调用。Go 用户习惯于在独立的 goroutine 中处理独立的连接。如何将这些分散的独立 I/O 请求，在用户无感知的情况下，<strong>“透明地”</strong>收集起来，打包成批？这几乎是一个无解的难题。</p>
<p>社区也提出了“每个 P (Processor) 一个 io_uring 环”的设想，但 Ian 指出这会引入极高的复杂性，包括环的争用、空闲 P 的等待与唤醒、P 与 M 切换时的状态管理等。正如一些社区成员所总结的，io_uring 需要一种全新的 I/O 模式，而这与 Go 现有网络模型的模式完全不同。强行“透明”集成，无异于“在不破坏现有 API 的情况下进行不必要的破坏”。</p>
<h2>核心困境二：现实世界的“安全红线”</h2>
<p>如果说运行时模型的冲突是理论上的“天堑”，那么安全问题则是实践中不可逾越的“红线”。</p>
<p>在 2024 年初，社区成员 jakebailey 抛出了一个重磅消息：<strong>出于安全考虑，Docker 默认的 seccomp 配置文件已经禁用了 io_uring</strong>。</p>
<blockquote>
<p><strong>引用自 Docker 的 commit 信息:</strong> “安全专家普遍认为 io_uring 是不安全的。事实上，Google ChromeOS 和 Android 已经关闭了它，所有 Google 生产服务器也关闭了它。”</p>
</blockquote>
<p>这个消息对标准库集成而言几乎是致命一击。Go 程序最常见的部署环境就是容器。一个不被“普遍情况”支持的特性，无论其性能多么优越，都难以成为Go运行时和标准库的基石。</p>
<h2>核心困境三：追赶一个“移动的目标”</h2>
<p>在这场长达五年的讨论中，io_uring 自身也在飞速进化。其作者<a href="https://github.com/axboe">Jens Axboe</a> 甚至亲自下场，<a href="https://github.com/golang/go/issues/31908#issuecomment-571651387">解答了 Go 团队早期的疑虑</a>，例如移除了并发数限制、解决了事件丢失问题等。</p>
<p>但这恰恰揭示了第三重困境：<strong>要集成一个仍在高速演进、API 不断变化的底层接口，本身就充满了风险和不确定性</strong>。标准库追求的是极致的稳定性和向后兼容性。过早地依赖一个“移动的目标”，可能会带来持续的维护负担和潜在的破坏性变更。对于一个需要支持多个内核版本的语言运行时来说，这种复杂性是难以承受的。</p>
<h2>小结：审慎的巨人与退潮的社区热情</h2>
<p>io_uring 未能在 Go中落地，并非因为 Go 团队忽视性能，而是其成熟与审慎的体现。三大核心困境层层递进，揭示了其迟迟未能拥抱 io_uring 的深层原因：<strong>哲学上的范式冲突、现实中的安全红线、以及工程上的稳定性质疑。</strong></p>
<p>然而，现实比理论更加残酷。在讨论初期，Go 社区曾涌现出一批充满激情的用户层 io_uring 库，如 giouring、go-uring 等，它们是开发者们探索新大陆的先锋。但时至 2025 年，我们观察到一个令人沮丧的趋势：<strong>这些曾经的追星项目大多已陷入沉寂，更新寥寥，星光黯淡。</strong></p>
<p>与之形成鲜明对比的是，Rust 的 tokio-uring 库依然保持着旺盛的生命力，社区活跃，迭代频繁。这似乎在暗示，问题不仅在于 io_uring 本身，更在于它与特定语言运行时模型的“契合度”。<a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIyNzM0MDk0Mg==&amp;action=getalbum&amp;album_id=4036682086282166273#wechat_redirect">Go 运行时的 G-P-M 调度模型</a>和它所倡导的编程范式，使得社区自发的集成尝试也步履维艰，最终热情退潮。</p>
<p>这是否意味着 Go 与 io_uring 将永远无缘？或许未来之路有二：一是等待 io_uring 自身和其生态环境（尤其是安全方面）完全成熟；二是 Go 也许可能会引入一套全新的、<strong>非透明的</strong>、专为高性能 I/O 设计的新标准库包。</p>
<p>在此之前，Go 运行时可能会选择先挖掘 epoll 的全部潜力。这场长达五年的讨论，最终为我们留下了一个深刻的启示：技术的采纳从来不是一场单纯的性能赛跑，它是一场包含了设计哲学、生态现实与工程智慧的复杂博弈。</p>
<p>资料链接：</p>
<ul>
<li>https://github.com/golang/go/issues/31908</li>
<li>https://www.scylladb.com/2020/05/05/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux/</li>
</ul>
<p>关注io_uring在Linux kernel内核演进的小伙伴儿们，可以关注<a href="https://lore.kernel.org/io-uring/">io-uring.vger.kernel.org archive mirror</a>这个页面，或<a href="https://github.com/axboe/liburing/wiki">io_uring作者Jens Axboe的liburing wiki</a>。</p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/08/11/why-go-not-embrace-iouring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go语言正在成为“老旧”生态的“新引擎”？从 FrankenPHP 和新版 TypeScript 编译器谈起</title>
		<link>https://tonybai.com/2025/08/06/go-new-engine-of-old-languages/</link>
		<comments>https://tonybai.com/2025/08/06/go-new-engine-of-old-languages/#comments</comments>
		<pubDate>Wed, 06 Aug 2025 00:09:10 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[fpm]]></category>
		<category><![CDATA[FrankenPHP]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[Gopher]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[supervisor]]></category>
		<category><![CDATA[TS]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[typescript-go]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=5001</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/08/06/go-new-engine-of-old-languages 大家好，我是Tony Bai。 我先来描述一种编程语言生态，请你猜猜它是谁： 它诞生于 1995 年，旨在为当时一个叫“万维网”的新平台构建应用。起初只是个小项目，却在互联网泡沫中野蛮生长，成为史上用户最广的语言之一。它曾被“严肃”的程序员们嘲笑了几十年，但最终得到了科技巨头的加持，迎来了事业的第二春。如今，它正迈向 30 岁，而其生态中最重要的一环——它的一个超集语言的编译器，正在被 Go 语言 重写以驱动未来。 你的第一反应，很可能是 JavaScript 生态。完全正确。这个超集语言，就是 TypeScript。 但这段描述，同样完美地适用于另一个名字：PHP。它也诞生于 1995 年，同样在 Web 浪潮中崛起，同样被嘲笑，同样迎来了第二春，而现在，一个基于 Go 语言 的新项目，也正在驱动着它的未来。 这两种语言，就像是同一枚硬币的两面，共同定义了 Web 编程的客户端与服务器端。而今天，我想和你聊的，正是它们故事中那个令人意想不到的、与我们 Gopher 息息相关的交集——Go 语言的角色。 编程语言中的“丰田卡罗拉” 在深入主题之前，我们必须先理解 PHP 的生态位。一篇精彩的博文将其比作编程语言中的“丰田卡罗拉”——无聊、坚固、简单、实惠。 它或许永远不会出现在技术发布会最酷炫的 Demo 上，但它和它经典的 LAMP（Linux, Apache, MySQL, PHP）组合，让全世界数以百万计的普通开发者，能以最低的成本、最可靠的方式，解决一个最实际的问题：搭建一个能用的网站。 C++ 的创造者 Bjarne Stroustrup 有一句名言：“世界上只有两种语言：一种是被人拼命吐槽的，另一种是没人用的。” PHP 显然属于前者。它曾被嘲笑为“糟糕设计的集合体”，但它也支撑着全球 70% 以上的网站。这个数字，无论你用何种挑剔的眼光审视，都无法否认其巨大的成功和顽强的生命力。 Go：一个意想不到的“新引擎” 多年以来，PHP 和 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/go-new-engine-of-old-languages-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/08/06/go-new-engine-of-old-languages">本文永久链接</a> &#8211; https://tonybai.com/2025/08/06/go-new-engine-of-old-languages</p>
<p>大家好，我是Tony Bai。</p>
<p>我先来描述一种编程语言生态，请你猜猜它是谁：</p>
<blockquote>
<p>它诞生于 1995 年，旨在为当时一个叫“万维网”的新平台构建应用。起初只是个小项目，却在互联网泡沫中野蛮生长，成为史上用户最广的语言之一。它曾被“严肃”的程序员们嘲笑了几十年，但最终得到了科技巨头的加持，迎来了事业的第二春。如今，它正迈向 30 岁，而其生态中最重要的一环——它的一个超集语言的编译器，正在被 <strong>Go 语言</strong> 重写以驱动未来。</p>
</blockquote>
<p>你的第一反应，很可能是 <strong>JavaScript</strong> 生态。完全正确。这个超集语言，就是 TypeScript。</p>
<p>但这段描述，同样完美地适用于另一个名字：<strong>PHP</strong>。它也诞生于 1995 年，同样在 Web 浪潮中崛起，同样被嘲笑，同样迎来了第二春，而现在，一个基于 <strong>Go 语言</strong> 的新项目，也正在驱动着它的未来。</p>
<p>这两种语言，就像是同一枚硬币的两面，共同定义了 Web 编程的客户端与服务器端。而今天，我想和你聊的，正是它们故事中那个令人意想不到的、与我们 Gopher 息息相关的交集——Go 语言的角色。</p>
<h2>编程语言中的“丰田卡罗拉”</h2>
<p>在深入主题之前，我们必须先理解 PHP 的生态位。<a href="https://deprogrammaticaipsum.com/the-toyota-corolla-of-programming/">一篇精彩的博文</a>将其比作<strong>编程语言中的“丰田卡罗拉”——无聊、坚固、简单、实惠。</strong></p>
<p>它或许永远不会出现在技术发布会最酷炫的 Demo 上，但它和它经典的 LAMP（Linux, Apache, MySQL, PHP）组合，让全世界数以百万计的普通开发者，能以最低的成本、最可靠的方式，解决一个最实际的问题：搭建一个能用的网站。</p>
<p>C++ 的创造者 Bjarne Stroustrup 有一句名言：“世界上只有两种语言：一种是被人拼命吐槽的，另一种是没人用的。”</p>
<p>PHP 显然属于前者。它曾被嘲笑为“糟糕设计的集合体”，但它也支撑着全球 70% 以上的网站。这个数字，无论你用何种挑剔的眼光审视，都无法否认其巨大的成功和顽强的生命力。</p>
<h2>Go：一个意想不到的“新引擎”</h2>
<p>多年以来，PHP 和 JavaScript 这两个庞大的生态，在各自的轨道上独立演进。但最近，一个令人瞩目的趋势正在浮现：<strong>Go 语言，正在成为驱动这两个“老旧”生态进行现代化改造的“新引擎”。</strong></p>
<p><strong>案例一：FrankenPHP &#8211; 用 Go 为 PHP “换心”</strong></p>
<p>如果你经历过在容器时代部署 PHP 应用的痛苦，你一定对 Nginx + FPM + Supervisor 这套复杂而脆弱的“三件套”记忆犹新。配置繁琐、性能瓶颈、进程管理困难，每一个都是噩梦。</p>
<p>现在，<strong>FrankenPHP</strong> 出现了。这是一个用 Go 语言编写的、全新的、高性能的 PHP 应用服务器，<a href="https://thephp.foundation/blog/2025/06/08/php-30/">最近已被 PHP 基金会正式采纳</a>。</p>
<p>它的革命性在于：</p>
<ol>
<li><strong>部署极简</strong>：它是一个<strong>单一的静态 Go 二进制文件</strong>。部署一个 PHP 应用，现在只需要一个包含这个二进制文件和你的 PHP 代码的、极其简单的 Dockerfile。Nginx, FPM, Supervisor 通通被扔进了历史的垃圾堆。</li>
<li><strong>性能卓越</strong>：它内置了一个基于 Caddy（另一个伟大的 Go 项目）的高性能 HTTP 服务器，并提供了全新的执行模型，性能远超传统模式。</li>
<li><strong>能力强大</strong>：Go 强大的并发能力和成熟的网络库，让 FrankenPHP 天生具备了现代应用服务器所需的一切。</li>
</ol>
<p>是 Go 语言，以一种釜底抽薪的方式，解决了 PHP 生态在云原生时代最大的部署和运维难题。</p>
<p><strong>案例二：新版 TypeScript 编译器 &#8211; 用 Go 提速</strong></p>
<p>无独有偶，在 Web 的另一端，JavaScript 生态也迎来了 Go 语言的赋能。微软最近宣布了一个激动人心的项目：用 <a href="https://tonybai.com/2025/03/13/interview-with-anders-hejlsberg">Go 语言来重写 TypeScript 编译器</a>。</p>
<p>TypeScript 作为 JavaScript 的超集，已经成为构建大型、复杂前端和后端应用的事实标准。它的编译器，是整个生态中至关重要的基础设施。</p>
<p>为什么选择 Go？答案同样简单而直接：<strong>性能</strong>，<a href="https://tonybai.com/2025/03/13/interview-with-anders-hejlsberg">当然也有其他一些考虑</a>。</p>
<p>编译器本质上是极其消耗 CPU 的密集型任务。随着 TypeScript 项目日益庞大和复杂，原有的编译器性能逐渐成为瓶颈。而 Go 语言，凭借其接近 C/C++ 的运行效率、卓越的并发模型以及内存安全保证，成为了构建下一代高性能编译器的理想选择。</p>
<h2>Go 语言的新角色：从“建新城”到“改旧都”</h2>
<p>这两个案例，揭示了 Go 语言一个正在崛起的新角色。</p>
<p>过去，我们谈论 Go，更多的是用它来<strong>构建全新的云原生微服务</strong>——我们用它在一片空地上“建新城”。但现在，我们看到，Go 凭借其三大核心优势，正在成为<strong>改造和赋能现有庞大技术生态的“基础设施底座”</strong>。我们开始用它来“改造旧都”。</p>
<p>这三大优势是：</p>
<ol>
<li><strong>极致的性能</strong>：对于需要压榨性能的系统工具（如编译器、服务器），Go 提供了一个远比 C/C++ 更安全、更具生产力的选择。</li>
<li><strong>无与伦比的部署简便性</strong>：静态链接的单一二进制文件，是为容器和 DevOps 时代而生的“终极交付物”。</li>
<li><strong>现代化的并发模型</strong>：Goroutine 和 Channel，为解决现代软件中无处不在的并发问题，提供了最优雅、最高效的语言级方案。</li>
</ol>
<p>Go 语言，正在从一个单纯的应用开发语言，下沉为更底层的、为其他生态提供核心动力的“引擎层”。</p>
<h2>结论：拥抱务实，而非追逐光环</h2>
<p>PHP 的故事，以及它与 Go 的这段奇妙姻缘，带给我们最深刻的启示，是一种超越语言之争的<strong>工程实用主义精神</strong>。</p>
<p>真正的技术进步，不仅仅在于创造全新的、闪闪发光的东西，更在于用更强大的工具，去务实地优化、改造和盘活那些已经支撑着世界运转的庞大系统。这是一种更深沉、更具影响力的贡献。</p>
<p>而 Go 语言，正在这个伟大的进程中，扮演着越来越重要的角色。作为 Gopher，我们不仅在“建新城”，我们也在为这个数字世界的“旧都”，换上一个更强劲、更可靠的“新引擎”。这，或许是 Go 语言未来最激动人心的篇章之一。</p>
<p>资料链接：https://deprogrammaticaipsum.com/the-toyota-corolla-of-programming/</p>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/08/06/go-new-engine-of-old-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go官方 HTTP/3 实现终迎曙光：x/net/http3 提案启动，QUIC 基础已就位</title>
		<link>https://tonybai.com/2025/08/02/proposal-http3/</link>
		<comments>https://tonybai.com/2025/08/02/proposal-http3/#comments</comments>
		<pubDate>Fri, 01 Aug 2025 22:58:34 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[0-RTT]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[crypto]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[gRPC]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[HTTP2]]></category>
		<category><![CDATA[http3]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[QUIC]]></category>
		<category><![CDATA[quic-go]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[TLS]]></category>
		<category><![CDATA[WebTransport]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[队头阻塞]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=4985</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/08/02/proposal-http3 大家好，我是Tony Bai。 在社区长达数年的热切期盼之后，Go 官方终于迈出了支持 HTTP/3 的关键一步。一项编号为#70914的新提案，正式建议在 x/net/http3 中添加一个实验性的 HTTP/3 实现。这一进展建立在另一项更基础的提案 #58547(x/net/quic) 之上，该提案的实现已取得重大进展，并已从内部包移至公开的 x/net/quic。这意味着 Go 的网络栈即将迎来一次基于 UDP 的、彻底的现代化升级。本文将带您回顾 Go 社区对 HTTP/3 的漫长期待，深入解读官方 QUIC 和 HTTP/3 的实现策略，并探讨其对未来 Go 网络编程的深远影响。 一场长达五年的等待 对 HTTP/3 的支持，可以说是 Go 社区近年来呼声最高的功能之一。早在 2019 年，issue #32204 就被创建，用于追踪在标准库中支持 HTTP/3 的进展。在随后的五年里，随着 Chrome、Firefox 等主流浏览器以及 Cloudflare 等基础设施提供商纷纷拥抱 HTTP/3，社区的期待也日益高涨。 在此期间，由 Marten Seemann 维护的第三方库 quic-go 成为了 Go 生态中事实上的标准，为 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/proposal-http3-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/08/02/proposal-http3">本文永久链接</a> &#8211; https://tonybai.com/2025/08/02/proposal-http3</p>
<p>大家好，我是Tony Bai。</p>
<p>在社区长达数年的热切期盼之后，Go 官方终于迈出了支持 HTTP/3 的关键一步。一项编号为<a href="https://github.com/golang/go/issues/70914">#70914的新提案</a>，正式建议在 x/net/http3 中添加一个实验性的 HTTP/3 实现。这一进展建立在另一项更基础的提案 <a href="https://github.com/golang/go/issues/58547">#58547(x/net/quic) 之上</a>，该提案的实现已取得重大进展，并已从内部包移至公开的 x/net/quic。这意味着 Go 的网络栈即将迎来一次基于 UDP 的、彻底的现代化升级。本文将带您回顾 Go 社区对 HTTP/3 的漫长期待，深入解读官方 QUIC 和 HTTP/3 的实现策略，并探讨其对未来 Go 网络编程的深远影响。</p>
<h2>一场长达五年的等待</h2>
<p>对 HTTP/3 的支持，可以说是 Go 社区近年来呼声最高的功能之一。早在 2019 年，<a href="https://github.com/golang/go/issues/32204">issue #32204</a> 就被创建，用于追踪在标准库中支持 HTTP/3 的进展。在随后的五年里，随着 Chrome、Firefox 等主流浏览器以及 Cloudflare 等基础设施提供商纷纷拥抱 HTTP/3，社区的期待也日益高涨。</p>
<p>在此期间，由 Marten Seemann 维护的第三方库 <a href="https://github.com/quic-go/quic-go">quic-go</a> 成为了 Go 生态中事实上的标准，为 <a href="https://tonybai.com/2024/11/07/exploring-caddy/">Caddy</a> 等项目提供了生产级的 QUIC 和 HTTP/3 支持。然而，许多开发者仍然期盼一个“电池内置”的官方解决方案，以保证与 Go 标准库（特别是 net/http 和 crypto/tls）的最佳集成和长期维护。</p>
<p>Go 团队对此一直持谨慎态度，主要原因在于：</p>
<ol>
<li><strong>协议稳定性</strong>：在 QUIC 和 HTTP/3 的 IETF 标准（RFC 9000 和 RFC 9114）正式发布前，过早投入实现可能会面临巨大的变更成本。</li>
<li><strong>API 设计复杂性</strong>：QUIC 协议引入了连接、流、0-RTT 等新概念，其 API 设计需要与现有的 net.Conn 和 net.Listener 体系进行权衡，这是一个巨大的挑战。</li>
<li><strong>实现难度巨大</strong>：一个高性能、安全的 QUIC 协议栈，涉及复杂的流量控制、拥塞控制、丢包恢复等机制，其实现工作量远超 HTTP/2。</li>
</ol>
<h2>两步走战略：先 QUIC，后 HTTP/3</h2>
<p>现在，随着协议的标准化和 crypto/tls 中 QUIC 支持的落地，Go 团队终于启动了官方的实现计划，并采取了清晰的“两步走”战略。</p>
<h3>第一步：构建 QUIC 基础 (x/net/quic)</h3>
<p>提案 <strong>#58547</strong> 旨在 golang.org/x/net/quic 中提供一个 QUIC 协议的实现。这是支持 HTTP/3 的必要前提。经过一段时间的开发，该包的实现已取得重大进展。</p>
<p>Go 团队的核心成员 neild 最近宣布，<strong>该 QUIC 实现已从内部包 (internal/quic) 移至公开的 x/net/quic</strong>，虽然仍处于实验阶段且 API 可能变化，但这标志着它已足够成熟，可以供社区“尝鲜”和提供反馈。</p>
<p><strong>x/net/quic 的核心 API 概念：</strong></p>
<ul>
<li><strong>Endpoint (原 Listener)</strong>: 在一个网络地址上监听 QUIC 流量。</li>
<li><strong>Conn</strong>: 代表一个客户端和服务器之间的 QUIC 连接，可以承载多个流。</li>
<li><strong>Stream</strong>: 一个有序、可靠的字节流，类似于一个 TCP 连接。</li>
</ul>
<pre><code class="go">// 客户端发起连接
conn, err := quic.Dial(ctx, "udp", "127.0.0.1:8000", &amp;quic.Config{})

// 服务器接受连接
endpoint, err := quic.Listen("udp", "127.0.0.1:8000", &amp;quic.Config{})
conn, err := endpoint.Accept(ctx)

// 在连接上创建和接受流
stream, err := conn.NewStream(ctx)
stream, err := conn.AcceptStream(ctx)

// 对流进行读写操作
n, err = stream.Read(buf)
n, err = stream.Write(buf)
stream.Close()
</code></pre>
<p>值得注意的是，官方实现并未直接采用 quic-go 的代码，rsc 在讨论中解释了原因，包括 API 设计理念的差异、代码风格、测试框架依赖以及从零开始实现可能更易于维护等。</p>
<h3>第二步：实现 HTTP/3 (x/net/http3)</h3>
<p>在 x/net/quic 的基础上，提案 <strong>#70914</strong> 正式启动了 x/net/http3 的开发。与 QUIC 一样，它将首先在内部包 (x/net/internal/http3) 中进行开发，待 API 稳定后再移至公开包，并提交最终的 API 审查提案。</p>
<p>从 gopherbot 自动发布的 CL（代码变更）列表中，我们可以看到 HTTP/3 的实现正在紧锣密鼓地进行中，涵盖了 QPACK（HTTP/3 的头部压缩算法）、Transport、Server、请求/响应体传输等核心组件。</p>
<h2>对 Go 网络编程的深远影响</h2>
<p>官方 QUIC 和 HTTP/3 的到来，将为 Go 开发者带来革命性的变化：</p>
<ol>
<li>
<p><strong>透明的协议升级</strong>：可以预见，未来的 net/http 包将能够像当年无缝支持 HTTP/2 一样，透明地支持 HTTP/3。开发者可能无需修改现有代码，http.Get(“https://example.com/”) 就可能自动通过 UDP 下的 QUIC 协议执行，正如 ianlancetaylor 在讨论中确认的那样。</p>
</li>
<li>
<p><strong>解决队头阻塞 (Head-of-Line Blocking)</strong>：HTTP/3 最大的优势之一是解决了 TCP 队头阻塞问题。对于需要处理大量并发请求的 Go 微服务，这意味着更低的延迟和更高的吞吐量，尤其是在网络不稳定的情况下。</p>
</li>
<li>
<p><strong>更快的连接建立</strong>：QUIC 支持 0-RTT 连接建立，对于需要频繁建立新连接的应用场景，可以显著降低握手延迟。</p>
</li>
<li>
<p><strong>原生多路复用传输层</strong>：QUIC 本身就是一个多路复用的传输协议。虽然提案的初期重点是支持 HTTP/3，但一个标准化的 QUIC API 将为 gRPC over QUIC、WebTransport 以及其他需要多流、低延迟通信的自定义协议打开大门。</p>
</li>
</ol>
<h2>终极形态——当 QUIC 走进 Linux 内核</h2>
<p>尽管 x/net/quic 的开发标志着 Go 官方在用户空间迈出了重要一步，但关于 QUIC 协议的终极愿景，则指向了更深的层次：<strong>Linux 内核原生支持</strong>。最近，由 Xin Long 提交的一系列补丁，首次<a href="https://lwn.net/Articles/1029851/">将内核态 QUIC 的实现提上了 mainline 的议程</a>。</p>
<p><strong>为什么要将 QUIC 移入内核？</strong></p>
<p>将 QUIC 从用户空间库（如 x/net/quic 或 quic-go）下沉到内核，主要有以下几个核心动机：</p>
<ol>
<li><strong>极致的性能潜力</strong>：内核实现能够充分利用现代网络硬件的<strong>协议卸载（protocol offload）</strong>能力，例如 <a href="https://docs.kernel.org/networking/segmentation-offloads.html">GSO/GRO (Generic Segmentation/Receive Offload)</a>。这将极大地降低 CPU 在处理大量小型 UDP 包时的开销，释放出用户空间实现难以企及的性能潜力。</li>
<li><strong>更广泛的可用性</strong>：一旦 QUIC 成为内核支持的协议（如 IPPROTO_QUIC），任何应用程序都可以像使用 TCP 或 UDP 一样，通过标准的 socket() 系统调用来使用它，而无需绑定到任何特定的用户空间库。</li>
<li><strong>统一的生态系统</strong>：内核级别的支持将极大地促进生态系统的发展。Samba、NFS 甚至 curl 等项目已经表现出对内核态 QUIC 的浓厚兴趣。对于 Go 开发者而言，这意味着未来不仅是 net/http，甚至标准库的其他部分或底层系统调用，都可能从 QUIC 中受益。</li>
</ol>
<p><strong>当前的实现与挑战</strong></p>
<p>Xin Long 的补丁集展示了一个高度集成化的设计：</p>
<ul>
<li><strong>熟悉的 Sockets API</strong>：开发者将能够使用 socket(AF_INET, SOCK_STREAM, IPPROTO_QUIC) 这样的调用来创建一个 QUIC 套接字，并继续使用 bind(), connect(), listen(), accept() 等熟悉的 API。</li>
<li><strong>用户空间 TLS 握手</strong>：与内核 TLS (KTLS) 的设计类似，复杂的 TLS 握手和证书验证逻辑仍然被委托给用户空间处理。一旦握手完成，内核将接管加密和解密的数据流。</li>
<li><strong>性能仍在优化</strong>：初步的基准测试显示，当前的内核实现性能尚不及 KTLS 甚至原生 TCP。这主要是由于缺少硬件卸载支持、额外的内存拷贝以及 QUIC 头部加密的开销。但随着实现的成熟和硬件厂商的跟进，这一差距有望迅速缩小。</li>
</ul>
<p>不过，预计内核态 QUIC 的合入可能要到 2026 年甚至更晚。</p>
<h2>小结：Go 网络生态的下一座里程碑</h2>
<p>尽管距离在 Go 标准库中稳定地使用 http.Server{&#8230;}.ListenAndServeQUIC() 可能还有一段时间，但 x/net/quic 的公开和 x/net/http3 提案的启动，标志着 Go 官方已经吹响了向下一代网络协议进军的号角。</p>
<p>对于 Go 社区而言，这是一个令人振奋的信号。它不仅回应了开发者们长久以来的期待，也确保了 Go 在未来依然是构建高性能、现代化网络服务的首选语言。我们期待着 x/net/http3 的成熟，并最终看到它被无缝地集成到 net/http 标准库中，为所有 Go 开发者带来更快、更可靠的网络体验。</p>
<h2>参考资料</h2>
<ul>
<li>https://github.com/golang/go/issues/70914</li>
<li>https://github.com/golang/go/issues/58547</li>
<li>https://github.com/golang/go/issues/32204</li>
<li>https://lwn.net/Articles/1029851/</li>
</ul>
<hr />
<p>你的Go技能，是否也卡在了“熟练”到“精通”的瓶颈期？</p>
<ul>
<li>想写出更地道、更健壮的Go代码，却总在细节上踩坑？</li>
<li>渴望提升软件设计能力，驾驭复杂Go项目却缺乏章法？</li>
<li>想打造生产级的Go服务，却在工程化实践中屡屡受挫？</li>
</ul>
<p>继《<a href="http://gk.link/a/10AVZ">Go语言第一课</a>》后，我的《<a href="http://gk.link/a/12yGY">Go语言进阶课</a>》终于在极客时间与大家见面了！</p>
<p>我的全新极客时间专栏 《<a href="http://gk.link/a/12yGY">Tony Bai·Go语言进阶课</a>》就是为这样的你量身打造！30+讲硬核内容，带你夯实语法认知，提升设计思维，锻造工程实践能力，更有实战项目串讲。</p>
<p>目标只有一个：助你完成从“Go熟练工”到“Go专家”的蜕变！ 现在就加入，让你的Go技能再上一个新台阶！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/08/02/proposal-http3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go 1.25新特性前瞻：GC提速，容器更“懂”Go，json有v2了！</title>
		<link>https://tonybai.com/2025/06/14/go-1-25-foresight/</link>
		<comments>https://tonybai.com/2025/06/14/go-1-25-foresight/#comments</comments>
		<pubDate>Sat, 14 Jun 2025 00:06:39 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Cgroup]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[CoreType]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[crypto]]></category>
		<category><![CDATA[DWARF5]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[fmt]]></category>
		<category><![CDATA[GC]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[go.mod]]></category>
		<category><![CDATA[Go1]]></category>
		<category><![CDATA[go1.25]]></category>
		<category><![CDATA[gobuild]]></category>
		<category><![CDATA[godoc]]></category>
		<category><![CDATA[GOEXPERIMENT]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[GOMAXPROCS]]></category>
		<category><![CDATA[goroutine]]></category>
		<category><![CDATA[govet]]></category>
		<category><![CDATA[ignore]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonv2]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[nil]]></category>
		<category><![CDATA[panic]]></category>
		<category><![CDATA[Pointer]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[Sprintf]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[synctest]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[TLS]]></category>
		<category><![CDATA[waitgroup]]></category>
		<category><![CDATA[兼容性]]></category>
		<category><![CDATA[向后兼容性]]></category>
		<category><![CDATA[垃圾回收]]></category>
		<category><![CDATA[垃圾收集器]]></category>
		<category><![CDATA[容器]]></category>
		<category><![CDATA[工具链]]></category>
		<category><![CDATA[指针]]></category>
		<category><![CDATA[编译器]]></category>
		<category><![CDATA[运行时]]></category>
		<category><![CDATA[链接器]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=4817</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/06/14/go-1-25-foresight 大家好，我是Tony Bai。 每年，Go 语言都会以其严谨而高效的节奏，带来两次版本更新。每一次迭代，Go 团队都在底层、工具链和标准库上持续深耕，为我们开发者提供更稳健、更高效、更安全的开发体验。虽然 Go 1.25 的正式版预计在 2025 年 8 月发布，但随着近期Go 1.25RC1版本的推出，我们基于其非最终版的 Release Notes，已经能一窥其核心亮点了。并且，和之前的版本一样，Go 1.25 带来的许多改进，都如同“无形之手”，你可能无需修改一行代码，甚至无需刻意感知，只需简单升级，便能享受到性能的飞跃、诊断能力的提升以及潜藏错误的暴露。这正是 Go 团队践行其核心原则的极致体现。 今天，就让我们一起“未雨绸缪”，聚焦 Go 1.25 中的核心特性，看看它将如何让 Go 语言变得更加强大。 语言层面：兼容至上，细微进化 Go语言对向后兼容性的承诺，是其最受开发者赞誉的特性之一。Go 1.25 再次延续了这一传统：它没有引入任何影响现有 Go 程序的语言语法变更！ 这意味着你可以放心地升级到 Go 1.25，而无需担忧已有的代码库会因此“崩溃”。 尽管如此，语言规范层面仍有细微的整理和优化，例如移除了“core type”的概念，代之以更详细的描述。这些更多是内部设计文档的完善，对日常 Go 程序的编写并无直接影响，但体现了 Go 语言设计本身的严谨性和持续迭代。兼容性，依然是 Go 坚不可摧的基石。 更详细地说明可以参考我之前的文章《Go 1.25规范大扫除：移除“Core Types”，为更灵活的泛型铺路》。 运行时与编译器：性能与可靠性的“幕后推手” 这一部分是 Go 1.25 带来诸多“无形”强大之处的集中体现，它们直接影响着 Go 程序的运行效率和稳定性。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/go-1-25-foresight-1.png" alt="" /></p>
<p><a href="https://tonybai.com/2025/06/14/go-1-25-foresight">本文永久链接</a> &#8211; https://tonybai.com/2025/06/14/go-1-25-foresight</p>
<p>大家好，我是Tony Bai。</p>
<p>每年，Go 语言都会以其严谨而高效的节奏，带来两次版本更新。每一次迭代，Go 团队都在底层、工具链和标准库上持续深耕，为我们开发者提供更稳健、更高效、更安全的开发体验。虽然 Go 1.25 的正式版预计在 2025 年 8 月发布，但随着近期Go 1.25RC1版本的推出，我们基于其非最终版的 Release Notes，已经能一窥其核心亮点了。并且，和之前的版本一样，Go 1.25 带来的许多改进，都如同“无形之手”，你可能无需修改一行代码，甚至无需刻意感知，只需简单升级，便能享受到性能的飞跃、诊断能力的提升以及潜藏错误的暴露。这正是 Go 团队践行其核心原则的极致体现。</p>
<p>今天，就让我们一起“未雨绸缪”，聚焦 Go 1.25 中的核心特性，看看它将如何让 Go 语言变得更加强大。</p>
<h2>语言层面：兼容至上，细微进化</h2>
<p>Go语言对<strong>向后兼容性</strong>的承诺，是其最受开发者赞誉的特性之一。Go 1.25 再次延续了这一传统：<strong>它没有引入任何影响现有 Go 程序的语言语法变更！</strong> 这意味着你可以放心地升级到 Go 1.25，而无需担忧已有的代码库会因此“崩溃”。</p>
<p>尽管如此，语言规范层面仍有细微的整理和优化，例如<a href="https://tonybai.com/2025/03/27/remove-coretypes-from-go-spec">移除了“core type”的概念</a>，代之以更详细的描述。这些更多是内部设计文档的完善，对日常 Go 程序的编写并无直接影响，但体现了 Go 语言设计本身的严谨性和持续迭代。兼容性，依然是 Go 坚不可摧的基石。</p>
<blockquote>
<p>更详细地说明可以参考我之前的文章《<a href="https://tonybai.com/2025/03/27/remove-coretypes-from-go-spec/">Go 1.25规范大扫除：移除“Core Types”，为更灵活的泛型铺路</a>》。</p>
</blockquote>
<h2>运行时与编译器：性能与可靠性的“幕后推手”</h2>
<p>这一部分是 Go 1.25 带来诸多“无形”强大之处的集中体现，它们直接影响着 Go 程序的运行效率和稳定性。</p>
<h3>容器感知型 GOMAXPROCS：更懂容器的 CPU 脾气</h3>
<p>在容器化部署日益普及的今天，Go 程序在 Kubernetes 等环境中运行，常常会遇到一个问题：GOMAXPROCS（控制 Go 运行时使用的最大 CPU 核心数）默认值是宿主机逻辑 CPU 数，而非容器实际被分配的 CPU 限制。这可能导致 CPU 资源浪费，或程序试图抢占过多资源，进而引发调度问题。</p>
<p>Go 1.25 带来了重大改进：在 Linux 系统上，Go 运行时现在会<strong>默认考虑 cgroup 的 CPU 限制（即容器的 CPU limit）</strong> 来设置 GOMAXPROCS 的默认值。如果 CPU limit 低于宿主机核心数，GOMAXPROCS 将自动降到这个更低的限制。此外，Go 运行时还会<strong>定期更新 GOMAXPROCS</strong>，以适应 cgroup 限制的动态变化。这一改进，直接解决了 Go 应用在容器环境中可能存在的资源配置不当问题，使得 Go 程序在 K8s 等云原生环境中运行时更加高效和“智能”，真正做到“物尽其用”。</p>
<blockquote>
<p>更详细地说明可以参考我之前的文章《<a href="https://tonybai.com/2025/04/09/gomaxprocs-defaults-add-cgroup-aware/">Go 1.25新提案：GOMAXPROCS默认值将迎Cgroup感知能力，终结容器性能噩梦？</a>》。</p>
</blockquote>
<h3>新的实验性垃圾收集器：GC开销有望显著降低</h3>
<p>Go 1.25 引入了一个<strong>新的实验性垃圾收集器</strong>，可以通过设置 GOEXPERIMENT=greenteagc 在构建时启用。这个新 GC 的设计旨在改进小对象的标记和扫描性能，并提升 CPU 可扩展性。</p>
<p>根据官方的基准测试，在实际应用中，垃圾回收的开销有望减少 <strong>10% 到 40%</strong>！如果这一实验性优化最终成熟并默认启用，将显著降低 Go 程序的 GC 停顿和整体资源消耗，对于所有 Go 应用（尤其是内存密集型应用）来说，这无疑是巨大的性能红利。</p>
<blockquote>
<p>更详细地说明可以参考我之前的文章《<a href="https://tonybai.com/2025/05/03/go-green-tea-garbage-collector/">Go新垃圾回收器登场：Green Tea GC如何通过内存感知显著降低CPU开销？</a>》。</p>
</blockquote>
<h3>更精准的 Nil Pointer Panic：让隐藏的 Bug 无所遁形</h3>
<p>这是一个虽然可能“打破”一些旧代码，但从长远来看极为重要的改进。Go 1.21 到 1.24 版本之间曾存在一个编译器 bug，导致某些在 os.Open 返回 nil 错误时，仍能“幸运地”继续运行并访问 nil 指针，而没有立即 panic。</p>
<pre><code class="go">// Go 1.21-1.24 曾因编译器bug可能不panic的示例
package main
import "os"
func main() {
    f, err := os.Open("nonExistentFile") // err != nil, f 是 nil
    name := f.Name() // 这里访问了 nil.Name()，但可能不panic
    if err != nil {
        return
    }
    println(name)
}
</code></pre>
<p>在 Go 1.25 中，这个编译器 bug 已经被修复，确保 nil 指针检查会及时且准确地执行。这意味着，上述示例中的代码在 Go 1.25 中将明确引发 nil 指针 panic。</p>
<p>这一变化提高了 Go 程序的运行时可靠性，让那些原本被编译器“侥幸放过”的隐藏 Bug 得以暴露。如果你的代码中存在类似问题，升级后可能需要进行修正，将非 nil 错误检查提前到使用变量之前。</p>
<h3>DWARF版本5 支持：更小更快，调试无忧</h3>
<p>Go 1.25 的编译器和链接器现在默认生成 <strong>DWARFv5 调试信息</strong>。这种更新的调试信息格式，可以有效减少 Go 二进制文件中调试信息所需的空间，并缩短程序的链接时间，对于构建大型 Go 应用程序尤其有利，有助于提升开发效率和 CI/CD 流程的速度。</p>
<blockquote>
<p>更详细地说明可以参考我之前的文章《<a href="https://tonybai.com/2025/05/08/go-dwarf5/">Go 1.25链接器提速、执行文件瘦身：DWARF 5调试信息格式升级终落地</a>》。</p>
</blockquote>
<h2>工具链：武装开发者，提升效率</h2>
<p>Go 语言强大的工具链是其生产力的重要保障。Go 1.25 在此基础上进一步发力，带来多项实用改进。</p>
<ul>
<li><strong>go build -asan 默认内存泄漏检测：Cgo 混合编程更安全</strong></li>
</ul>
<p>对于涉及到 Go 与 C/C++ 代码混合编程的场景，内存泄漏诊断一直是个挑战。Go 1.25 中，go build -asan 选项现在默认在程序退出时进行<strong>内存泄漏检测</strong>，能够报告 C 语言分配但未释放的内存。这大大增强了 Go 混合编程时的内存安全性，有助于发现原生代码中的隐蔽内存问题。</p>
<ul>
<li><strong>go.mod ignore directive：灵活管理超大型仓库</strong></li>
</ul>
<p>go.mod 文件新增了 ignore directive，允许你指定 Go 命令在匹配包模式（如 all 或 ./&#8230;）时应忽略的目录。这些目录下的文件不会被 Go 命令扫描和处理。这对于管理包含大量非 Go 代码、文档、或子模块的超大型代码仓库（Monorepo）非常有用，可以减少构建和扫描时间，提高 Go Modules 的灵活性。</p>
<blockquote>
<p>更详细地说明可以参考我之前的文章《<a href="https://tonybai.com/2025/05/22/go-mod-ignore-directive/">Go工具链进化：go.mod新增ignore指令，破解混合项目构建难题</a>》。</p>
</blockquote>
<ul>
<li><strong>go doc -http：本地文档，即开即用</strong></li>
</ul>
<p>一个看似小巧但能极大提升开发体验的改进。新的 go doc -http 选项，可以启动一个本地文档服务器，显示指定 Go 对象的文档，并自动在浏览器中打开。从此，查阅 Go 文档变得更加便捷、直观。</p>
<blockquote>
<p>更详细地说明可以参考我之前的文章《<a href="https://tonybai.com/2024/09/06/go-doc-add-http-support/">重拾精髓：go doc -http让离线包文档浏览更便捷</a>》。</p>
</blockquote>
<ul>
<li><strong>Vet 工具新分析器：提前发现常见 Bug</strong></li>
</ul>
<p>go vet 工具新增了两个实用的分析器。一个是waitgroup，能报告 sync.WaitGroup.Add 的不正确调用位置（例如在 go 协程内部调用）。另外一个是hostport，能检测并建议修正 fmt.Sprintf(“%s:%d”, host, port) 这种不兼容 IPv6 的地址构造方式，推荐使用 net.JoinHostPort。</p>
<p>这些分析器能帮助开发者在编码阶段就避免常见的并发和网络编程陷阱，进一步提升代码质量和可靠性。</p>
<h2>标准库：功能增强与实验性探索</h2>
<p>标准库的不断演进是 Go 保持活力的重要源泉。Go 1.25 在此也带来了多项关键变化。</p>
<h3>testing/synctest：并发测试的新利器</h3>
<p>Go 1.25 引入了全新的 testing/synctest 包，为并发代码的测试提供了原生支持。它允许你在一个隔离的“气泡”（bubble）中运行测试函数，并且能够控制测试环境中时间（使用伪造时钟）和协程的阻塞/恢复。这极大地方便了并发代码的调试和测试，尤其是那些依赖时间或 Goroutine 调度顺序的复杂场景，提高了测试的可靠性和可控性。</p>
<p>关于该特性，我曾编写过一个“<a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIyNzM0MDk0Mg==&amp;action=getalbum&amp;album_id=1509674724631609344#wechat_redirect">征服Go并发测试</a>”的微专栏，欢迎大家扫描订阅，了解关于synctest的设计、实现以及实践方式。</p>
<p><img src="https://tonybai.com/wp-content/uploads/2025/paid/go-concurrent-test-qr.png" alt="" /></p>
<h3>encoding/json/v2 实验性版本：高性能 JSON 编解码展望</h3>
<p>Go 1.25 引入了一个<strong>新的、实验性的 encoding/json/v2 包</strong>，可以通过设置 GOEXPERIMENT=jsonv2 环境变量在构建时启用。这是对 Go 核心 encoding/json 包的一次重大修订，旨在提升性能和提供更灵活的配置选项。根据初步测试，新实现<strong>在解码性能上显著优于现有版本</strong>，并提供了更多配置 marshaler 和 unmarshaler 的选项。</p>
<p>这是一个令人兴奋的实验性功能，预示着 Go 的 JSON 编解码能力未来将更上一层楼。但作为实验性特性，Go 团队鼓励开发者积极测试自己的程序，并向社区提供反馈，帮助其持续演进。</p>
<blockquote>
<p>关于jsonv2使用的更详细地介绍可以参考我之前的文章《<a href="https://tonybai.com/2025/05/15/go-json-v2/">手把手带你玩转GOEXPERIMENT=jsonv2：Go下一代JSON库初探</a>》。</p>
</blockquote>
<h3>crypto/tls 持续增强：安全与隐私不放松</h3>
<p>Go 在密码学领域的投入从未停止。Go 1.25 中的 crypto/tls 包获得了多项改进：</p>
<ul>
<li>新增 Config.GetEncryptedClientHelloKeys 回调，支持 <strong>Encrypted Client Hello (ECH)</strong> 扩展，进一步提升 TLS 客户端的连接隐私。</li>
<li>默认禁用 TLS 1.2 握手中的 SHA-1 签名算法（但可以通过 tlssha1=1 的 GODEBUG 选项重新启用）。</li>
<li>在<a href="https://tonybai.com/2025/05/21/go-crypto-audit/"> FIPS 140-3 模式</a>下，允许使用更现代的 Ed25519 和 X25519MLKEM768 密钥交换算法。</li>
</ul>
<p>这些改进持续强化了 Go TLS 的安全性、隐私保护和合规性，为迎接未来的量子安全和更严格的安全标准做准备。</p>
<h3>unique 包改进：内存优化再进一步</h3>
<p>unique 包现在能更积极、高效地回收内部化值，有效减少在处理大量重复值时可能出现的内存膨胀问题。这对于 Go 编译器、LSP (Language Server Protocol) 等会大量使用 unique 包的场景，将带来显著的内存和性能优化。</p>
<h3>sync.WaitGroup.Go：并发模式更便捷</h3>
<p>sync.WaitGroup 新增了 Go 方法，为创建和计数 goroutine 提供了一个更便捷的封装，进一步简化了 Go 中常见的并发模式的写法。在之前的文章《<a href="https://tonybai.com/2025/04/03/waitgroup-go-proposal/">WaitGroup.Go要来了？Go官方提案或让你告别Add和Done样板代码</a>》有对这一特性来龙去脉的纤细说明。</p>
<h2>小结</h2>
<p>Go 1.25 的预发布版本，清晰地展现了 Go 语言在性能、可靠性、安全性和开发者体验上的全面提升。这些变化，无论是底层运行时的“无形”优化，还是工具链的智能辅助，都紧密围绕着 Go“生产力”和“生产就绪”的核心原则。</p>
<p>作为 Go 开发者，我们能从中获得的益处是巨大的：你不需要成为系统底层的专家，便能享受到 Go 团队带来的最新技术红利。这种“升级即获益”的模式，正是 Go 语言独特魅力的体现。</p>
<p>Go 语言的旅程永不停歇，它在不断地进化和完善。我鼓励所有 Go 开发者，积极尝试 Go 1.25 RC1 版本，将其应用到你的开发、测试环境中，并向 Go 团队提供宝贵的反馈。你的参与，将是对Go 团队最大的帮助。</p>
<hr />
<p><strong>精进有道，更上层楼</strong></p>
<p><a href="https://mp.weixin.qq.com/s/GWGWTfCRCsOJ_4Pk-pxpHA">极客时间《Go语言进阶课》上架刚好一个月</a>，受到了各位读者的热烈欢迎和反馈。在这里感谢大家的支持。目前我们已经完成了课程模块一『语法强化篇』的 13 讲，为你系统突破 Go 语言的语法认知瓶颈，打下坚实基础。</p>
<p>现在，我们即将进入模块二『设计先行篇』，这不仅包括 API 设计，更涵盖了项目布局、包设计、并发设计、接口设计、错误处理设计等构建高质量 Go 代码的关键要素。</p>
<p>这门进阶课程，是我多年 Go 实战经验和深度思考的结晶，旨在帮助你突破瓶颈，从“会用 Go”迈向“精通 Go”，真正驾驭 Go 语言，编写出更优雅、更高效、更可靠的生产级代码！</p>
<p>扫描下方二维码，立即开启你的 Go 语言进阶之旅！</p>
<p><img src="https://tonybai.com/wp-content/uploads/course-card/iamtonybai-banner-2.gif" alt="" /></p>
<p><strong>感谢阅读！</strong></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/06/14/go-1-25-foresight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go 1.25链接器提速、执行文件瘦身：DWARF 5调试信息格式升级终落地</title>
		<link>https://tonybai.com/2025/05/08/go-dwarf5/</link>
		<comments>https://tonybai.com/2025/05/08/go-dwarf5/#comments</comments>
		<pubDate>Thu, 08 May 2025 00:05:53 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[BSS]]></category>
		<category><![CDATA[CD]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[Clang]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[delve]]></category>
		<category><![CDATA[DWARF]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[GDB]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[go1.25]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[issue]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[objump]]></category>
		<category><![CDATA[relocation]]></category>
		<category><![CDATA[section]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[代码段]]></category>
		<category><![CDATA[数据段]]></category>
		<category><![CDATA[编译]]></category>
		<category><![CDATA[调试]]></category>
		<category><![CDATA[重定位]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=4664</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2025/05/08/go-dwarf5 大家好，我是Tony Bai。 对于许多Go开发者来说，调试信息的格式可能是一个相对底层的细节。然而，这个细节却对编译速度、最终可执行文件的大小以及调试体验有着深远的影响。经过长达六年的讨论、等待生态成熟和密集的开发工作，Go 语言工具链终于在主干分支（预计将包含在 Go 1.25 中）默认启用了 DWARF version 5 作为其调试信息的标准格式（Issue #26379）。这一看似“幕后”的变更，实则为 Go 开发者带来了切实的链接速度提升和可执行文件体积的优化。在这篇文章中，我们就来对DWARF5落地Go这件事儿做一个简单的解读。 为何需要升级到 DWARF 5？旧格式的痛点 DWARF (Debugging With Attributed Record Formats) 是类 Unix 系统上广泛使用的调试信息标准。Go 之前使用的 DWARF 版本（主要是 v2 和 v4）虽然成熟，但在现代软件开发实践中暴露出一些不足： 大量的重定位 (Relocations): 旧版 DWARF 格式通常包含大量需要链接器处理的地址重定位信息。根据 2018 年的初步分析（by aclements），在当时的 go 二进制文件中，高达 49% 的重定位条目都源于 DWARF 数据。这显著增加了链接器的工作负担，拖慢了构建速度，尤其是对于大型项目。 冗长的位置和范围列表 (Location/Range Lists): 用于描述变量生命周期和代码范围的 .debug_loc 和 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="https://tonybai.com/wp-content/uploads/2025/go-dwarf5-1.jpg" alt="" /></p>
<p><a href="https://tonybai.com/2025/05/08/go-dwarf5">本文永久链接</a> &#8211; https://tonybai.com/2025/05/08/go-dwarf5</p>
<p>大家好，我是Tony Bai。</p>
<p>对于许多Go开发者来说，调试信息的格式可能是一个相对底层的细节。然而，这个细节却对编译速度、最终可执行文件的大小以及调试体验有着深远的影响。经过长达六年的讨论、等待生态成熟和密集的开发工作，Go 语言工具链终于在主干分支（预计将包含在 Go 1.25 中）默认启用了 <strong>DWARF version 5</strong> 作为其调试信息的标准格式（<a href="https://github.com/golang/go/issues/26379">Issue #26379</a>）。这一看似“幕后”的变更，实则为 Go 开发者带来了切实的<strong>链接速度提升</strong>和<strong>可执行文件体积的优化</strong>。在这篇文章中，我们就来对DWARF5落地Go这件事儿做一个简单的解读。</p>
<h2>为何需要升级到 DWARF 5？旧格式的痛点</h2>
<p>DWARF (Debugging With Attributed Record Formats) 是类 Unix 系统上广泛使用的调试信息标准。Go 之前使用的 DWARF 版本（主要是 v2 和 v4）虽然成熟，但在现代软件开发实践中暴露出一些不足：</p>
<ol>
<li><strong>大量的重定位 (Relocations):</strong> 旧版 DWARF 格式通常包含大量需要链接器处理的地址重定位信息。根据 2018 年的初步分析（by aclements），在当时的 go 二进制文件中，高达 <strong>49%</strong> 的重定位条目都源于 DWARF 数据。这显著增加了链接器的工作负担，拖慢了构建速度，尤其是对于大型项目。</li>
<li><strong>冗长的位置和范围列表 (Location/Range Lists):</strong> 用于描述变量生命周期和代码范围的 .debug_loc 和 .debug_ranges 等section的数据在旧格式下可能非常庞大。即便经过压缩，它们也能占到可执行文件大小的相当一部分（例如，当时 go 二进制的 12MiB 中占 6%）。</li>
<li><strong>缺乏官方 Go 语言代码:</strong> 虽然不影响功能，但 DWARF 5 正式为 Go 语言分配了官方的语言代码 (DW_LANG_Go)。</li>
</ol>
<p>DWARF 5 标准针对这些痛点进行了改进，其关键优势在于：</p>
<ul>
<li><strong>位置无关表示 (Position-Independent Representations):</strong> DWARF 5 引入了如 .debug_addr, .debug_rnglists, .debug_loclists 等新 Section 格式，它们的设计能大幅减少甚至消除对重定位的需求，从而减轻链接器负担。</li>
<li><strong>更紧凑的列表格式:</strong> 新的列表格式 (.debug_rnglists, .debug_loclists) 比旧的 (.debug_ranges, .debug_loc) 更为紧凑，有助于减小调试信息的大小。</li>
</ul>
<h2>从提案到落地：漫长的等待与集中的开发</h2>
<p>尽管 DWARF 5 的优势显而易见，但 Go 社区在 2018 年提出该想法时（by aclements），整个开发工具生态（如调试器 LLDB、macOS 的链接器和 dsymutil 工具等）对其支持尚不完善。因此，该提案被暂时搁置，等待时机成熟。</p>
<p>近年来，随着主流工具链（GCC 7.1+, GDB 8.0+, Clang 14+）纷纷将 DWARF 5 作为默认选项，生态环境逐渐成熟。Go 团队成员 <strong>Than McIntosh</strong> 承担了将 Go 工具链迁移到 DWARF 5 的主要开发工作。这涉及对编译器 (cmd/compile) 和链接器 (cmd/link) 的大量修改，引入了新的 GOEXPERIMENT=dwarf5 实验开关进行测试，并提交了一系列相关的变更集 (CLs)，包括：</p>
<ul>
<li>添加 DWARF 5 相关常量和 relocation 类型定义。</li>
<li>实现对 .debug_addr, .debug_rnglists, .debug_loclists section 的生成和支持。</li>
<li>更新 DWARF 5 的行号表 (line table) 支持。</li>
<li>适配 x/debug/dwtest 和 internal/gocore 等内部库。</li>
<li>协调 Delve 调试器对 DWARF 5 的支持。</li>
</ul>
<h2>成果显著：链接速度提升与体积优化</h2>
<p>经过广泛的测试和 compilebench 基准评估，启用 DWARF 5 带来了可观的性能收益：</p>
<ul>
<li><strong>链接速度显著提升:</strong> ExternalLinkCompiler 基准测试显示链接时间减少了 <strong>约 14%</strong>。这主要得益于 DWARF 5 减少了链接器需要处理的重定位数量。</li>
<li><strong>可执行文件体积减小:</strong> HelloSize 和 CmdGoSize 基准显示最终可执行文件大小平均减小了 <strong>约 3%</strong>。这归功于 DWARF 5 更紧凑的列表格式。</li>
<li><strong>编译时间略有改善:</strong> 整体编译时间 (geomean) 也有约 <strong>1.9%</strong> 的小幅提升。</li>
</ul>
<p>虽然对代码段 (.text)、数据段 (.data)、BSS 段的大小几乎没有影响，但链接耗时和最终文件大小的优化对于大型项目和 CI/CD 流程来说意义重大。</p>
<h2>挑战与妥协：并非所有平台一步到位</h2>
<p>在推进 DWARF 5 的过程中，也遇到了一些平台兼容性问题，导致 Go 团队采取了审慎的策略：</p>
<ol>
<li><strong>macOS dsymutil 限制:</strong> 旧版本的 macOS Xcode 自带的 dsymutil 工具（用于处理和分离 DWARF 信息）不支持 DWARF 5 新引入的 .debug_rnglists 和 .debug_loclists section。这会导致在使用<strong>外部链接 (external linking)</strong> 构建 CGO 程序时，Go 代码的调试信息丢失。虽然 LLVM 17 (对应 Xcode 16+) 已修复此问题，但考虑到仍有大量开发者使用旧版 Xcode（官方支持最低到 Xcode 14），Go 团队决定<strong>在 macOS 和 iOS 平台上进行外部链接时，暂时回退到 DWARF 4</strong>。未来当最低支持的 Xcode 版本兼容 DWARF 5 后，有望统一。</li>
<li><strong>AIX 平台限制:</strong> AIX 使用的 XCOFF 文件格式本身不支持 DWARF 5 所需的 Section 类型。因此，<strong>AIX 平台将继续使用 DWARF 4</strong> (GOEXPERIMENT=nodwarf5 默认开启)。</li>
<li><strong>GNU objdump 兼容性:</strong> objdump 工具在解析 Go 生成的 monolithic .debug_addr section 时会打印警告（因为它期望每个编译单元都有一个 header，而 Go 链接器只生成一个）。这被认为是一个 objdump 的小问题（已提议向上游提交修复），不影响实际功能，因此 Go 团队决定继续采用 monolithic 方式。</li>
</ol>
<h2>对开发者的影响与总结</h2>
<p>对于大多数 Go 开发者而言，这项变更将在 Go 1.25 及以后版本中<strong>默认生效</strong>（除了上述 macOS 外部链接和 AIX 平台）。你将自动享受到<strong>更快的链接速度</strong>和<strong>略小的可执行文件</strong>。</p>
<ul>
<li><strong>调试体验:</strong> 虽然 DWARF 5 本身设计更优，但对日常使用 Delve 等调试器的直接体验影响可能不明显，主要好处体现在工具链效率和文件大小上。</li>
<li><strong>注意事项:</strong> 如果你在 macOS 上进行 CGO 开发并使用外部链接，或者面向 AIX 平台，需要了解调试信息格式仍将是 DWARF 4。</li>
</ul>
<p>总而言之，Go 工具链采纳 DWARF 5 是一个重要的里程碑。它不仅解决了旧格式的一些固有问题，提升了构建效率，也是 Go 语言紧跟底层技术标准发展、持续优化开发者体验的重要一步。这项历时多年的工作最终落地，体现了 Go 社区在推动技术演进方面的耐心和决心。</p>
<h2>参考资料</h2>
<ul>
<li><a href="https://github.com/golang/go/issues/26379">cmd/compile: consider using DWARF 5</a> &#8211; https://github.com/golang/go/issues/26379</li>
<li><a href="https://dwarfstd.org/dwarf5std.html">DWARF Version 5</a> &#8211; https://dwarfstd.org/dwarf5std.html</li>
</ul>
<hr />
<p><strong>聊聊你的编译构建体验</strong></p>
<p>Go 1.25 工具链的这项 DWARF 5 升级，虽然“藏”在幕后，但实实在在地为我们带来了链接速度和文件大小的优化。<strong>你在日常的 Go 项目开发中，是否也曾被编译链接速度或可执行文件体积困扰过？</strong> 你对 Go 工具链在这些方面的持续改进有什么期待或建议吗？或者，你是否了解其他能有效优化构建体验的技巧？</p>
<p><strong>欢迎在评论区分享你的经验、痛点与期待！</strong> 让我们共同见证 Go 工具链的进步。</p>
<p><strong>想深入探索Go的编译、链接与底层奥秘？</strong></p>
<p>如果你对 Go 工具链如何工作、编译优化、链接器原理，乃至像 DWARF 这样的底层细节充满兴趣，希望系统性地构建对 Go 语言“从源码到可执行文件”全链路的深刻理解&#8230;</p>
<p>那么，我的 <strong>「Go &amp; AI 精进营」知识星球</strong> 正是为你打造的深度学习平台！这里有【Go原理课】带你解密语言核心机制，【Go进阶课】助你掌握高级技巧，更有【Go避坑课】让你少走弯路。我会亲自为你解答各种疑难问题，你还可以与众多热爱钻研的Gopher们一同交流，探索Go的更多可能，包括它在AI等前沿领域的应用。</p>
<p><strong>扫码加入，与我们一同潜入Go的底层世界，成为更懂Go的开发者！</strong></p>
<p><img src="http://image.tonybai.com/img/tonybai/gopher-and-ai-tribe-zsxq-small-card.jpg" alt="img{512x368}" /></p>
<hr />
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求，请扫描下方公众号二维码，与我私信联系。</p>
<p><img src="http://image.tonybai.com/img/tonybai/iamtonybai-wechat-qr.png" alt="" /></p>
<p style='text-align:left'>&copy; 2025, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2025/05/08/go-dwarf5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
