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

高级前端进阶
今天给大家带来的主题是助力Bun大火的底层语言Zig,话不多说,直接开始!
Zig 是一种命令式的、通用的、静态类型的、编译的系统编程语言,由 AndrewKelley 设计。Zig 语言的设计是为了实现鲁棒性、优化和可维护性,并支持编译时的泛化、反射和执行、交叉编译和手动内存管理。

Zig 语言把自己的竞争对手定为了 C 语言,注意不是 C++,但它也从 Rust 等语言中获得了灵感。
Zig 有许多底层编程特性,特别是打包结构(字段之间没有填充的结构)、任意宽度的整数和多种指针类型。总之,Zig 不仅仅是一种新的语言,Zig 还自带 C/C++编译器,可以和这两种语言一起使用。
目前 Zig 在 Github 上有超过 20.8K 的 star、1.6k 的 fork、代码贡献者超过 600+,是一个值得长期关注的明星项目。
如果 Zig 代码看起来不像调用函数,那么它就不是。 这意味着可以确定以下代码仅调用 foo(),然后调用 bar(),并且无需知道任何类型即可保证这一点:
var a = b + c.d;
foo();
bar();隐藏控制流的例子包括:
Zig 在堆分配方面采用了一种不干涉的方法, 没有使用堆分配器的新关键字或任何其他语言功能(例如字符串连接运算符 )。 堆的整个概念由库和应用程序代码管理,而不是由语言管理。隐藏分配的例子包括:
几乎所有垃圾收集语言都散布着隐藏的分配,由于垃圾收集器隐藏了清理端的证据。
隐藏分配的主要问题是它阻止了一段代码的可重用性,不必要地限制了代码适合部署到的环境数量。 简而言之,有些用例必须能够依赖控制流和函数调用而不会产生内存分配的副作用,因此编程语言只有在能够切实提供这种保证的情况下才能服务于这些用例。
在 Zig 中,有一些标准库功能可以提供和使用堆分配器,但这些是可选的标准库功能,并未内置在语言本身中。 如果您从未初始化堆分配器,可以确信程序不会进行堆分配。
每个需要分配堆内存的标准库功能都接受一个 Allocator 参数来执行此操作,这意味着 Zig 标准库支持独立目标。 例如: std.ArrayList 和 std.AutoHashMap 可用于裸机编程!
自定义分配器使手动内存管理变得轻而易举。 Zig 有一个调试分配器,可以在 use-after-free 和 double-free 的情况下维护内存安全, 它会自动检测并打印内存泄漏的堆栈跟踪。 有一个 arena 分配器,因此可以将任意数量的分配捆绑在一起并一次性释放它们,而不是单独管理每个分配。 专用分配器可用于提高性能或内存使用,以满足任何特定应用程序的需求。
如上所述,Zig 有一个完全可选的标准库。 每个标准库 API 只有在使用它时才会被编译到程序中, Zig 同样支持链接到 libc 或不链接到它,同时 Zig 对裸机和高性能开发很友善。
例如在 Zig 中,与支持编译为 WebAssembly 的其他编程语言相比,WebAssembly 程序既可以使用标准库的正常功能,又可以生成最小的二进制文件。
Zig 的设计使得程序员可以做的最懒惰的事情就是正确地处理错误,因此开发者有理由信任库会正确地抛出错误。
目前,从实用的角度来说,C 是最通用和可移植的语言。 任何不具备与 C 代码交互能力的语言都有籍籍无名的风险。 Zig 正尝试成为新的库可移植语言,同时使其直接符合 C ABI 的外部功能,并引入安全和语言设计以防止实现中的常见错误。
Zig 没有宏,也没有元编程,但依旧足够强劲,可以以清晰、非重复的方式表达复杂的程序。 甚至 Rust 也有像 format! 这样的特殊情况的宏,它是在编译器本身中实现的。 同时在 Zig 中,等效函数在标准库中实现,编译器中没有特殊情况代码。
Zig 可以为 Linux、Windows、macOS 和 FreeBSD 提供二进制文件。
通过使用 Zig ,还可以逐步改善 C/C++/Zig 代码库。
下面是 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 扩展名命名。
Bun 是一个用于 JavaScript 和 TypeScript 应用程序的一体化工具包, 它以一个名为 bun 的可执行文件发布。Bun 的核心是运行时,这是一种快速的 JavaScript 运行时,旨在替代 Node.js。

Bun 是用 Zig 编写的,由 JavaScriptCore 提供支持,大大减少了启动时间和内存使用量。目前 Bun 在 Github 上有超过 40.3K 的 star、1k 的 fork、超过 54.9K 的项目使用它,代码贡献者超过 200+。
Bun 通过对内存的底层控制、严格的隐藏控制流把控等手段,使得编写快速软件变得更加简单,同时 Bun 也赞助了 Zig 软件基金会,关于 Bun 的更多内容可以继续在我的主页阅读。
PrismJS 是一款轻量级、可扩展的语法高亮显示工具,在支持现代 Web 标准基础下增加了更多可选的风格插件。
PrismJS 支持自定义扩展代码的语言、主题和插件选项,勾选自己常用的代码语言和主题风格以及增强插件,将定制好的代码文件 prism.css 和 prism.js 链接到页面。
目前 PrismJS 已经支持了 Zig 语言的。除了这些通用的库外,目前 sublime、vscode 等编辑器,wasm、wasmer、wasmtime 等 WebAssembly 运行时也都已经添加对 Zid 的支持,更多内容可以继续阅读文末参考资料。
本文主要和大家介绍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