Zig 单挑 Rust、C++!Nodejs对手 Bun 给的勇气?

  • 时间:2025-11-19 19:42 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!高级前端进阶今天给大家带来的主题是助力Bun大火的底层语言Zig,话不多说,直接开始!1.什么是 ZigZig 是一种命令式的、通用的、静态类型的、编译的系统编程语言,由 AndrewKelley 设计。Zig 语言的设计是为了实现鲁棒性、优化和可维护性,并

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

Zig 单挑 Rust、C++!Nodejs对手 Bun 给的勇气?

高级前端进阶

今天给大家带来的主题是助力Bun大火的底层语言Zig,话不多说,直接开始!

1.什么是 Zig

Zig 是一种命令式的、通用的、静态类型的、编译的系统编程语言,由 AndrewKelley 设计。Zig 语言的设计是为了实现鲁棒性、优化和可维护性,并支持编译时的泛化、反射和执行、交叉编译和手动内存管理。

Zig 单挑 Rust、C++!Nodejs对手 Bun 给的勇气?

Zig 语言把自己的竞争对手定为了 C 语言,注意不是 C++,但它也从 Rust 等语言中获得了灵感

Zig 有许多底层编程特性,特别是打包结构(字段之间没有填充的结构)、任意宽度的整数和多种指针类型。总之,Zig 不仅仅是一种新的语言,Zig 还自带 C/C++编译器,可以和这两种语言一起使用。

目前 Zig 在 Github 上有超过 20.8K 的 star、1.6k 的 fork、代码贡献者超过 600+,是一个值得长期关注的明星项目。

2.Zig 和 C++、D 和 Rust 对比

2.1 Zig 没有隐藏的控制流

如果 Zig 代码看起来不像调用函数,那么它就不是。 这意味着可以确定以下代码仅调用 foo(),然后调用 bar(),并且无需知道任何类型即可保证这一点:

var a = b + c.d;
foo();
bar();

隐藏控制流的例子包括:

  • D 具有 @property 函数,这些函数是使用看起来像字段访问的方式调用的方法,因此在上面的示例中,c.d 可能会调用一个函数。
  • C++、D 和 Rust 具有运算符重载,因此 + 运算符可能会调用函数。
  • C++、D 和 Go 有 throw/catch 异常,所以 foo() 可能会抛出异常,并阻止 bar() 被调用 (当然,即使在 Zig foo() 中也可能会死锁并阻止 bar() 被调用,但这在任何图灵完备语言中都可能发生)。
  • 此设计决策的目的是提高可读性。

2.2 Zig 没有隐藏的内存分配

Zig 在堆分配方面采用了一种不干涉的方法, 没有使用堆分配器的新关键字或任何其他语言功能(例如字符串连接运算符 )。 堆的整个概念由库和应用程序代码管理,而不是由语言管理。隐藏分配的例子包括:

  • Go 的 defer 将内存分配给函数本地堆栈。 除了作为此控制流工作的不直观方式外,如果在循环内使用 defer,它还可能导致内存不足故障。
  • C++协程分配堆内存以调用协程。
  • 在 Go 中,函数调用可能会导致堆分配,由于 goroutines 分配小堆栈,当调用堆栈足够深时,这些堆栈会调整大小。
  • 主要的 Rust 标准库 API 在内存不足的情况下会崩溃,接受分配器参数的备用 API 是事后才想到的

几乎所有垃圾收集语言都散布着隐藏的分配,由于垃圾收集器隐藏了清理端的证据。

隐藏分配的主要问题是它阻止了一段代码的可重用性,不必要地限制了代码适合部署到的环境数量。 简而言之,有些用例必须能够依赖控制流和函数调用而不会产生内存分配的副作用,因此编程语言只有在能够切实提供这种保证的情况下才能服务于这些用例。

在 Zig 中,有一些标准库功能可以提供和使用堆分配器,但这些是可选的标准库功能,并未内置在语言本身中。 如果您从未初始化堆分配器,可以确信程序不会进行堆分配。

每个需要分配堆内存的标准库功能都接受一个 Allocator 参数来执行此操作,这意味着 Zig 标准库支持独立目标。 例如: std.ArrayList 和 std.AutoHashMap 可用于裸机编程!

自定义分配器使手动内存管理变得轻而易举。 Zig 有一个调试分配器,可以在 use-after-free 和 double-free 的情况下维护内存安全, 它会自动检测并打印内存泄漏的堆栈跟踪。 有一个 arena 分配器,因此可以将任意数量的分配捆绑在一起并一次性释放它们,而不是单独管理每个分配。 专用分配器可用于提高性能或内存使用,以满足任何特定应用程序的需求。

2.3 Zig 对无标准库的一流支持

如上所述,Zig 有一个完全可选的标准库。 每个标准库 API 只有在使用它时才会被编译到程序中, Zig 同样支持链接到 libc 或不链接到它,同时 Zig 对裸机和高性能开发很友善。

例如在 Zig 中,与支持编译为 WebAssembly 的其他编程语言相比,WebAssembly 程序既可以使用标准库的正常功能,又可以生成最小的二进制文件。

2.4 Zig 可移植语言

Zig 的设计使得程序员可以做的最懒惰的事情就是正确地处理错误,因此开发者有理由信任库会正确地抛出错误。

目前,从实用的角度来说,C 是最通用和可移植的语言。 任何不具备与 C 代码交互能力的语言都有籍籍无名的风险。 Zig 正尝试成为新的库可移植语言,同时使其直接符合 C ABI 的外部功能,并引入安全和语言设计以防止实现中的常见错误。

2.5 Zig 简单

Zig 没有宏,也没有元编程,但依旧足够强劲,可以以清晰、非重复的方式表达复杂的程序。 甚至 Rust 也有像 format! 这样的特殊情况的宏,它是在编译器本身中实现的。 同时在 Zig 中,等效函数在标准库中实现,编译器中没有特殊情况代码。

2.6 Zig 工具完善

Zig 可以为 Linux、Windows、macOS 和 FreeBSD 提供二进制文件。

  • 通过下载和解压缩单个存档进行安装,无需系统配置
  • 静态编译,没有运行时依赖性
  • 使用成熟且得到良好支持的 LLVM 基础架构,可以对大多数平台进行深度优化和支持
  • 对大多数主要平台的开箱即用、交叉编译
  • 附带 libc 的源代码,将在任何支持的平台需要时动态编译
  • 包括带缓存的构建系统
  • 使用 libc 支持编译 C 和 C++ 代码

通过使用 Zig ,还可以逐步改善 C/C++/Zig 代码库。

  • 使用 Zig 作为零依赖、嵌入式 C/C++ 编译器,支持开箱即用的交叉编译
  • 利用 zig build 在所有平台上创建一致的开发环境
  • 为 C/C++ 项目添加一个 Zig 编译单元
  • 默认启用跨语言 LTO

3.Zig 的 hello world 示例

下面是 hello.zig 的程序内容:

// hello.zig
const std = @import("std");
pub fn main() !void {
    const stdout = std.io.getStdOut().writer();
    try stdout.print("Hello, {s}!
", .{"world"});
}

在终端中直接引入该文件,并执行代码:

$ zig build-exe hello.zig
$ ./hello
Hello, world!

该示例代码演示了一种创建程序的方法,该程序将输出:Hello, world!。 注意:存储 Zig 源代码的文件是 UTF-8 编码的文本文件,同时一般以 .zig 扩展名命名。

4.借力 Zig 的前端项目

4.1 Bun

Bun 是一个用于 JavaScript 和 TypeScript 应用程序的一体化工具包, 它以一个名为 bun 的可执行文件发布。Bun 的核心是运行时,这是一种快速的 JavaScript 运行时,旨在替代 Node.js。

Zig 单挑 Rust、C++!Nodejs对手 Bun 给的勇气?

Bun 是用 Zig 编写的,由 JavaScriptCore 提供支持,大大减少了启动时间和内存使用量。目前 Bun 在 Github 上有超过 40.3K 的 star、1k 的 fork、超过 54.9K 的项目使用它,代码贡献者超过 200+。

Bun 通过对内存的底层控制、严格的隐藏控制流把控等手段,使得编写快速软件变得更加简单,同时 Bun 也赞助了 Zig 软件基金会,关于 Bun 的更多内容可以继续在我的主页阅读。

4.2 通用库、编辑器、运行时等

PrismJS 是一款轻量级、可扩展的语法高亮显示工具,在支持现代 Web 标准基础下增加了更多可选的风格插件。

PrismJS 支持自定义扩展代码的语言、主题和插件选项,勾选自己常用的代码语言和主题风格以及增强插件,将定制好的代码文件 prism.css 和 prism.js 链接到页面。

目前 PrismJS 已经支持了 Zig 语言的。除了这些通用的库外,目前 sublime、vscode 等编辑器,wasm、wasmer、wasmtime 等 WebAssembly 运行时也都已经添加对 Zid 的支持,更多内容可以继续阅读文末参考资料。

5.本文总结

本文主要和大家介绍JavaScript 运行时 Bun的底层语言 Zig。由于篇幅有限,文章并没有过多展开,如果有兴趣,文末的参考资料提供了优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!

参考资料

https://github.com/ziglang/zig

https://ziglang.org/

https://ziglang.org/documentation/0.10.1/

https://ziglang.org/learn/why_zig_rust_d_cpp/

https://zhuanlan.zhihu.com/p/386536481

https://bun.sh/

https://github.com/oven-sh/bun

https://github.com/PrismJS/prism

https://github.com/catdevnull/awesome-zig

  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部