Groovy,Clojure和Kotlin都是基于jvm的语言,那他们在实际项目中的运用场景有什么区别?

我只了解到Grails开发web应用挺快速的,其他两门只是知道名字。 如果一个项目要用jvm这些语言,具体是不是看语言的特性和开发人员的需求? 如果可以,能不能说说这三门语言各自的优劣势和学习曲线.
关注者
319
被浏览
28,616

8 个回答

简单说,在JVM上不想用Java,喜欢某种别的平台上已有的语言但想要更Java化的版本的话:
  • 喜欢Ruby => 用Groovy
  • 喜欢LISP,喜欢STM功能 => 用Clojure
  • 喜欢C++ => 用Kotlin
Scala的话看评论↓

Groovy比较讨好来自Java的程序员的一点是:用它写代码可以渐进的从接近Java的风格进化为接近Ruby的风格。使用接近Java风格写Groovy时,代码几乎跟Java一样,容易上手;而学习过程中可以逐渐用上各种类似Ruby的方便功能。

groovy是脚本语言,本质上是java这种编译型语言的subset,类似的有rubyjavascript等,脚本语言的几个特点:动态类型,解释执行,还有就是阉割了线程等的特性,脚本普遍在多线程,并发这些领域的特性会薄弱一点,所以需要一个线程安全的环境,会更加有利于脚本语言的发挥

java就不说了,都认识,java是早期比较纯粹oop语言的代表,现在开始慢慢增加一些fp的特性,但是本质上还是比较纯粹的oop语言,虽然有些尾巴,比如原始数据类型并不是object,但是要求全部代码都放在class里面的目前只有java了,fp特性,嗯,比起oop特性来说,几乎可以忽略,ceylon可能可以勉强跟java放一起

kotlinscala是better java,特性体现在,oop上走得比java更远,都干掉了原始数据类型,这两个语言里是真的万事万物皆对象,同时加多fp特性,scala加得更多一点,可以认为是java的超集

etaclojure则是jvm上pure fp的代表,一个是haskell一个是lisp,比起java来说,oop的特性这两个基本是没有,封装层面都在function函数层面,oop和fp的差异点主要是看你封装在对象上还是封装在函数里,eta和clojure则是封装在函数里,fp语言的特点就是强调immutable吧,其实java里面的spring就比较接近fp的并发模型,latte也归于此类,支持国产

总结一下,大概这四类:

脚本:groovy,ruby,javascript

oop:java,ceylon

fp:eta,clojure

oop+fp:kotlin,scala,latte

脚本适合做什么呢?适合crud,纯粹的if else for loop,适合做一些不需要太过于深入思考和设计的开发,适合外行使用,对于不懂线程啊,锁啊,immutable啊这些东西的外行来说,没有什么比脚本更合适的了,同时也适合程序员用来简化某一个特定领域的工作,理论上在某一个小范围内可读性更强,但是如果放任瞎写,一旦代码量达到一定规模之后,脚本会造成可读性坠崖式下跌的灾难

oop适合做什么呢?适合物理建模,针对物理世界的映射,比如游戏,这是非常常见的软件类型,oop特点就是行为简单,物体相对复杂

fp适合做什么呢?适合数学建模,针对数学模型的映射,比如数据处理,各种复杂公式,fp的特点就是行为复杂,物体相对简单

pure oop/fp的语言都属于前期投入大,但是结构合理,后期维护相对简单的paradigms

oop+fp适合做什么呢?适合前两个领域的并集,理论上,但是,有可能会带来极为严重的反作用,因为封装在object还是func里面不同的人会有不同的认识,这两者同时出现在一个项目中时候,如果没有切割清楚,放任瞎搞的话,两边会吵起来,造成1+1<1的后果,最经常遇到的就是oop的人看fp的代码不顺眼,fp的人看oop的代码不顺眼,然后不停滴重构对方的代码,导致项目崩溃,所以在使用oop+fp的语言的时候,一定一定要协调清楚,vert.x的tim fox甚至因为前期搞不定scala而在短时间内没有支持该语言,直到后期社区开始有人主动出来贡献,方有所不同

其实这个你看vert.x的发展历程就很清楚了

一开始,支持脚本,groovy,ruby和js是第一批支持的语言

然后oop,java和ceylon,这个很快得到了支持

然后kotlin和scala,这个得益于社区的支持,latte也算是社区的贡献吧

其实所谓社区,很大一部分来自开发者自身

kotlin和latte都是开发者自己主动贡献vert.x相关语言代码

包括kotlin的coroutine就有很大一部分来自中国社区的贡献

至于pure fp嘛……clojure和eta至今还找不到足够的社区支持

有兴趣的可以去贡献一下,号召有能力的pure fp的用户去贡献vert.x社区

关于多语言开发和支持,可以关注我的专栏:白木城全栈

可以看到,在kotlin和latte这一点上,中国的开发者们已经迈出了脚步,踩下足迹