Scala和Go的区别

Keith Morrow作为Scala的支持者,发表了这篇倾向于Scala的文章,主要也是为了反驳一年前 Paul Dix 的文章:why he prefers Go over Node and Scala,Paul Dix认为Go好于Scala的原因在于下面几个方面:并发性, 易理解性, 代码分享和学习难度。之所以时隔一年才有人反驳,一则因为双方不了解,二则可能是随着Go编写的Docker流行,拳头产品的出现让大家对Go刮目相看。

Keith Morrow则认为Go比Scala易于学习是因为Go是一种命令式语言。这相对不习惯函数语言的人来说易于掌握一些。

因为大多数人对于命令式语言比较熟悉,因此毫无疑问在代码共享方面Go要易于Scala。那么,在学校曲线上,命令式语言的人学习函数编程要难一些,Go是一个小而易于学习的语言,当然还因为它更接近C和Python。

当然硬币也有另外一个方面,Go正是因为是命令式语言,它就不可能充分发挥函数编程的特点,因为缺乏泛型,而Go语言认为其简单正是因为没有类 模块 泛型这些概念。

Keith Morrow举例说:如果你要实现一个简单的map函数,使用命令式方式实现(使用循环而不是递归方式),你必须强迫忘记类型安全(比如使用一个空接口),或对于每个类型重新再实现一次map函数,Go不支持函数overloading,除了这些,Go也不支持只读的不可变的值,除了常量。

在并发性方面,Go和Scala都有内建的并发机制(Akka for scala),Scala是倾向于Actor模型,而Go使用CSP模型,Akka相对于Go内部并发机制好处是透明性,能够透明地将Actor从不同机器之间迁移实现远程发送消息,而且能够控制可靠性,而Go 的goroutines 和Channel被强迫成一个单进程,需要额外努力才能扩展,无法如此透明的进行扩展。(有人反对认为Gocircuit for Go比Akka更加灵活)

总之,Keith Morrow认为,如果不理解函数编程和类型安全编程语言的好处,没有基础的函数结构如不可变性等,那就很难编写一个无bug的安全的应用。

[该贴被banq于2014-08-08 12:11修改过]
[该贴被banq于2014-08-08 12:12修改过]

没去极端过的人,永远不知道极端是什么。

BUG是过程的后遗症,函数与逻辑是少犯错的支柱,过程中少BUG的部分往往也是递归等与函数或逻辑同理的地方。人类思维本来就是逻辑的,绝对不是过程。过程是人类在逻辑上构造一种特例,或者说过程的生存依靠是逻辑。过程是什么?你光想解释就需要一系列规则,这不是逻辑?没有逻辑约束,过程不剩下BUG还能剩下什么?过程各种语法都是维护逻辑而已,之所以出现BUG,是因为维护得还不够好,当足够好的时候其实已经变回函数或逻辑了。

为了现实掌握过程,为了追求掌握逻辑。

PS:在我看来过程实际上是比函数或逻辑更高级的,可以认为是函数或逻辑的领域标准化,只是现在没有一样过程是那样的理论。