新JVM语言比较:Ceylon vs Kotlin vs Fantom

现存的计算机编程语言有好几千种,JVM上的语言也有十几种,所以大可不必为没听说过的编程语言感到惊奇。

Java的缺陷

由于工作的原因,对Java比较了解。从Java中我们总结的教训:

  1. 对象可以赋值null造成NPE
  2. 受检异常(checked exception)
  3. 属性getter,setter太烦
  4. 接口不能有实现(java8 fixed)
  5. 缺乏Lambda(java8 fixed)
  6. 方法Overloading对可读性和动态调用造成伤害。
  7. 语言层缺乏模块化支持
  8. 并发支持很糟糕
  9. 原始类型不是对象

05后JVM语言比较

我主要谈比较新的几个JVM上的语言:Ceylon, Kotlin, Fantom. 它们的特性比较如下表:

Features Ceylon Kotlin
Fantom Swift
不可空类型(Non-nullable)
Yes Yes Yes Yes
接口实现(Mixin)
Yes
Yes
Yes
No
扩展方法(Extension)
No
Yes
No Yes
声明式编程(Declarative)
Yes
Yes
Yes
No
动态调用(Dynamic)
Yes
Yes
Yes
No
函数式(Lambda)
Yes
Yes
Yes
Yes
不可变性(immutability)
Weak
Weak
Strong Weak
标准库完备性(API)
Yes
No Yes
Yes
模块化支持(Modularity)
Yes
No Yes
No
操作符重载(Operator)
Yes
Yes
Yes
Yes
默认参数(DefaultParam)
Yes
Yes
Yes
Yes
范型(Generics)
Yes
Yes
No Yes
属性Getter/Setter
Yes
Yes
Yes
Yes
跨平台性
JVM,JS JVM,JS JVM,JS,CLR iOS


上面的Swift只是拿来对照。还有很多新特性没有列出来,例如:“类型推断”等

新语言趋势

1.新出现的编程语言特性趋向于统一化,相互学习和借鉴。其中“不可空类型”,”Lambda闭包”,”属性(getter/setter)”,“编译为JavaScript”,成了新语言的标准配置。

2.新出现的全部都是静态类型,看不到动态类型的身影。动态语言在可重构性和运行性能上不好。

3.面向对象仍然是工业界的主流,经的起时间检验。

不可空类型的历史

只要是Java程序员,肯定被NullPointerException害苦过。自从有了不可空类型,从此远离NPE。

据说函数式语言中很早就有这个概念,叫做可选类型。我最早在C#中见到的问号语法,但是C#只是把他用在原始类型中。Fantom把他拓展到所有类型,而后几乎成了新语言的标配。Swift把他叫做可选类型,说明这个灵感不是来自C#,而是从函数式语言来的。

点评

除了上述以外,JVM编程语言还有:Gosu,Xtend,X10,Clojure,以及老一辈的Scala,Groovy。
  • Xtend和X10编译为Java源码,而不是Java字节码,我比较担心这怎么单步调试。
  • Ceylon改了很多Java的关键字,例如public改为shared,个人对这种行为不喜欢。另外Ceylon的特色之代数类型,表中没有列出,因为我觉得这玩意除了鼓励用if代替多态以外,用处不大。
  • Kotlin语法我比较喜欢,几乎和Swift一样。可竟然没有自己的标准库,而是在Java基础上扩展。我很担心将来怎么扩展到其他平台。
  • Fantom的强不可变类型是特色。缺乏范型是软肋,据说这是和GO语言一样的哲学。
  • Swift不支持垃圾收集有点麻,引用计数引起的内存泄漏也很难查。

前景

虽然这些JVM语言有比较好的特性,但是特性不能决定前景。最有前景的还是Swift这种有大公司做后盾,有框架,有开发场景的语言。我研究这些只是为了好玩而已。

最后,语言只是工具,而创造和使用工具是人和动物的本质区别。

你可能感兴趣的:(ceylon,Kotlin,Fantom)