作者 | Dave Gauer 译者 | 弯月
出品 | CSDN(ID:CSDNnews)
2016 年 Zig 编程语言发布的简介中说,“我利用一个周末的时间,花费六个小时就学会了 Zig!”还说,“Zig 语言很容易上手,因为语法很简单。”
很多人确实觉得 Zig 很容易学习。尤其是经验丰富的 C 程序员,他们觉得学习 Zig 语言很自然,而且非常合乎逻辑。有人曾这样描述 Zig:“就是C语言,只不过修复了一些问题。”
Zig 的语法相对较少确实是事实。对于某些人来说,只需要阅读一页文档(ziglang.org)就能“学会”。(请注意,这一页文档打印出来大约是256页。)
然而问题在于,语法的简洁性与易学性之间并没有直接的关联。如果真的有的话,Lisp 的 S 表达式也非常简单,只需一顿午餐的时间就能学会了。还有 Forth,也只不过是空格分隔的单词而已,这都是你早就知道的知识了。Zig 是一种相对“小”且“简单”的语言,这的确降低了学习难度。(相比之下,除了专家之外,没有人能在一个下午学会 C++ 或 Rust,因为这些语言的学习内容太多了。)
但我想郑重声明,Zig 很难掌握,我相信很多人都有类似的感觉。如果你的编程背景和我一样,那么肯定会觉得学习 Zig 具有挑战性。
在此,我想阐述一下原因,以及这门语言的美妙之处和值得学习的原因。
Zig 是一门全新的语言
首先,你需要明白,书店里还没有 Zig 的书籍出售。即使有,也会在一个月内过时。Zig 正在迅速变化。(我怀疑如果没有他人的帮助,我能否靠自己的力量保持 Ziglings (https://github.com/ratfactor/ziglings)常新!)
重点在于,除了源代码本身,标准库基本上没有任何文档。(公平地说,有些部分的注释很详细,但大部分的可读性还是一言难尽。)其他所有学习资料都散落在网上,你必须自己动手实践,看看示例是否仍然可以编译。
对于想要学习这门语言的人来说,这并不是什么好消息。
Zig 迫使你做出选择
根据个人的背景不同,你可能会不习惯认真考虑程序中每个运行时值的准确数字类型(u8、i16、f64 等)。处理“字符串”意味着处理指针、标记终止符、数组和切片。如果你习惯于可为你处理这些细节的动态语言,那么使用 Zig 会降低你的速度。
如果你不熟悉手动内存管理,那么这个障碍需要你花费大量时间克服。
虽然无论是哪种语言,手动内存管理都不容易,但 Zig 抛出了一个(大多数?)开发人员都很少面临的决策:选择内存分配策略。如果你不做出决定,就无法很好地编写程序。Zig 标准库有很大一部分代码需要你提供内存分配器。
这对初学者来说真是太难了!
这实际上是 Zig 最酷的设计之一。为了编写高性能软件,我们都应该学习如何获取和使用内存。我们应该根据用程序选择最好的类型和分配器。
Zig 很教条
Zig 前期的学习很难,但从长远来看更容易学习,原因是 Zig 没有未定义的行为。虽然 C 本身是一种很紧凑的语言,但需要花很多时间来掌握如何避免C语言中的未定义行为,因为C语言允许你做各种不正确的事情。但在 Zig 中,未定义的行为是一种错误。
我曾经是 Rust 菜鸟和 Zig 菜鸟。这两种语言的共同点是和编译器打架,因为我知道我想做什么,但不知道如何表达。
Zig 的类型系统非常合乎逻辑,但学习如何正确创建转换类型仍然需要时间,因为基本构建块可能出现的组合太多了:
变量(var)与常量(const);
可选值(?);
错误联合(!)
单项指针(*)与多项指针([*]);
数组切片([] 和 [x..y]);
哨兵(sentinel )终止([n:null])。
将各种类型组合到一起,最终你可以得到类似于 [*:null]const ?[*:0]const u8 的东西(这是我个人早期遇到的一个真实例子)。
有一些代码用汇编语言编写比使用 Zig 更快,因为我花了很长时间才弄清楚如何表达我的意图。
C 和汇编程序不太关心我使用内存做什么,所以无论是何种类型,使用这两种语言编写执行动作的代码更加容易。但是程序会出现段错误。使用 Zig 可以编写正确的代码,这是一件好事。虽然编写代码的速度更慢,而且更乏味,尤其是刚开始的时候,但这是一件好事。
Zig 的 comptime
很多语言都有元编程,但它们都不尽相同。你积累的 C 预处理器的知识无法帮你编写 Zig 的编译时代码。宏的知识也用不上,各种动态语言的运行时自省更是毫无用武之地。
Zig 的 comptime与其他语言完全不同。你需要了解它,否则会在早期遇到错误,这些错误是无法避免的,迟早都会出现。
由于有一组特定的规则(包括使用关键字comptime),“常规”Zig 代码将在编译时运行,生成运行时可执行文件,包含预先计算的值、删除不需要的代码、“展开”循环以及生成内联代码以处理不同的数据类型。
关于 comptime 的好坏,只有时间才能证明。到目前为止,这似乎是一个非常可靠的概念。在编译时执行部分程序,不仅可以解决大量棘手的语言问题,而且无需引入太多额外的概念。
究竟什么是“难”,什么是“容易”?
Zig 编程语言的主页没有提到“容易”一词,但语言本身确实不难。
正如 Rich Hickey 所说,之所以看似容易是因为我们很熟悉。容易是主观的。但简单就是简单,不会复杂,而且概念也很少。所以说,简单是客观的。
可能对某些人来说,Zig 很容易,但对于有些人(比如我)来说却不是这样,但这门语言本身力求简单、统一和正确。出于这个原因,我认为这门语言值得一试。
领取专属 10元无门槛券
私享最新 技术干货