第13章 文件系统与 I/O
系统编程的基石:深入理解 Zig 的 I/O 模型(Reader/Writer 接口)、缓冲 I/O 的重要性,以及文件与目录的增删改查。
记录 Zig 语言的学习过程、实战项目和底层原理探索。
系统编程的基石:深入理解 Zig 的 I/O 模型(Reader/Writer 接口)、缓冲 I/O 的重要性,以及文件与目录的增删改查。
Zig 的多线程编程指南:如何创建线程、使用线程池、通过 Mutex 和 RwLock 进行同步,以及如何避免常见的数据竞争和死锁。
本章我们将综合运用之前学到的文件 I/O、内存管理和 C 互操作知识,实战开发一个能将彩色 PNG 图片转换为灰度图的命令行工具。
掌握 Zig 标准库中的核心数据结构:动态数组 (ArrayList) 和哈希表 (HashMap)。
Zig 的杀手锏特性:深入理解 comptime 关键字,掌握如何在编译时执行代码,并从零构建一个泛型栈数据结构。
Zig 的底层黑魔法:如何使用 @Vector 和 SIMD 指令来榨干 CPU 的并行计算性能。
深入理解 Zig 独特的错误处理机制:从错误值、错误集到 try/catch/errdefer 策略,以及联合类型的应用。
深入理解 Zig 的控制流(if, switch, loops)、结构体与面向对象模式、模块系统以及类型转换机制。
Zig 语言入门:介绍 Zig 的设计哲学、优势,以及如何搭建开发环境并编写第一个 Hello World 程序。
Zig 的杀手级特性:无需绑定生成器,直接导入 C 头文件,无缝调用 C 代码,以及如何处理 Zig 与 C 之间的数据类型转换。
Zig 内存管理的核心指南:深入理解堆栈、分配器 (Allocators) 及其在 Zig 中的独特设计哲学。
通过从零实现 Base64 编码算法,实战演练 Zig 的位操作、内存分配与数组处理技巧。
工欲善其事,必先利其器。本章介绍调试 Zig 程序的两种主要策略:打印调试与交互式调试器 (GDB/LLDB),以及如何检查对象类型。
为构建 HTTP 服务器打下基础:深入理解 Zig 的指针机制(内存地址、解引用、指针运算)与可选类型(空值安全处理)。
不依赖任何 HTTP 库,直接使用 TCP Socket 从零开始构建一个简单的 HTTP 服务器,深入理解网络编程与 HTTP 协议。
本章深入探讨 Zig 强大的内置单元测试框架,学习如何编写测试、检测内存泄漏,以及各种断言方法。
Zig 的杀手锏之一:内置且强大的构建系统。本章将教你如何使用 Zig 编写构建脚本,管理依赖,交叉编译,甚至编译 C/C++ 项目。
Chen, Jenny, and Ruohao Guo. 2022. "Stack and Heap Memory."《C++数据结构与算法导论》。[https://courses.engr.illinois.edu/cs225/fa2022/resources/stack-heap/](ht...
探索如何使用 Zig 构建系统来编译 C 项目,享受零配置交叉编译的便利。
庆祝 Ziglings 练习突破 100 大关!学习 Zig 优雅的并行遍历语法:如何在 for 循环中像拉拉链一样同时处理多个数组。
深入理解 Zig 的多对象 for 循环与无限范围语法,并探讨系统编程中的核心概念:数据导向设计 (AoS vs SoA)。
深入了解 Zig 的内置测试框架:如何在源码中直接编写测试用例,以及使用 expect, expectEqual 和 expectError 守护代码质量。
学习使用 std.mem.tokenizeAny 来解析文本:如何处理复杂的字符串分割,以及理解 Zig 迭代器的工作原理。
真正的并行计算:学习如何使用 std.Thread.spawn 启动系统线程,并使用 join 等待任务完成。
穿越时空的合作:使用 Zig 的多线程技术加速 17 世纪的莱布尼茨公式,体验无锁并行算法的设计之美。
深入 Zig 的 std.fs 模块:学习如何安全地创建目录、打开文件、写入内容,以及如何优雅地处理资源释放。
通过 Ziglings 练习 107,学习如何在 Zig 中打开文件、读取内容以及使用切片处理缓冲区。
通过 Ziglings 练习 108,学习 Zig 特有的 Labeled Switch 语法,并用它实现一个简洁的状态机。
通过 Ziglings 练习 109,探索 Zig 强大的 SIMD 支持,学习如何使用向量 (@Vector) 替代循环来提升性能。
通过 Ziglings 练习 110,模拟微控制器编程,掌握 Zig 中的位掩码、XOR 翻转、OR 置位以及 AND 清除操作。
学习 Zig 的 union(enum) 语法:如何省略显式的枚举定义,让编译器自动为联合体生成标签。
综合实战:使用 Zig 的结构体、指针、联合体和可选类型,实现一个基于广度优先搜索 (BFS) 的最短路径查找器。
深入理解 Zig 中的数值字面量:二进制、八进制、十六进制以及字符与整数的等价关系。
探索 Zig 的浮点数系统 (IEEE-754),学习科学计数法的使用以及如何控制打印输出的精度。
深入理解 Zig 的自动类型转换 (Coercion) 规则,看看如何将一个普通指针变成“可选的数组指针”。
学习 Zig 的循环表达式:如何使用 break 和 else 从 for/while 循环中直接返回值,避免使用中间变量。
学习 Zig 的标签语法:如何在嵌套循环中精准控制 break 和 continue 的跳转目标,以及如何从代码块中返回值。
探索 Zig 的内置函数 (@builtins),学习如何使用 @addWithOverflow 处理算术溢出,以及使用 @bitReverse 进行位操作。
推开 Zig 元编程的大门:理解 comptime_int 字面量与运行时内存分配变量之间的本质区别。
探索 Zig 的编译期反射能力:使用 @This, @TypeOf 和 @typeInfo 来像外科医生一样剖析数据类型。
学习 Zig 的 comptime var:如何在编译期间修改变量,利用它来动态生成静态数组类型。
学习如何在 Zig 函数中强制要求参数为编译期常量,以及如何利用这一特性在编译期进行错误检查和逻辑修正。
戴上巫师帽!学习 Zig 如何通过 Comptime 参数实现泛型函数,以及编译器背后的单态化机制。
利用 Zig 的 anytype 和 @hasDecl 实现编译期接口检查:既有动态语言的灵活,又有静态语言的安全。
学习 Zig 的 inline for 语法:如何在编译期展开循环,结合反射实现自动化的代码生成。
Ziglings 基础篇最终章!使用 inline while 在编译期解析字符串指令,并生成无循环的高效机器码。
学习如何使用 comptime 块和参数来强制执行编译期检查,杜绝运行时的数组越界错误。
学会做减法:理解 Zig 中哪些地方是隐式 Comptime 的,避免滥用关键字,编写更干净的代码。
揭开 Zig 字符串字面量的面纱 (*const [N:0]u8),以及如何在丢失类型信息后通过切片语法找回数据。
学习 Zig 的哨兵机制:理解定长数组与哨兵指针在遍历逻辑上的根本区别,以及如何使用 std.meta.sentinel 反射获取哨兵值。
重构隐士地图:利用 Zig 的编译期函数和 @field 反射,消除重复代码,体验真正的元编程威力。
学习 Zig 的 @ptrCast 内置函数:如何在指针丢失了类型信息后,强制将其转换回带哨兵的指针 ([*:0]u8)。
学习 Zig 的标识符引用语法:如何定义包含空格、特殊字符甚至关键字的变量名,以及为什么我们需要这个功能。
深入理解 Zig 的泛型数据结构:如何通过函数返回匿名结构体来创建 Circle(i32) 和 Circle(f32)。
学会偷懒:使用 .{ ... } 语法快速创建一次性数据包,配合 anytype 实现灵活的参数传递。
深入理解 Zig 元组的本质:它们只是字段名为数字的匿名结构体。学习如何通过内联循环和反射来遍历打印任意元组。
学会变形:同一个 .{ ... } 语法,既可以是元组,也可以是数组。关键在于你将它赋值给什么类型。
学习 Zig 的 inline else 语法:如何利用 Tagged Union 和编译期展开,实现类似接口(Interface)的多态行为。
Zig 的杀手级特性:使用 @cImport 直接导入 C 头文件,链接 libc,并在 Zig 代码中无缝调用 C 函数。
Zig 与 C 的深度融合:如何引入 math.h 头文件并调用 fmod 函数来处理浮点数取模运算。
告别繁琐的 while 计数器,学习 Zig 0.11 引入的 for 循环范围语法 (Range Syntax),让数值遍历变得极其优雅。
跨越 Zig 的分水岭:学习如何使用 ArenaAllocator 在运行时动态分配内存,理解显式内存管理的哲学。
深入理解 Zig 的位操作能力,并解析经典的 XOR 交换算法:如何在不使用临时变量的情况下交换两个数?
如何用一个整数代替布尔数组?深入解析利用位掩码 (Bitmask) 高效判断 Pangram (全字母句) 的算法。
让输出更漂亮:深入解析 Zig 的字符串格式化语法 {d:>3},学习如何控制数字的对齐、宽度和填充。
综合运用 For 循环遍历数组与 While 循环执行计算,完成自定义的幂运算逻辑。
初探 Zig 独特的错误处理机制:如何定义错误集 (Error Set) 以及像普通值一样传递和比较错误。
掌握 Zig 的核心特性——错误联合类型 (!),学习如何定义既能存储值又能存储错误的变量。
学习如何使用 catch 关键字来处理 Zig 的错误联合类型,为可能失败的操作提供后备方案。
深入理解 Zig 的 catch |err| 语法,学习如何针对特定的错误进行处理,并将无法处理的错误向上传递。
掌握 Zig 中最常用的错误处理快捷键 try,学习如何简洁地将错误向上传播。
从 debug.print 毕业!学习如何处理标准输出 (stdout) 的错误,以及理解 main 函数的 !void 返回类型。
学习 Zig 的核心特性 defer:如何在作用域结束时自动执行代码,以及它对资源管理的意义。
利用 Defer 简化具有多个返回点的函数,避免代码重复,保持逻辑整洁。
掌握 Zig 的 errdefer 关键字:如何只在发生错误时执行清理代码或打印日志。
学习 Zig 的 Switch 语句:为什么编译器强迫我们处理每一个可能的值 (Exhaustiveness)?
学习 Zig 中 Switch 的高级用法:不仅仅是控制流,还可以直接用于赋值和返回值。
掌握 Zig 的 unreachable 关键字:如何处理理论上不可能发生的代码分支,以及它对安全性和性能的影响。
学习 Zig 中强大的 if (error_union) 语法,同时捕获成功值和错误负载,并结合 switch 实现精细的错误处理。
综合复习标准输出 (Stdout) 的正确获取方式以及 Writer 接口的使用,解决 Quiz 4 中的语法错误。
学习 Zig 的枚举类型,理解它是如何通过限制取值范围来消除 unreachable 语句的。
学习如何给 Zig 枚举指定底层类型和数值,以及如何使用高级格式化字符串输出十六进制颜色代码。
学习 Zig 中最核心的数据组织方式——结构体。如何定义、初始化以及修改结构体成员。
学习如何在数组中存储结构体,并深入理解 Zig 在 Debug 模式下如何通过填充 0xAA 来帮助我们发现未初始化内存的错误。
揭开系统编程中指针的神秘面纱,掌握 Zig 独特的后缀解引用语法 (.*)。
深入理解 Zig 指针类型:为什么 *u8 和 *const u8 是完全不同的类型,以及如何创建数据的只读视图。
深入剖析 Zig 指针的复杂性:如何区分“改变指针指向”与“改变指针指向的值”。
掌握 Zig 指针的核心用法:通过传递地址,让函数拥有修改外部变量和数组元素的能力。
深入理解 Zig 如何优雅地处理结构体指针,告别 C 语言的箭头操作符 (->),并探索默认值与枚举推导。
通过构建一个循环链表,综合复习结构体、指针引用以及循环遍历的知识。
学习 Zig 的可选类型 ?T,理解 null 的概念,以及如何使用 orelse 提供默认值。
深入理解 Zig 的 Optional 类型在数据结构中的应用,以及如何利用 orelse break 实现简洁的循环控制。
Zig 没有类,但有方法。学习如何将函数附加到结构体上,实现面向对象风格的调用。
深入实践 Zig 结构体方法。学习如何通过 helper 方法封装底层逻辑,实现更语义化、更易读的链表遍历。
综合运用结构体方法和可选指针,实现一个支持双向遍历的大象链表 (Doubly Linked List)。
深入辨析 Zig 中 undefined, null, error 和 void 的区别:它们都表示“没有”,但语境完全不同。
一次关于栈、堆和数据段的深度游。理解值拷贝与指针引用的本质区别,以及 Zig 函数参数的不可变性规则。
学习 Zig 中最重要的特性之一——切片。它是如何解决定长数组传递参数的痛点,以及它底层的指针+长度结构。
深入理解 Zig 字符串的本质:为什么指向字符串字面量的切片必须是 []const u8?
深入理解 Zig 的多项指针 [*]T,以及如何将其安全地转换为切片,附带 Zig 指针类型速查表。
学习 Zig 的联合体 (Union):如何在同一块内存中存储不同类型的数据,以及如何配合枚举安全地访问它们。
学习 Zig 的 Tagged Unions:如何将枚举与联合体绑定,实现类型安全的变体数据处理。
开始我的 Zig 语言学习之旅,为什么选择 Zig 以及环境搭建。
通过 Ziglings 练习理解 Zig 的函数可见性与程序入口。
学习如何在 Zig 中引入标准库,并理解为什么导入必须是常量。
深入理解 Zig 的 const/var 声明以及整数类型的精确控制。
学习 Zig 中数组的声明、自动长度推导以及读写操作。
掌握 Zig 独有的数组连接符 (++) 和重复符 (**),以及它们背后的编译期原理。
深入理解 Zig 字符串的本质:它们只是字节数组,以及如何对其进行拼接和格式化。
学习 Zig 独特的多行字符串语法 (\\),理解其背后的设计哲学。
通过一个字符拼接游戏,复习变量可变性、数组索引和 undefined 的用法。
理解 Zig 中 if 语句的严格性:为什么数字不能直接作为条件?
Zig 中没有 ?: 运算符?学习如何使用 If 表达式来优雅地进行条件赋值。
掌握 Zig 中最基础的循环结构,理解循环条件与终止时机。
学习 Zig 中独特的 While 循环步进表达式,理解它是如何替代 C 风格 For 循环的。
深入理解 Zig 的 while 循环设计:为什么步进表达式能防止死循环?
深入理解 Break 语句如何终止循环,以及它与步进表达式的特殊交互规则。
告别 C 风格的索引计数,学习 Zig 如何优雅地遍历数组与集合。
学习如何在 Zig 的 For 循环中同时获取元素的值和索引,并实现简单的二进制转换。
通过经典的 FizzBuzz 面试题,综合复习 Zig 的循环、条件判断与布尔逻辑。
学习 Zig 函数的基本定义语法,以及理解为什么有的函数需要 pub 而有的不需要。
学习如何向 Zig 函数传递参数,并使用 std.math.pow 计算幂次方。
第1章 Zig介绍 - Zig语言入门 在这一章中,我想向你介绍Zig的世界。Zig是一门非常年轻的语言,正在积极开发中。因此,它的世界仍然非常原始,有待探索。这本书是我帮助你理解和探索Zig这个激动人心的世界的个人旅程的尝试。 我假设你在阅读本书时已经有一些编程语言的经验,不一定是低级语言。所以,如果你有Python或Javascript的经验,例如,那就足够了。但是,如果你确实有低级语言的经验,如C、C++或Rust,你可能会在本书中学得更快。 什么是Zig? Zig是一门现代的、低级的、通用编程语言。一些程序员认为Zig是C的现代化和改进版本。 在...