作者 | 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 很容易,但对于有些人(比如我)来说却不是这样,但这门语言本身力求简单、统一和正确。出于这个原因,我认为这门语言值得一试。

原文链接:http://ratfactor.com/zig/hard,未经允许,禁止转载!

推荐阅读:

▶余承东回应高通对华为恢复 5G 芯片供应;ChatGPT 发布重要更新;微软推出免费 AI 入门课|极客头条

▶Altman、Hinton 中国首秀:GPT 终将过时,AI 是当今世界最迫切的问题!

▶再见,Ubuntu,你好,Manjaro

我认为 Zig 非常难,但值得一试相关推荐

  1. 如何低成本减少企业知识流失?天翎知识文档系统+群晖NAS值得一试

    编者按:知识管理可以减少企业知识流失,有效提高企业员工工作水平,增强企业综合竞争力.如何小成本做好企业知识管理呢?天翎知识文档系统+群晖NAS值得一试. 关键词:标签分类,权限管理,在线预览,在线编辑 ...

  2. oracle 怎么判断是不是第一条记录_怎么判断自己是不是阳痿呢?防治阳痿的5个方法值得一试...

    关键时刻,想硬却硬不起来.这对于男人来说,是件非常丢脸的事情. 没有哪一个男人不看重女人的容颜,没有哪一个女人能接受无性的婚姻! 如果男人得了阳痿不积极治疗,夫妻感情将面临严重危机! 那么,问题来了, ...

  3. APP:分享六款非常实用的冷门APP软件,值得一试!

    今天小编给大家分享分享六款非常实用的冷门APP软件,值得一试! 1.泼辣修图 泼辣修图是一款非常专业的手机修图软件. 它的软件定位的目标用户就是摄影师,所以拿它来修出的照片,一下就高大上了许多. 软件 ...

  4. 水面反光如何拍摄_拍照反光太难看?这八个办法值得一试!

    新手入行拍摄,尤其是在拍摄镜面质感的静物.风光.戴眼镜的人像时,肉眼看着非常好,回到镜头下难免为不合时宜的反光抓耳挠腮. 照着前辈的说法调整角度规避反光,换来换去就是换不到对的角度. 如果你还在为不知 ...

  5. 自学python编程笔记本推荐-这件神器,每个 Python入门学习者都值得一试

    原标题:这件神器,每个 Python入门学习者都值得一试 灰常实用的一篇文章,看完你会来点赞滴. 不论你是刚开始学 Python,还是正在啃数据分析的骨头,对你来说,不断在各种命令行窗口和编辑器里切来 ...

  6. 九个值得一试的跨平台移动应用开发工具

    移动应用已经成为日常生活的一个密不可分的部分.而应用程序开发人员面临的最大挑战之一就是如何在多个平台上创建运行良好的应用程序.在这里,我们将分享九个值得一试的跨平台移动应用开发工具.这些工具将有助于在 ...

  7. Linux端类似种子猫的软件,值得一试的四款Linux Torrent客户软件

    原标题:值得一试的四款Linux Torrent客户软件 [51CTO.com快译]我最近由Ubuntu换成了Arch Linux,正在安装设置Arch系统,以获得预期的全部功能.任何Linux用户的 ...

  8. 专门画像素图的软件_新世纪像素画设计软件,你值得一试!

    哟,大家好,我是骼灵桑桑哟.这一次的文章主角便是我们手机玩家最受欢迎的像素游戏之一"元气骑士".好!问题来了,为什么?这一次的文章我会提到元气骑士呢?而我这次文章的标题又为何取名为 ...

  9. linux 游戏大作,20款值得一试 外媒盘点Mac平台游戏大作

    原标题:20款值得一试 外媒盘点Mac平台游戏大作 外媒为我们盘点了最好玩的20款将Mac游戏,这些游戏不止在Mac上,多数平台均已支持,在Mac上体验更佳,感兴趣的朋友一起来试试看吧.(图片来自te ...

最新文章

  1. 运维企业专题(3)LB负载均衡介绍
  2. 鸟哥的私房菜 第0章
  3. hdu4585 STL水题
  4. 由巨型计算机到微型计算机,微机原理第一章节:基础知识.ppt
  5. JDBC-连接数据库代码
  6. java插件获取首选项_Eclipse RCP 中创建自定义首选项,并能读取首选项中的值
  7. WPF依赖属性(续)(1)
  8. (转) shiro权限框架详解04-shiro认证
  9. 设计模式 - 访问者模式
  10. [LibreOJ β Round #4] 子集
  11. 为什么倡导企业使用电子招投标?
  12. pcl求平面法向量_PCL自动求解平面法向量参数化表示
  13. u盘获取计算机管理员权限,使用U盘需要管理员权限
  14. 详谈双亲委派机制(面试常问)
  15. 安卓系统7.1搭建Xposed环境
  16. 数据治理管理平台——数据资产管理
  17. Openlayers笔记之图片偏移的完整解决方案
  18. Win11电脑怎么开启色盲模式
  19. 大学生计算机基础与实训,大学生计算机基础实训六样文.docx
  20. python用保留字while实现无限循环_Python中无限循环需要什么条件

热门文章

  1. spring的full模式和lite模式的异同
  2. 江苏扬州通报考古人员被打事件:两名城管队员已被拘
  3. windows10下安装docker且使用wsl2安装双系统并构建最小jre镜像和应用镜像
  4. C#与sqlserver开发问题
  5. 公共计算机课程教学情况调查问卷,信息技术课程标准实施情况调查问卷.doc
  6. 劳易测测距传感器ODS9L2.8/LAK-650-M12
  7. 新款迈巴赫GLS480升级大柏林音响,华章翩翩,只有它是最爱
  8. 智慧垃圾焚烧发电厂Web3D可视化管理系统
  9. ’eplan client service‘的连接不可用
  10. 传呼机兴衰史:服务中国20余年