在我当前所在项目里,其中的某一个子系统是用 Groovy 中的 Gradle 插件。Groovy 作为一个运行在 JVM 上的脚本语言,天生具有胶水的特性。加之,它支持 DSL 与其程式的简洁语法。嗯,如果不考虑性能问题,这真的是不一个不错的语言。
可真的是如此吗?
开始之前,我再次 FBI warning 一下:
关于编程语言的讨论,并非能真实,都存在或多或少的个人偏爱因素。因此,文中的某些观点或许会有些偏颇。若是不正确又或者是出入较大,也希望大家能指正。
这里的场景主要是基于团队协作的场景之下讨论的,而非个人项目,又或者是小项目。也就是说,只有团队协作时,才会出现的问题,才会出现各种讨论。
说起这一点我也是有个人偏好,如业余开发选各种语言,而真正做项目的时候,选的语言便是 Java;业余开发用 React、Stencil.js,在公司做项目的时候,还是 Angular 大法好。
引子 1 :编程语言的读与写
我们都知道,编程语言是写给人看的代码,写机器运行的机器码。所以呢,对于编程语言而言,我们会有一个简单的判别标准,即它的读与写。从使用体验上呢,我们可以分为:易读易写,易读难写,易写难读,难写难读,这么四类的语言。
为了贴合文章的主题,我大概对我在项目上用过的 JVM 语言做了一个分类。(PS:真实情况下,差异没有这么大。)与此同时,由于每个语言的使用场景不一样,我们并不考虑诸如于性能等问题。
难度 | 易写 | 难写 |
---|---|---|
易读 | Java | Groovy |
难读 | Kotlin | Scala |
简单说明一下 (笑,我们并不讨论他们的优点。例子中的 Kotlin 不太适合,只是我暂时没有在项目上用过其它 JVM 语言,也许 JRuby 就不好读了):
Java 语言嘛,大家都懂,又好读又好写,所以 Java 程序员便宜。
Groovy (Gradle 所采用的 DSL 语言)难写的地方在于,文档少、语法糖导致IDE 支持差(相对而言)。事实上,它也不是那么好懂,在 IDE 支持的情况下,要用碳基脑做个类型推断。
Kotlin,如果已经熟悉 Java 或者其它语言的话,写 Kotlin 并不是一件难事。这件事情难就难在阅读别人的 Kotlin 代码,可能会有点费劲,除非你有良好的 IDE 支持——它的亲爸爸可能是 Jetbrains。离开了 IDEA,找个扩展(extension)都得找半天。所以难度总体上还是不难的,只是相对难读一点——因为语法糖。
Scala,早期的某个项目,我几个月后看不懂几个月前写的代码。
而如上所说,对于语言每个人是有偏好的。所以,这里依旧是我的一些个人观点。我也并非这方面的专家,只是从个人阅读开源代码和编写相关代码的感受来说的。
引子 2:适用领域与流行应用
谈及编程语言,我们要讨论的是另外的另一特质:适用领域。如我们熟悉的:
Golang 背靠云原生和 Google
Python 是科学家们的偏好,毕竟不是以代码为生。
JavaScript 是交互方式发生了变化
Ruby 是 Rails 框架,所以流行开了。
Java 用于企业编程,因为程序员便宜
而诸如 Rust 这样的小类语言,还没有正式有一个能发扬光大的场景。
引子 3 :编程的快乐,先写得爽
有一些语言能让你拾起编程的快乐,比如 Ruby,但是也能让你不想去维护代码——让人又爱又恨的 Method Missing,可以让你搞起元编程。也能分分钟让你看不懂别人写的代码。如果没有文档的话,那么我觉得你不会再看了。
又比如说,操作符重载也是一个让人写的代码更加直观。嗯,再重载一下赋值操作符,是不是非常爽。
对于快乐来说,维护性那是以后要考虑的问题。
编程语言的被淘汰
在项目上经历了惨痛的 Groovy 开发大型项目的经验后,我和我的同事们一致觉得这是一门可能被淘汰的语言。主要原因有这么几个:
可维护性丢失
缺失更好的 IDE 支持(相比于 Java 之类的)。说白了就是开发人员写起来不爽。
在最广泛的场景之下,可迁移语言出现(如 Kotlin Script)
如果你还想把编程语言的一些缺点考虑一下,那也是可以的。
可维护性丢失
这也并非是语言本身的问题,而是语言应对大型项目时,将会遇到的一个挑战。对于大型项目而言,自由灵活的语法糖会带来大量的问题。而随着项目的进一步扩大,保持同一套代码风格容易,而要使用同一套语法越来越困难。如同样是声明类型,有的用具体的类型,有的则是用 def
或者是 var
。
缺失更好的 IDE 支持
嗯,如果你习惯了用 IDEA 对 Java 代码进行快速的重构之后。而与此同时,你并不能使用相似的方式来对你的 Groovy 代码进行重构。你们就会慢慢陷入了一个循环,既然有一个更好的语言,为什么我们不去使用它们呢。
退而求其次的,为了使用 IDEA 的高级功能,如重构。我们开始将代码中的 def
转换为具体的类型。
可迁移的语言出现
而其实上面两个问题,并不是这个语言的主要问题。毕竟,对于小的项目来说,IDE 和可维护性支持都不是问题。
过去,我们根据 Gradle 官方文档,使用 Groovy 来编写 Gradle 插件。而有一天,Gradle 官方文档同时提供了 Kotlin Script 的支持。
这就相当于是,上帝真的抛了个橄榄枝给你。你可以同时拥有更好的 IDE 支持,更好的可维护性。同时,还可以快速地迁移过去。为什么不呢?
其它
与之相似的一个例子便是 JavaScript 和 TypeScript,但是浏览器运行的是 JavaScript。所以,JavaScript 并不能这么容易被取代。
结论
有没有可能出现一个兼容所有语言的语言?