Rust、Zig,能够干翻Java、C?

撰稿 | 云昭
出品 | 51CTO技术栈(微信号:blog51cto)
众所周知,由于其根源于 Mozilla,Rust 在历史上与系统编程联系在一起,它对安全性、速度和并发性的承诺,使其在基础设施层面得到了广泛采用 。这种地位的上升引发了一个有趣的问题:Rust 在传统上由动态语言主导的领域是否拥有更高的地位?
近日,一场汇聚了新兴语言的主要开发者的会议P99 CONF,为我们带来了Rust与Zig如何相互借鉴,并让与会者们参与了挑战C++、Go甚至JAVA等主流语言的探讨 。且让我们一探Rust与Zig的未来 。
一、Zig可以借鉴Rust,反之亦然世界上伟大的事物往往是完全开放,既可以和而不同,又可以相互借鉴 。Zig与Rust之所以快速成为全球编程社区的“宠儿” , 也是做到了开放与借鉴 。 
1.Zig学习Rust哪些?Bun的创建者Jarred认为 , Zig可以Rust那里引进“有限的编译时概念”,比如在各种类似作用域的情况下的一些借用检查器 。此外,Zig安全方面还比较欠缺,两个明显的例子就是,还可以返回指向堆栈内存的指针,例如堆栈分配的缓存区,这都是不应该做的 。
Zig语言还非常新,但诞生之初就懂得借鉴 。比如向Go借鉴了延迟(defer),即延迟键盘和语言 。与Go实现的区别在于 , 它是针对每个作用域的,而不是针对每个函数的 。在 Go 中,defer 会将其附加到函数的末尾,而对于 Zig 来说,它位于作用域的末尾 。这通常就是开发者进行资源清理的方式 。 
但Zig的延迟做的还不够好,至少有某种形式的析构函数,因为它很容易被忘记 。“有时我确实希望有构造函数和析构函数……但我的心情很复杂 。”
2.Rust羡慕Zig什么? Rust主要开发者Carl , 则表示了Rust对于Zig编译速度的羡慕 。“Zig 的编译速度肯定要快得多 。Rust 肯定会从中受益 。”
Rust目前的一个痛点就是:一旦你摆脱借用检查器而使用 Rust 进入不安全代码 , 它就很不符合人体工程学,而事实上 , 在编写nice的不安全代码方面,Rust其实有许多地方可以改进 。Carl表示:我们编写的不安全代码比典型的应用程序开发人员多得多,因为我们正在构建这些类型的原语 。Zig在这方面可以给Rust以灵感 。
P99 CONF 的长期支持者Glauber , 认为 Zig 有两件事可以让 Rust 受益匪浅 。第一个是comptime 。comptime 是Zig一个非常好的特性,即在编译期引入自身作为胶水语言来生成代码的能力,甚至被Glauber称为天才之举,“我希望每种语言都有这样的功能 。
C++中的模板系统与 comptime 相比……根本不在同一个级别 。”
可能很多人不太熟悉comptime,简单来说,它允许开发者在编译时评估任意代码 。许多语言都有类似模板的语法,然后还有一些其他变体,一些其他方式来具有编译时标志、功能和参数 。这也是类型系统的工作原理 。例如,标准库中的 ArrayList 类型接收 comptime 类型参数,然后就有一个该类型的切片 。这有点像编译时的duck-typing类型 。 
举例来说 , Zig用它来生成用于源映射解析的查找表 。sourcemaps 使用这种编码 VLQ 。“如果我们生成此查找表,则源映射编码速度将比以前快 18% 。最初,我们是在运行时执行的 。”Zig 使其变得非常简单 , 因为只需传递关键字即可 。顶级作用域中的任何内容都是 comptime,否则 , 就可以将其传递到作用域中的关键字 comptime 中 。
第二个,是 Rust交叉编译到不同的平台,是一个非常痛苦的事情 。这方面Go 做得非常好,Zig 也比 Rust 做得更好 。
交叉编译方面,Carl还透露了Zig的情况 。“现在在 Bun CI 中,我们在 linux 机器上为所有不同的平台、每个 Zig 部分构建每个目标文件 。因为每台机器都有大量内存以使其编译速度更快 。因此,我们在 Linux 上构建所有 Zig 代码,即使它是针对 mac OS 的 。” 
二、用C的人为什么讨厌Rust,喜欢ZigRust 一直是注重性能的 P99 CONF 社区的宠儿 。即使我们以 C++、Go 甚至 Java 的令人印象深刻的性能成就案例研究为特色,讨论也不可避免地转向“但为什么不是 Rust?”
很多人习惯于C , 将C用于高效工作,因为C语言确实让你的移动速度快得令人难以置信(直到出现错误) 。他们选择Rust,尝试像C一样编写Rust,最终都会遇到Rc<RefCell<...>>,unsafe{...}等 。
这种大量的错误报告和“调试地狱”会带来非常强烈的负面反应 。


推荐阅读