欢迎阅读 Zig 编程语言入门指南《学习 Zig》。本指南旨在让你轻松掌握 Zig。本指南假定你已有编程经验,语言不限。 Zig 目前正在紧锣密鼓地开发中,Zig 语言及其标准库都在不断发展。本指南以最新的 Zig 开发版本为目标。不过,部分代码有可能编译不通过。如果你下载了最新版本的 Zig,但在运行某些代码时遇到问题,请提 issue。| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/#install Zig 官网的下载页面中包含常见平台的预编译二进制文件。在这个页面上,你可以找到最新开发版本和主要版本的二进制文件。本指南所跟踪的最新版本可在页面顶部找到。 对于我的电脑,我会下载 zig-macos-aarch64-0.12.0-dev.161+6a5463951.tar.xz。你使用的可能是不同的平台或更新的版本。展开压缩包,这里面会有一个名为 zig 的二进制...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/language_overview_1 Zig 是一种强类型编译语言。它支持泛型,具有强大的编译时元编程功能,并且不包含垃圾收集器。许多人认为 Zig 是 C 的现代替代品。因此,该语言的语法与 C 类似,比较明显的就是以分号结尾的语句和以花括号分隔的块。 Zig 代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 conststd=@import("std");// 如果 `main` 不是 `pub` (public)...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/language_overview_2 本部分继续上一部分的内容:熟悉 Zig 语言。我们将探索 Zig 的控制流和结构以外的类型。通过这两部分的学习,我们将掌握 Zig 语言的大部分语法,这让我们可以继续深入 Zig 语言,同时也为如何使用 std 标准库打下了基础。 控制流 Zig 的控制流很可能是我们所熟悉的,但它与 Zig 语言的其他特性协同工作是我们还没有...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/style_guide 本小节的主要内容是介绍 Zig 编译器强制遵守的 2 条规则,以及 Zig 标准库的命名惯例(naming convention)。 未使用变量 Unused Variable Zig 编译器禁止未使用变量,例如以下代码会导致两处编译错误: 1 2 3 4 5 6 7 8 9 10 conststd=@import("std");pubfnmain()void{constsum=add(8999,2);}fnadd(a:i64,b:i64)i64{// notice this is a + a, not a + b returna+a;} 第一个编译错误,...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/pointers Zig 不包含垃圾回收器。管理内存的重任由开发者负责。这是一项重大责任,因为它直接影响到应用程序的性能、稳定性和安全性。 我们将从指针开始讨论,这本身就是一个重要的话题,同时也是训练我们从面向内存的角度来看待程序数据的开始。如果你已经对指针、堆分配和悬挂指针了如指掌,那么可以跳过本小节和下一小...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/stack_memory 通过深入研究指针,我们了解了变量、数据和内存之间的关系。因此,我们对内存的分布有了一定的了解,但我们还没有讨论如何管理数据以及内存。对于运行时间短和简单的脚本来说,这可能并不重要。在 32GB 笔记本电脑时代,你可以启动程序,使用几百兆内存读取文件和解析 HTTP 响应,做一些了不起的事情,然后退出。...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/heap_memory 迄今为止,我们所接触到的一切都有个限制,需要预先知道大小。数组总是有一个编译时已知的长度(事实上,长度是类型的一部分)。我们所有的字符串都是字符串字面量,其长度在编译时是已知的。 此外,我们所见过的两种内存管理策略,即全局数据和调用栈,虽然简单高效,但都有局限性。这两种策略都无法处理动态...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/generics 在上一小节中,我们创建了一个名为 IntList 的动态数组。该数据结构的目标是保存数目不定的数值。虽然我们使用的算法适用于任何类型的数据,但我们的实现与 i64 值绑定。这就需要使用泛型,其目的是从特定类型中抽象出算法和数据结构。 许多语言使用特殊的语法和特定的泛型规则来实现泛型。而在 Zig 中,泛型并不是一...| Zig 语言中文社区
原文地址:https://www.openmymind.net/learning_zig/coding_in_zig 在介绍了 Zig 语言的大部分内容之后,我们将对一些主题进行回顾,并展示几种使用 Zig 编程时一些实用的技巧。在此过程中,我们将介绍更多的标准库,并介绍一些稍复杂些的代码片段。 悬空指针 Dangling Pointers 我们首先来看看更多关于悬空指针的例子。这似乎是一个奇怪的问题,但如果你之前主要使用带垃圾回收的语言...| Zig 语言中文社区
原文总结:https://www.openmymind.net/learning_zig/conclusion 有些读者可能会认出我是各种『The Little $TECH Book』 的作者(译者注:原作者还写过 The Little Go Book、The Little MongoDB Book),并想知道为什么这本书不叫『The Little Zig Book』。事实上,我不确定 Zig 是否适合『小』这个范畴。部分挑战在于,Zig 的复杂性和学习曲线会因个人背景和经验的不同而大相径庭。如果你是一个经验丰富的 C ...| Zig 语言中文社区
Zig 中文社区是一个开放的组织,我们致力于推广 Zig 在中文群体中的使用,有多种方式可以参与进来: 供稿,分享自己使用 Zig 的心得,方式见下文 改进 zigcc 组织下的开源项目,这是 open issues 参与不定期的线上会议 供稿方式 Fork 仓库 https://github.com/zigcc/zigcc.github.io 在 content/post 内添加自己的文章(md 或 org 格式均可),文件命名为: ${YYYY}-${MM}-${DD}-${SLUG}.md 文件开始需要包...| Zig 语言中文社区
观点/教程 Why am I writing a JavaScript toolchain in Zig? JAM 作者写的一篇文章,分析里市面上现有的 JS 工具链(bundler、formatter、linter 等),虽然已经很好用,但是不够快。下面是他举的几个例子: Lossless, cache efficient syntax trees,现在通用的 JS 语法树表示是 ESTree,尽管设计上很简洁,但在遍历时不够高效,需要有遍历多次 才能得到有用信息(eslint 里就有四次!),而且都是指针的...| Zig 语言中文社区
重大事件 向 Zig 软件基金会认捐 30 万美元 Mitchell 在其最新的博客上宣布:我和我的妻子向 Zig 软件基金会 (ZSF) 捐赠了 300,000 美元。 两年内每年分期支付15万美元。第一期已经转账。 我从 2019 年的某个时候开始关注 Zig 项目。 我在 2021 年公开分享了我对该项目的兴奋之情。 同年晚些时候,我开始使用 Zig,到 2022 年初,我开始撰写关于 Zig 的文章,并为编译器做出贡献。 2023 ...| Zig 语言中文社区
重大事件 在这篇文章里,作者引用 Stackoverflow 2024 年的调查报告,指出 Zig 语言是最热门的编程语言之一,并且 Zig 开发者的薪水都很高,平均年收入为75,332美元! Zig 受欢迎程度 Zig 薪水对比 尽管使用 Zig 语言的开发者仅占调查人数的 1%,但上升趋势明显。Zig 语言的倡导者、自由和开放源码软件开发者 Ali Cheragi 说: Zig 的魅力在于它的简洁性、现代设计以及在底层控制和运...| Zig 语言中文社区
重大事件 2024-06-07,0.13.0 发布,历时不足 2 个月,有 73 位贡献者,一共进行了 415 次提交! 这是一个相对较短的发布周期,主要原因是工具链升级,例如升级到 LLVM 18。 一个比较大的 Breaking changes 是 ComptimeStringMap 被重命名为了 StaticStringMap , 使用方式也发生了变化,更多细节可参考:#19682 1 constmap=std.StaticStringMap(T).initComptime(kvs_list); 0.14.0 发布周期的主题将是编译速度。将在...| Zig 语言中文社区
观点/教程 Thoughts on Zig 又一篇 Zig 初学者的使用体验文档,如果你也在犹豫要不要学 Zig,这是个不错的经验参考。 I'm sold on Zig's simplicity : r/Zig 一个具有资深经验开发者,在这里描述了自己选择业余项目语言的经历: Rust 越来越复杂,有种发展成 C++ 的趋势 C++ 新版本的特性(比如 module)LSP 支持的不够好,而且历史包袱严重 C 缺少元编程,并且没有命名空间 最后从 Andrew 的一...| Zig 语言中文社区
重大事件 千呼万唤的 0.12.0 版本终于 2024-04-20 正式释出了!这次版本历时 8 个月,有 268 位贡献者,一共进行了 3688 次提交!社区内的一些讨论:Hacker News、Lobsters。 这是它的 Release notes。ZigCC 对这个文档进行了翻译、整理,方便大家阅读: 0.12.0 升级指南 0.12.0 版本说明 并且还在 2024-04-27 举行了一次线上的 meetup 来庆祝这次发布,这是会议的总结:0.12.0 Release Party 回顾。 0.12.0...| Zig 语言中文社区
重大事件 https://ziglang.cc/ 之前 ZigCC 所有项目都是托管在 GitHub 之上,网页基于 Pages 构建,域名自然也就是 github.io 的,虽然 GitHub 提供了很多利于开发者的服务,但过于依赖 GitHub 这种商业公司,还是不利于 ZigCC 的长远发展,域名是其中很重要一个,有了独立域名,网页托管选择就多了,比如 Cloudflare Pages。 另一个大家比较关心的问题就是 0.12 的发版,虽然 milestone 显示还剩 ...| Zig 语言中文社区
重大事件 Andrew 最近在 zigshow 节目中介绍了 Zig 2024 年的规划,主要有以下几点: 0.12 版本会尽快发布 编译时间现在太慢,进而导致修 bug 的时间长,因此 core team 会优先解决这个编译时间问题。在这个看板中,有相应的进度,主要是:Ditch LLVM、Incremental Compilation 这两个。 很多人都对 Ditch LLVM 这个事情嗤之以鼻,认为这是不自量力,这个 issue 的讨论也比较多,已经有近 200 条...| Zig 语言中文社区
重大事件 本月讨论比较多的就是 Zig May Pass Anything By Reference 这篇文章了。 它讲述了 Zig 里面一个比较有争议的点,函数的参数到底是传值还是传引用。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 constAAAA=struct{foo:[100]u32,};fnaaaaa(a:AAAA,b:*AAAA)void{b.*.foo[0]=5;std.debug.print("wtf: {}",.{a.foo[0]});}pubfnmain()!void{varf:AAAA=undefined;f.foo[0]=0;aaaaa(f,&f);} 上面这个例子修改了 b 参数的值,但是打印出来的 a 的值也...| Zig 语言中文社区
重大事件 观点/教程 Notes From the Field: Learning ZigZig 初学者的使用经验分享Friendly Neighbor: A network service for Linux wake-on-demand, written in Zig作者在这篇文章中分享了 用 Zig 重写之前 Ruby 写的一个网络工具,一方面是减轻资源消耗,另一方面是探索用“低级”语言来写程序。不错的案例分享。Zig Interfaces作者介绍了 Zig 中如何实现接口这个经常需要用到的功能。最后的实现也比较巧妙,...| Zig 语言中文社区
重大事件 Bounties Damage Open Source Projects 在 2023-09-11 号,Wasmerio CEO 创建了 Support WASIX · Issue #17115,表示想赞助 Zig 开发者,让其更好地支持 WASIX 平台。 Andrew 与 Loris 在这篇文章中主要阐述了这么做为什么是伤害社区的行为: 助长竞争,牺牲合作 在软件开发的商业管理方面,悬赏是一种极为简单的方法,这可能让开发者关注短期效益,忽视长期利益,比如维护成本。 这篇文章...| Zig 语言中文社区
0.11 正式发布 0.11 终于在 8 月 4 号释出了,下面来看看它的一些重要改进吧。HN 讨论 Peer Type Resolution Improvements 对等类型解析算法得到改进,下面是一些在 0.10 中不能解析,但在 0.11 中可以解析的例子: Peer TypesResolved Type [:s]const T, []T[]const T E!*T, ?*TE!?*T [*c]T, @TypeOf(null)[*c]T ?u32, u8?u32 [2]u32, struct { u32, u32 }[2]u32 *const @TypeOf(.{}), []const u8[]const u8 而且现在使用 @intCast 这类 builtin 都只...| Zig 语言中文社区
重大事件 Andrewk 在最新的文章 The Upcoming Release Postponed Two More Weeks and Lacks Async Functions 中指出,即将发布的 0.11 中将不会包含对异步的支持,现在异步是在 stage2-async 这个分支上来开发,但是在开发过程中,总是有其他事情出现,然后 Andrewk 就先去搞这些事情了。因此,把对异步的支持放到 0.12 上了。 另一件事是 Jacob Young Joins the Core Zig Team,Core Team 迎来了另一位全职开发者,...| Zig 语言中文社区
重大事件 一个是这个:The Zig subreddit has closed,现在 Ziggit 算是官方钦定的论坛了。 另一个是月底出来的大新闻:File for Divorce from LLVM · Issue #16270 · ziglang/zig 这个 issue 主要讨论的是把 LLVM 从 Zig 中彻底移除,动机和优势都列在里面了,这里不再赘述,这里重点说下影响: 去掉 C++/Objc 的支持, 支持的 target 会变少 从 issue 本身和 Lobsters、HN 上的评论看,大家主要担忧的是对 C++...| Zig 语言中文社区
重大事件 这个月主要的事情就是 HTTP server 在标准库的增加了,具体可参考: Coming Soon to a Zig Near You: HTTP Client http server in the standard library · Issue #910 观点/教程 Integrating Zig and SwiftUIMitchell 在用 Zig 实现了一个终端后,虽然没有把源码放出来,但是有了这个文章总结。Zig Language Server And CancellationMatklad 对 ZLS 实现分析:如何快速响应用户的编辑命令,在作者来看,最主要是 server ...| Zig 语言中文社区
重大事件 在 2023 四月份的 Tiobe 指数上,Zig 排名 46,尽管 Loris 发推表示这个数字对 Zig 来说没什么实际意义,但对于多数吃瓜群众来说,这还是十分让人鼓舞的。 For people who heard about Zig just recently: Zig is not 2x faster than Rust, despite what recent benchmarks might lead you to believe. You won't find many Zig jobs for a few years still, despite the Tiobe stuff. Don't join to the Zig community just to rant about Rust. — Loris Cro...| Zig 语言中文社区
观点/教程 Creating arbitrary error values by using error.Something syntax下面两种方式是等价的: 1 2 consterr=error.FileNotFound;consterr=(error{FileNotFound}).FileNotFound; Errors and Zig主要讲述了 Zig 中如何处理错误,如何携带上下文信息 1 2 3 4 5 6 7 8 9 varx=trythingThatCouldFail();if(thingThatCouldFail())|good_value|{x=good_value;break;}else|_|{// do something that should fix it for the next time tries-=1;} Zig Bits 0x2: Using defer to defeat memory leak...| Zig 语言中文社区
包管理器进展 包管理器自 #14265 合并后一直在不断推进,以下两个是最主要的改变: build system terminology update: package, project, module, dependency 这里重新梳理了现在的术语,主要有以下几个: package 文件的集合,由文件的 hash 值唯一指定,一个 package 可能包含任意数目的 compilation artifacts 与 modules。 dependency 不同 package 之间的有向边,一个 package 可以有任意个依赖,一个 package 也...| Zig 语言中文社区
0.10.1 版本发布 一个小版本,主要是 bugfix。最主要的功能是:Package Manager MVP,Zig 终于开始支持包管理了! 不过才刚刚开始,有一个面板来跟踪相关 issue 进度。使用的配置文件是 build.zig.ini ,格式如下: [package] name=libffmpeg version=5.1.2 [dependency] name=libz url=https://github.com/andrewrk/libz/archive/f0e53cc2391741034b144a2c2076ed8a9937b29b.tar.gz hash=c9b30cffc40999d2c078ff350cbcee642970a224fe123c756d0892f876cf1aae [de...| Zig 语言中文社区
0.10.0 Release Notes 本月最大的事情就是 0.10 版本发布了,主要功能就是 self-hosted compiler,也称为『自举』,即可以用 Zig 来写 Zig 编译器,自举之所以对于一门语言如此重要,主要在于,这说明了该语言可以处理足够复杂的系统,不再只是玩具而已。编译的提升: Wall Clock Time: 43 seconds to 40 seconds (7% faster) Peak RSS: 9.6 GiB to 2.8 GiB (3.5x less memory used) 赶紧升级吧,少年! zigcc 中文社区...| Zig 语言中文社区
观点/教程 Zig Is Self-Hosted Now, What’s Next? | Loris Cro’s Blog | 0.10 即将在 11-01 号发布,Loris 回顾了目前 stage2 的进展,包管理器是下一个目标,但是不会引入中央仓库 Loris 会在 Twitch 直播这次的 release party Howto Pair Strings with Enums 利用 Zig comptime 的能力为 enum 增加描述信息 A Database Without Dynamic Memory Allocation | TigerBeetle 讲述了如何静态内存的优势,如何应用到数据库中,以及 Zig 为实...| Zig 语言中文社区
Zig VS Rust 火花 在 9/10 号左右,在 Twitter 上牵起了一小波关于 Zig VS Rust 的小火花,以至于最后 Zig 创始人 Andrew Kelley 发推表示 Let us exist。这里稍微整理下这件事情的过程: 本次事件主要涉及两个人: Rust 核心贡献者: Patrick Walton Zig 社区 VP: Loris Cro 时间线 8/26 号,一篇关于 wasm 2 Game Jam 的分析报告中,使用 Zig 的人数最多 9/9 号,这篇报告在 HackerNews 上引起了热烈讨论,其中 ...| Zig 语言中文社区
观点/教程 Growing a {{mustache}} with Zig 作者使用 Zig 开发时的目标: Robost,test 代码快 Optimal,Zig 语言本身就要求开发者去考虑堆分配 Reusable,用户可以在高性能(better performance)与低内存(minimal memory footprint)使用之间做取舍,以满足不同的场景 Will Bun JavaScript Take Node’s Crown Hacker News 上的评论。作者从多个方面对比了 Node 与 Bun,Bun 均胜出 Looking into Zig - Ayende @ Rahien。作者对...| Zig 语言中文社区
观点/教程 Zig 初体验 - Keep Coding undefined 值的作用 用 Zig 优化 yes 命令 Some Thoughts on Zig — Sympolymathesy, by Chris Krycho Zig 语言最吸引人的一点:小巧 ziglings-solutions 题解 “these are some really impressively bad semantics to choose for your programming language” / Twitter How to Release your Zig Applications Zig files are structs - Zig NEWS ⚡ Is it necessary to know C (or another systems programming language) before starting with Zig? : Zig...| Zig 语言中文社区
由于 Zig 还在快速开发迭代中,因此项目很有可能出现新版本 Zig 无法编译的情况,这时候一方面可以跟踪上游进展,看看是否有 workaround,另一个就是使用固定的版本来开发这个项目,显然这种方式更靠谱一些,因此这篇文章就来介绍一些管理多个 Zig 版本的方式。 Zig version manager 现在 Zig 的版本管理工具主要有如下几个: marler8997/zigup Download and manage zig compilers tristanisham/zvm L...| Posts on Zig 语言中文社区
MIDI 是“乐器数字接口”的缩写,是一种用于音乐设备之间通信的协议。而 zig-midi 主要是在对 MIDI 的元数据、音频头等元数据进行一些处理的方法上进行了集成。 1 2 3 4 5 6 7 8 9 10 11 12 . ├── LICENSE ├── ReadMe.md ├── build.zig ├── example │ └── midi_file_to_text_stream.zig ├── midi │ ├── decode.zig │ ├── encode.zig │ ├── file.zig │ └── test.zig ├── midi.zig 基...| Posts on Zig 语言中文社区
Bog GC Design Bog is a small scripting language developed using Zig. Its GC design is inspired by a paper titled An efficient of Non-Moving GC for Function languages. Overview Introduction Design of the Heap Types of GC Design of Bitmap Implementation Introduction GC stands for garbage collection, which is primarily a memory management strategy for the heap region. Memory allocations in the heap are done in exponentially increasing sizes, with a special sub-heap dedicated solely to very large...| Posts on Zig 语言中文社区
Bog 是一款基于 Zig 开发的小型脚本语言。它的 GC 设计受到一篇论文An efficient of Non-Moving GC for Function languages的启发。 梗概 概述 Heap 的设计 GC 的类别 Bitmap 的设计 实现 概述 GC 是一种垃圾回收的机制,主要是针对heap区域的内存管理策略。在堆中的内存分配是按照指数级增长的大小进行的,此外还有一个专门用于非常大对象的特殊子堆。这种方法的一个优点可能是它可以高效地...| Posts on Zig 语言中文社区