【在主画面加入捷径】
       
【选择语系】
繁中 简中

技术杂谈:值得注意的程序语言:D、Go、Rust

【赞助商连结】

    在早期,电脑硬件效能不足,脚本语言仅用来做简单的工作,而大部分的应用程序还是用 C/C++ 这类编译语言开发。后来,硬件效能逐渐进步,虽然脚本语言先天不快,相对来说,速度也足够了。而脚本语言易于使用、开发速度快,而越来越受到欢迎。不过,在某些需要效能的时候,脚本语言就显出其不足,这时候,用 C/C++ (或 Java) 改写效能瓶颈的部分,再包装成套件或模块,就是一种典型的开发模式。随着运算速度及环境部署的需求,这类开发模式逐渐令人无法满意,而直接回归 C/C++ 又过于低阶。着眼这一方面的需要,出现了 D、Go、Rust 等新兴的编译语言。

    这类语言的共通点,在于提供了一套跨平台的语言环境,除了部分和 C/C++ 连接的部分可能会些微地受到平台的影响外,以这些语言为基础的项目,基本上都已经是跨平台程序了。虽然,跨平台程序并不是什么新闻,像是 Java 平台早就已经跨平台多年,而许多近代的脚本语言,像是 Python 和 Node.js (JavaScript) 等,也都是跨平台语言。但是,除了 C/C++ 以外,大部分的跨平台语言都是建置在一层执行环境上,而 D、Go、Rust 这类程序的卖点之一,在于程序代码会转换为原生的机械码,不需透过一层额外的执行环境,而有更佳的速度 (在有够好的算法的前提之下)。由一些 benchmark 可看出,和传统的 C/C++/Java 相比,Rust 所产生的等效的机械码大抵上有着接近 C++ 的速度,而 Go 语言的速度则和 Java 相仿。

    除了程序执行速度外,开发的时程也是要考虑的。使用 D、Go、Rust 等语言,通常会有类高阶语言的特性,像是字串处理、类型判断等,使得开发时间相对缩短。不过,由于各个语言的设计方向不同,并不能一概而论地说使用这些语言就会比较简单。像是 Go 语言使用较少的关键字,以及相对简单的程序结构,使用者在一段时间的学习后,很快就能上手。而 Rust 将程序设计常犯的错误,提前在编译期就引发相关的讯息,在语言的设计上也和传统的 C-like 语言有所不同,反而较难上手。除了在语言本身的设计以外,这类新兴的编译语言,通常都会附带相关的开发工具,像是套件管理等,使得项目的开发更容易。

    除了语言本身和编译环境外,标准函式库和第三方函式库的支援度,反而更显得重要。毕竟,我们不会想要在开发项目时,还得从头撰写每个部分。不过,比起传统的 C/C++/Java,这类新兴语言的支援度通常相对较弱。在开始一个新的项目前,还是要自行寻找及评估相关的元件,是否有足够的支援,或者需另行开发。随着项目的需求不同,所需的元件也有所不同,无法一概而论,还请读者自行尝试搜寻及比较。

    那么,D、Go、Rust 何者较值得投注时间呢?Quora 上这篇 (及其中译) 中有提到这三者的优缺点,可供参考。而笔者在实际学习这三者,并将其应用在实现 Exercises for Programmers 部分的习题后,在这里提示个人的观点:

    在使用 D 语言的过程中,可以感受到 D 语言并不是很盛行,有时会难以找到相关问题的答案,一些讨论区,包括 Stackoverflow 等,上面的讨论串也相当老旧。如果观察 DUB (D 语言的套件库),可以发现 D 语言的套件其实不是很丰富。如果只是要用 D 语言实现某些算法,应该还是可以使用 D 语言本身的特性和标准函式库的支援来完成,但是社群的活跃度及第三方支援,是一个主要的隐忧。

    在某些方面,Go 语言表现得相当亮眼,像是在伺服端软件等,这也反映出 Google 本身实际的需求。但是,在其他的方面,Go 不一定表现得比较好。例如,到目前为止,Go 语言还是没有官方的 GUI函数库,而仅靠社群各自努力。Go 语言的设计,是用一套简单的语法来完成各种任务,很快就可以上手,但是,写起来却不会比较简洁,甚至觉得有点累赘,像是 Go 语言的排序的语法就显得有点琐碎。这样设计是否比较好,就看各自的解读。最近 (2016 年 12 月) Go 语言在 TIOBE 上的排名大幅上升,值得注意。

    Rust 在这三种语言中,是最难上手的,不仅是在于语法上,还有其编译器的行为,刚开始学习 Rust 时,时常得和编译器的错误讯息奋战一番,才能顺利通过编译。而且,由于 Rust 有经过一些变革,使得网络上的一些解法反而变成错讯的资讯,使得 Rust 的学习相对困难。目前 Rust 的能见度相对低,学习资源也相对缺乏,若想要在项目中使用 Rust,相关的评估仍不可少。不过,Rust 产生的机械码,其执行速度,已经相当接近等效的 C++ 的机械码的水准,真是典型的 “No pain, no gain”。

    在三者之中,目前 Go 是最热门的:

    综合上述意见,给予以下短评:

    • D 语言:相关资源相对薄弱,宜审慎考虑
    • Go 语言:若项目属性适合,可考虑使用
    • Rust:可观察其后续发展,目前仍需评估

    [Update on 2017/02/24] 其实 Go 或 Rust 对于一些命令行小工具来说,是相当适合的语言。比起 C/C++,这类语言的编译通常更简单,若没有使用到 C/C++ 的第三方函式库,同一份程序代码即可直接在不同平台上编译。对于字串处理或其他细节,Go 或 Rust 会比 C/C++ 来得简单得多。编译出来的可执行文件可直接拿到其他机器上执行,会比使用脚本语言 (script language) 来得方便。

    Disclaimer: 本篇内容仅代表笔者个人意见,仍需读者自行评估适合的方案。

    【赞助商连结】