
Go、Rust和Zig是过去十年中最受欢迎的三种新编程语言。以下是您需要了解的有关它们的最佳用途、功能以及发展方向的信息。
每种语言都有其生命周期。有时,它从一个相对狭窄的用例开始,然后脱离其范围;有时,它原本打算成为一种通用语言,但却找到了一个强大的利基市场。
在过去十多年里,三种新语言在软件开发领域脱颖而出,备受关注。在本文中,我们将探讨每种语言的特别之处以及它们的发展方向。
Go
谷歌创建的Go语言具有相对精简的语法、简单的范例和便捷的部署工具,使编写快速、紧凑的程序变得更加容易,而且不需要开发人员过多考虑内存安全。
自推出以来的十年左右,Go已经找到了一些可以蓬勃发展的领域。网络或Web服务(尤其是具有异步行为的服务)很容易用Go编写。
在这方面,它已成为Python的强大替代品。Go可以扩展以处理比Python更多的流量,而且工作量更少。
以独立二进制文件形式交付的应用程序(如命令行工具)也是Go的另一个不错的选择。编译后的Go程序无需外部依赖即可运行,并且可以为每个主要平台构建。
Go最大的障碍和开发者的抱怨往往源于其主要卖点之一:语言刻意简单。Go的维护者试图使其语法和功能集尽可能地保持平淡无奇和不变,以保持向前兼容为目标。
但Go的选择也可能让人觉得是故意冷落了编程语言在过去几十年中获得的强大功能。泛型是最近才添加到Go中的,错误处理比其他任何东西都更接近C的做事方式。
在一个发展太快、打破太多东西的世界里,这是一种受欢迎的态度。它还对开发施加了限制,对于依赖Go的项目来说,这可能很难摆脱这种限制。
Rust
当程序需要内存安全性和速度时,Rust是经常排在首位的语言。Rust的全部功能是提供快速、机器原生的代码,这些代码不会犯下各种内存安全错误,因为它们根本不会在生产中出现。
Rust及其强大功能的热情高涨,使其拥有了广泛的使用范围。大多数是服务器端、云计算、分布式系统或以网络为中心的应用程序------这些曾经通常只属于Java或C++的领域。
它在WebAssembly世界中也占有重要地位,因为它可以原生编译为WASM,因此可以在许多其他环境中重复使用。
Rust最有新闻价值的应用(即使不是最广泛使用的)是替换现有"brownfield"项目中的C/C++代码。Linux内核维护人员正在制定(尽管有些困难)计划,将Rust代码战略性地纳入内核。
这并不是要完全淘汰C的使用,而是要在能够以最少的额外维护负担(例如设备驱动程序)提供最大收益的地方使用Rust。目标是增强内存安全性,而不会强迫Linux内核C开发人员在不愿意的情况下重新使用Rust。
一些Linux内核开发人员反对这一举措,他们指出,该语言存在一些常见的问题,例如学习难度高、提前复杂性高。Rust的内存安全性要求程序员提前思考如何满足编译器的要求,而适应这种思维方式是Rust新手的常见必经之路。
此外,Rust项目通常需要数十或数百个外部依赖项,这会减慢编译时间,这与JavaScript世界中类似的蔓延现象如出一辙。
毫无疑问,人们既需要内存安全,又需要速度。理想的情况是Rust的更精简版本,或者是一种新语言,既能提供相同的好处,又不需要Rust的概念开销。不过,就目前而言,毫无疑问Rust已经激发了一代想要它所提供的东西的开发人员。


Zig
AndrewKelley的个人编程语言项目于2015年启动,定位为C的补充和竞争对手。Zig的目标领域与C大致相同:低级、非垃圾收集、可移植语言的世界。Zig还可编译为与C相同类型的目标,包括WebAssembly。
不过,与C不同的是,Zig具有原生功能,可以更轻松地编写内存安全的低级代码。与Rust(该领域的另一种主要语言)不同,Zig不需要程序员为了正确性而付出如此多的努力。
内存管理是手动完成的,但该语言提供了比C更多的用于处理内存的语法工具。
一个例子是Zig的defer语句,用于在范围末尾清理资源。默认情况下,许多常见的运行时问题(如整数溢出)都会被捕获,并且可以被精细地覆盖(尽管仅限于给定范围内),但默认是为了安全。
Zig旨在取代C的一种方式是优雅地与C集成------与C并驾齐驱,甚至使用C自己的库。这为那些开发C应用程序的人提供了一条过渡到Zig的路径,而不需要废弃和重做一切。
Zig编译器甚至可以用作C编译器,并且可以使用CABI构建Zig库,以允许C使用Zig代码。
Zig面临的最大障碍对于任何新语言来说都是典型的。语言本身处于不断变化中(其当前版本为0.15),在发展过程中的任何时候都可能出现重大变化。它旨在取代的传统世界------C"电影世界"------也根深蒂固,不仅包括语言,还包括C的开发文化。
新语言的另一个常见障碍------常用编辑器和IDE中的工具------似乎正在迅速消失。VisualStudioCode中的Zig插件提供了编译器本身,而不仅仅是语言服务器,作为编辑器的一个易于集成的组件。