Scala和Go的区别
working_brain
·
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的安全的应用。
Go为什么不是函数语言?闭包/一类函数/高阶函数/递归/惰性计算,Go哪样不具备呢? 为什么本文作者会给 GO贴上不是函数语言的标签呢?
#2
更多评论
为什么 GO 不支持 OO,无人抱怨; 而 GO 缺乏泛型,则有很多人 叫苦连天?
#1
其实现在很多语言没有明显的界定,吸收好的特性就好了。
#3