Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion course/.vitepress/theme/config.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
const version: string = "0.14.0";
const version: string = "0.15.1";

export { version };
244 changes: 244 additions & 0 deletions course/update/0.15.1-description.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
---
outline: deep
comments: false
showVersion: false
---

# `0.15.1`

2025/1/20,`0.15.1` 发布,自上一个版本来历时 5 个月,共有 162 位贡献者参与,进行了 647 次提交!

Zig 官方团队直接从 `0.14.0` 跨越到了 `0.15.1`。在默认选择 Zig 的 x86 后端后,调试编译速度提高了 **5** 倍;正在开发的 aarch64 后端也紧随其后。同时,随着 `Writergate` 事件以及一系列语言变更和标准库的调整,**大量** API 有破坏性更改;这预示着 async/await 即将重生;也是语言稳定化的最后关头。

## 编译器重大改进

### x86 后端性能突破

**调试模式**的编译速度提高了 **5** 倍;这是本次更新最显著的性能改进。x86 后端现在是**调试模式**的默认选择,为缩短开发周期提供了强有力的支持。

### aarch64 后端开发进展

aarch64 后端的开发也在稳步推进,持续优化 ARM 平台支持,为多架构开发提供更好的体验。

### 增量编译功能增强

增量编译功能得到了进一步优化,现在支持:

- 与文件系统监视结合使用
- 仅检查编译错误模式
- 更快的重建速度

### 多线程代码生成

编译器现已支持多线程代码生成,能够充分利用多核 CPU 的性能优势。

## 语言特性重大调整

### 移除 `usingnamespace` 关键字

这是一个**破坏性变更**,`usingnamespace` 关键字被完全移除。所有使用 `usingnamespace` 的代码都需要重写,建议采用显式导入方式替代,以提高代码可读性和可维护性。

### 移除异步关键字

`async` 和 `await` 关键字已被移除,当前异步编程模型也随之取消,为未来新的异步方案做准备。这预示着 Zig 协程 的重生。

### 增强对非穷尽枚举的 `switch` 支持

新增对非穷尽枚举使用 `switch` 语句的支持,提高了枚举处理的灵活性,能够更好地处理未知枚举值,增强代码的健壮性。

### 扩展布尔向量运算符支持

布尔向量现在支持更多运算符,包括逻辑运算和比较运算。

### 内联汇编:类型化的破坏描述符

内联汇编现在支持类型化的 `clobber` 列表,提供了更好的类型安全保证。

### 指针转换能力增强

`@ptrCast` 现在允许从单项指针转换为切片,提供了更大的灵活性。

### 调整 `undefined` 运算规则

对 `undefined` 值的算术运算规则有所调整,任何与 `undefined` 的运算结果都将返回 `undefined`。

### 加强有损转换检测

对于可能导致精度损失的整数到浮点数转换,编译器会视为错误。

## 标准库重大变更

### Writergate:I/O 接口完全重构

这是本次更新中**最重大的破坏性更改**,被社区称为 "Writergate":

- `std.io.Reader` 和 `std.io.Writer` 接口被完全重新设计
- 新接口采用非泛型设计
- 缓冲区位于接口之上
- 旨在提高性能并减少不必要的拷贝
- **需要大量代码重写**

### 格式化系统调整

格式化系统进行了重要调整:

- 调用自定义 `format` 方法需要使用 `{f}` 格式说明符
- `format` 方法签名简化,移除了格式字符串和选项参数
- 格式化打印不再处理 Unicode
- 新增了更多格式化说明符

### `ArrayList` 非托管化

容器类型的重要变更:

- `std.ArrayList` 现在默认采用非托管方式
- 开发者需要显式提供分配器
- 与其他非托管容器保持一致
- 提供更好的内存管理控制

### 链表去泛型化

链表类型进行了重构,去除了泛型化设计。

### HTTP 客户端和服务器

标准库新增了 HTTP 支持,提供内置的 HTTP 客户端和服务器功能。

### TLS 客户端

新增内置 TLS 支持,可以建立安全的 TLS 连接。

### 环形缓冲区

新增了环形缓冲区类型,提供高效的循环缓冲区实现。

### 移除 BoundedArray

`BoundedArray` 被移除,建议使用 `ArrayList` 或固定大小数组替代。

## 构建系统改进

### 移除隐式根模块

构建系统移除了对隐式根模块的支持,现在需要在构建脚本中明确指定模块;这提高了构建配置的清晰度和准确性。

### macOS 文件系统监视

在 macOS 上新增了文件系统监视功能:

- 能够在文件更改时自动触发重建
- 支持 `--watch` 和 `--debounce` 选项
- 显著提高开发效率

### Web 界面和时间报告

构建系统现在支持 Web 界面和详细的时间报告功能。

### 模糊测试器

Zig 0.15.1 集成了一个内置的模糊测试器:

- 支持进程内模糊测试
- 提供 Web UI 界面
- 支持实时代码覆盖率显示
- 可以快速发现代码中的潜在问题

## 工具链更新

### LLVM 20

升级到 LLVM 20,带来了:

- 更好的优化支持
- 新的目标架构支持
- 改进的调试信息生成
- 更好的 C++ 交互性

### FreeBSD 和 NetBSD libc 支持

在交叉编译时新增了对动态链接的 FreeBSD 和 NetBSD libc 的支持。

### glibc 2.42

升级到 glibc 2.42,并支持静态链接本机 glibc。

### MinGW-w64 更新

MinGW-w64 工具链得到了更新,进一步改进了对 Windows 的交叉编译支持。

### zig libc 和 zig cc 增强

`zig libc` 和 `zig cc` 命令的功能得到了增强:

- 更好的 GCC 兼容性
- 支持更多编译选项
- 更清晰的错误报告

## 版本跳跃说明

Zig 官方团队选择直接从 `0.14.0` 跳跃到 `0.15.1`,这一决策反映了:

- 本次更新包含的重大变更数量之多
- 对编译器性能的重要改进
- 标准库接口的重大重构
- 为未来版本奠定更坚实的基础

## 升级挑战与机遇

### 主要挑战

1. **Writergate**:I/O 接口的完全重构需要重写大量相关代码
2. **移除 `usingnamespace`**:需要调整导入方式
3. **异步代码调整**:需要移除 async/await 使用
4. **ArrayList 变更**:需要调整容器使用方式

### 主要机遇

1. **编译速度提升**:5 倍的调试编译速度改进
2. **更清晰的代码**:移除隐式行为,提高代码可读性
3. **更好的性能**:新的 I/O 接口设计更高效
4. **开发效率**:文件系统监视功能和模糊测试器

## 社区影响

这次更新对 Zig 社区产生了重要影响:

- **学习曲线**:新用户需要适应新的接口设计
- **迁移工作**:现有项目需要进行大量调整
- **性能收益**:编译速度的显著提升改善开发体验
- **生态系统**:库作者需要更新以适配新接口

## 技术债务清理

本次更新体现了 Zig 团队对技术债务的积极清理:

- 移除了有争议的 `usingnamespace` 特性
- 重构了性能不佳的 I/O 接口
- 统一了容器类型的设计理念
- 为未来的语言演进奠定坚实基础

## 未来展望

`0.15.1` 为 Zig 的未来发展奠定了重要基础:

- **编译性能**:为大型项目开发提供更好支持
- **接口设计**:更一致、更高效的标准库
- **开发体验**:更快的编译和更好的工具支持
- **语言稳定性**:移除不稳定特性,为 1.0 做准备

## 路线图

### I/O 作为接口

I/O 系统将继续作为接口进行发展和完善,为未来的异步编程模型做准备。

## 建议

对于 Zig 开发者:

1. **谨慎升级**:在测试环境中充分验证
2. **分步迁移**:逐步调整代码以适配新接口
3. **充分利用性能优势**:积极采用有关编译速度的改进
4. **关注社区动态**:参与社区讨论,分享迁移经验和最佳实践

`0.15.1` 是 Zig 发展历程中的一个重要里程碑,虽然带来了较多的破坏性变更,但为语言的长期发展和性能提升奠定了坚实的基础。这标志着语言稳定化的最后阶段,为 1.0 版本的正式发布做好了充分准备。
Loading
Loading