没有什么比谈论一门新语言能够让程序员更加兴奋、更加固执己见的了。作为两枚冉冉升起的新星, Go 和 Rust 让我们置身在这场旋窝之中。作为灵感相似但是动机与目标完全不同的两门语言,Go和Rust可谓都是出身豪门。Go产生于Google,由Rob Pike和Ken Thompson等人设计实现;而Rust则是根据Graydon Hoare在Mozilla研究时的设想构建而成。虽然刚开始的时候这两门语言都是实验性的项目,但是很快它们就开花结果并成为了各自公司全力开发的项目。
从诞生之日起,Go和Rust这两门语言就有尖锐的分歧。尽管它们都借鉴了C和C++的一些思想,但是它们所针对的应用场景和开发者却不相同。如果需要决定哪种类型的应用程序最好使用哪一门语言来实现,那么可以参考Serdar Yegulalp的这篇文章《 Rust即将发布1.0版本,Go持续获得关注:如何在新生语言之间做出抉择 》,当然也可以继续查看下面的内容,因为本文便是由Serdar Yegulalp的这篇文章翻译整理而来。
鉴于大部分语言本身的复杂性,通常情况下我们难以准确地定义某一给定编程语言的最佳应用场景,但是我们却可以缩小它的使用范围。Go的语法类似于C,熟悉C的程序员能够非常快地上手,然而它并不适合系统编程。Go的 特性 集(goroutines、channels以及大量的并发模式)更适合于开发分布式应用程序,例如Etcd——CoreOS用来在节点间同步设置的分布式键值系统。
Rust能够处理的问题与C语言相似,它关注于“类型安全、内存安全、并发和性能”,Rust为了可靠的系统级编程而设计,针对于分布式的客户端/服务器应用程序。总之,Go能处理的很多编程任务Rust也能处理,但是Rust可以处理的问题Go不一定能处理得了。
Go来源于C,但是与C相比其语言特性的数量依然比较少,类型继承、泛型、方法/操作符重载等功能都被特意地剔除了,但是有一些特性在其他地方得到了间接的实现——例如,使用接口替代继承。Go内置了垃圾收集和内存管理功能,这主要是基于语言易用性方面的考虑。
相比之下,Rust在构建的时候将安全性放在首位。程序员不需要指定变量的类型,编译器会根据具体的使用情况进行推断,因此不安全的代码很难运行。当然,Rust也提供了方法可以将代码标记为不安全的,例如内联汇编代码。
Go已经在一些产品中得到了应用,在这一点上它要远远优于Rust,特别是有一些知名的、较大型的软件项目也在使用Go语言。其中不得不提的一个项目就是时下火热的Docker,另外还有CoreOS的Etcd项目,Deis PaaS以及InfluxDB等。Go语言拥有一个健壮的标准库和大量的社区贡献包。
与Go相比,Rust作为一门新生语言在产品环境中的使用量就少了很多,大部分人可能仅仅是因为想尝尝鲜才用了一点。另外,Rust在开发期间的变化幅度很大,这也导致了基于它构建的产品代码少之又少。当然,现在Rust这门语言已经相对稳定了,以后使用Rust开发的项目应该会慢慢多起来。
Go的最后一个主版本发布于2014年12月,下一个主版本(1.5版本)预计会在6个月以后发布,该版本将会使用Go语言编写其自身的所有工具链,同时会对垃圾收集器做重要的修整。
Rust将于2015年2月16日左右发布1.0 beta1版,正式版将于Beta版发布之后的六个周到三个月左右发布。之后,我们可能会看到 Servo (一个能够利用现代硬件固有的并行性、使用Rust语言编写的HTML渲染引擎)这个项目取得显著进展。
感谢郭蕾对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。