[译]Go和Rust:两个新型编程语言的未来道路

原文地址,如有侵权请联系我,我会立刻删除。

没有什么事情比讨论一门新语言更能令程序员感到兴奋或固执的了。现在,程序员们可以欣赏两颗冉冉升起的明日之星:GoRust,两者有着相似的灵感,但是发展动机和目标却有着本质差别。
这两门语言都有着一流的出身,都是在现代IT界的巨头赞助下创造出来的。Go是由Google的Rob Pike和Ken Thompson创造;Rust则是Mozilla的Graydon Hoare的劳动成果。两者都是从一个实验性项目起步,然而都快速地生长成为了成熟的开发工具。

从这里开始,两门语言走上了截然不同的发展道路。它们不是为了同一批开发者或同一类开发需求产生的,唯一的相同点就是它们都对传统的C和C++产生了影响。当我们决定哪种语言是最适合某种类型的应用时,有这样几点需要考虑。

这门语言的出现是为了什么

永远都很难说一门语言最适合做什么,大部分语言的未来都难以估计,但是缩小它的预计使用领域是可以做到的。Go的设计参考了许多C的传统,同时希望能够让熟悉C的程序员快速上手。但是,它没有想成为一门系统编程语言。另外,它的特性(goroutine,channel,还有许多并发模式)更适合于分布式应用,比如Etcd,一个分布式键值系统,在CoreOS中用于同步节点间的设置。
另一方面,从能够处理的程序类型的角度看,Rust更接近于C。通过致力于实现“类型安全,内存安全,并发,高性能”,Rust意图为诸如分布式客户端/服务器应用进行可靠的系统级别编程。简而言之,Rust可以应付许多Go可以做到的事,但是反过来是不行的。

便捷还是安全?这取决于你的选择

因为C的影响在Go中根深蒂固,Go的特性保持始终相对少的数量。类型继承、反省、方法/运算符重载都被有意抛弃,虽然其中有些特性可以被间接地实现——比如,使用接口代替继承。垃圾收集和内存管理都是内建的,主要是为了提高编程便捷性。

Rust与之相反,安全被放在了第一位,这点通过语言设计和编译器行为的互操作来实现。变量类型不必特地指定,但是编译器会对于它们的使用提供详细的反馈,所以很难执行可能不安全的代码。尽管如此,这门语言也提供了标记着不安全的操作,比如内联汇编代码。

包方面的领先者

Go目前处于领先地位,因为它已经在许多地方被用于生产环境中——而且不是什么不出名的小项目,而是许多大名鼎鼎的项目。当然首先能想到的就是Docker,但是还有许多其他项目:CoreOS中的Etcd项目,Dies Paas,InfluxDB,等等。这门语言同样有一个健壮的标准库和大量社区建立的包。
Rust作为这方面的新人,只有很少的代码用于生产环境,主要是因为它太新了。另外,Rust在发展迭代过程中变化太多,所以很少有生产代码是用它写的。既然现在这门语言已经稳定下来,未来我们很有可能看到更多真正的Rust项目发展起来。

未来的发展

未来两门语言会何去何从呢?Go的最新一个主要版本是在2014年12月发行的,下一个主要版本计划在六个月后发行。1.5版本预定会发生的改变包括将整个Go工具链用Go语言实现,以及垃圾回收方面的重大修改。
关于Rust,1.0版本计划在2月16日之后的某一天发行(5月15日Rust1.0已经发行——译者注),这也是1.0的测试版本锁期望的时间。随着Rust1.0的测试与发行,我们可能会在一个不出名的项目中看到一些戏剧性的进步:Servo,一个使用Rust编写的、能够充分利用现代硬件的内在并行性的HTML渲染引擎。