现存的计算机编程语言有好几千种,JVM上的语言也有十几种,所以大可不必为没听说过的编程语言感到惊奇。
Java的缺陷
由于工作的原因,对Java比较了解。从Java中我们总结的教训:
- 对象可以赋值null造成NPE
- 受检异常(checked exception)
- 属性getter,setter太烦
- 接口不能有实现(java8 fixed)
- 缺乏Lambda(java8 fixed)
- 方法Overloading对可读性和动态调用造成伤害。
- 语言层缺乏模块化支持
- 并发支持很糟糕
- 原始类型不是对象
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这种有大公司做后盾,有框架,有开发场景的语言。我研究这些只是为了好玩而已。
最后,语言只是工具,而创造和使用工具是人和动物的本质区别。