所谓Scala的目的是什么?事实上Scala作者Martin Odesky他在《Programming in Scala》中写到,Scala的目的是为了更好的融合OO与FP,确实,不是取代Java。而且打造一个更伟大的JVM语言。和干掉Java半点关系都没有。作者只是想搞一个可以伸缩的JVM语言。不过Scala确实在很多方面引领了JVM语言的潮流。同时强大的类型系统让Scala的表达能力和抽象能力比Java,Kotlin都强。这让Scala非常实现写类库和框架。如Spark和Akka。然而Scala为了伸缩性和表达能力牺牲了易用性,所以写应用Scala就太重了。比如把Scala用户分为应用程序开发人员和类库设计人员,然后在归纳出他们要掌握的东西。你就发现哪来写应用的话Scala的很多特性都用不上。这就是为什么有Kotlin。

Kotlin是想干掉Java。众所周知Scala用户里有Better Java派和Pure-FP派。Kotlin在很多地方就是学习了Scala的语法,比如说data class和类构造器的设计,在Scala中都可以找到类似的东西。同时有加了不少语法糖,比如getter和setter,委托的语法糖,解决了Java没有这方面语法的缺点。虽然说抽象能力和类型系统比Scala差很多。但是吸引了Better Java派的目光。毕竟Kotlin的目的就是在JVM上建立一个有C#的易用性,Scala的语法精简,Java的生态的语言,要是你觉得Java语法太垃圾干嘛不用呢?总体再说,Kotlin的目的就打造Better Java,打造新一代的JVM语言(这个新一代和Scala不一样,Scala是强调类型系统的改良和伸缩性。Kotlin是语法糖)。如上文所提到,Scala的高级特性比如类型投影,存在类型,高阶类型这些拿来开发应用基本没什么用。所以有了Kotlin,Kotlin的类型系统就是Java类型系统的延续。但是哪来开发类库Kotlin的抽象能力就不够用了。看看Arrow.kt就知道Kotlin实现各种代数上的抽象结构有多难。

而Pure-FP派的Scala用户因为是Scala类型系统的重度用户,没有高级的类型就写不出来了,所以就继续用Scala。

Groovy的目的就是为了开发一个JVM上的脚本语言。灵活性比Scala还强。Groov亮点就是写DSL很方便,比如Gradle的build script。Groovy的优缺点和其他脚本语言比如Ruby差不多。我觉得Groovy就是一个JVM上的Ruby++。和Ruby一样灵活,一样可以写DSL。但是Groovy能搞的Scala大部分都做的出来,搞DSL的话Scala也行,只是不那么方便。

Clojure就是JVM上的Lisp。解决的Java语法和Lisp差别太大的缺点。当然,Clojure还是很强的,有Marcos,而且比Scala的Marcos强,可以玩meta programming。所以拿Clojure造DSL比Groovy还方便。

总体来说,Scala解决的Java的类型系统不够强大,抽象能力不足的缺点。Kotlin解决Java语法糖不够多的缺点,Groovy解决了Java太死板的缺点,Clojure要解决和和Groovy差不多,只是靠Lisp化做得更彻底一点。

所以要是你要选语言,可以看这个

  • 写脚本 => Groovy
  • 元编程,玩 => Clojure
  • Android,干各种Java适合干的事情(如后端) => Kotlin
  • 开发类库,玩函数式编程,数据分析,一些微服务(如Akka)=> Scala

groovy, Scala和kotlin区别的更多相关文章

  1. [转载][Groovy] Groovy与Java的区别(一)

    原文地址:[Groovy] Groovy与Java的区别(一)作者:langyizhao 因为Groovy可以用Java的所有功能(虽然JVM不同的时候可能会比较麻烦,比如在Android上),所以G ...

  2. Android Gradle脚本从Groovy迁移到Kotlin DSL

    Android Gradle从Groovy迁移到Kotlin Android项目用Gradle构建, 其脚本语言之前是Groovy, 目前也提供了Kotlin的支持, 所以可以迁移到Kotlin. 官 ...

  3. Java & Groovy & Scala & Kotlin - 20.Switch 与模式匹配

    Overview 本章主要介绍高级条件语句中的 switch 语句以及其增强版的模式匹配. Java 篇 Switch 特点 Java 中 switch 语句功能类似 if,但是 switch 主要用 ...

  4. gradle 混合编程java、scala、kotlin、groovy

    众所周知,java是基于JVM的开发语言,但能够在JVM上运行的开发语言不仅仅有java,目前还有很热门的kotlin(kotlin不仅仅只能开发Android).scala.groovy等等.目前国 ...

  5. 转载:scala中:: , +:, :+, :::, ++的区别

    原文链接:https://segmentfault.com/a/1190000005083578 初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. ...

  6. scala中:: , +:, :+, :::, +++的区别

    4种操作符的区别和联系 一. ::   该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表. 用法为 x::list,其中x为加入到 头部的元素,无论x是列表与否,它都只将成为新生成列 ...

  7. [转] scala中:: , +:, :+, :::, +++的区别

    [From] https://segmentfault.com/a/1190000005083578 初学scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别 ...

  8. 在scala中:: , +:, :+, :::, +++的区别总结

    初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. 4种操作符的区别和联系 :: 该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表. ...

  9. python 本地变量和全局变量 locals() globals() global nonlocal 闭包 以及和 scala 闭包的区别

    最近看 scala ,看到了它的作用域,特此回顾一下python的变量作用域问题. A = 10 B = 100 print A #10 print globals() #{'A': 10, 'B': ...

  10. Java 之外,是 Scala 还是 Groovy?【转载】

    原文地址 Scala 和 Groovy 都是基于 JVM 的语言,相比 Java,它们都有语法更加简明和表达能力更丰富.对于那些既想不脱离开 JVM 又想避免 Java 繁琐语句的开发人员来说,Sca ...

随机推荐

  1. 2003031120—廖威—Python数据分析第七周作业—MySQL的安装以及使用

    项目    内容 课程班级博客链接 https://edu.cnblogs.com/campus/pexy/20sj 这个作业要求链接  https://edu.cnblogs.com/campus/ ...

  2. AT212 P-CASカードと高橋君

    题目描述 高桥君为了准备即将到来的7月27日土用丑日,打算邮购一些高级鳗鱼食材,通过网上银行来支付. 高桥君使用的银行卡背面有下图所示的9×9密码表.支付的时候从表中某一位置开始根据指定的方向连续读4 ...

  3. mysql 设置相关

    告诉mysql客户端这边的文字编码 告诉mysql希望返回的结果集编码: set character_set_client=gbk; set character_set_results=gbk;   ...

  4. Oracle联机备份与恢复

    联机备份又称为热备份,在数据库运行的情况下对数据库进行物理备份.进行联机备份,数据库必须运行在归档日志(ARCHIVELOG)模式下. 联机完全备份步骤: 1.设置归档日志模式,创建恢复目录用的表空间 ...

  5. C# 事件 初学

    1.事件是可以动态添加和删除操作的,如下>>> 添加: ctr.Click+=ctr_Click; 删除:ctr.Click-=ctr_Click; 2.同一控件相同事件可累加不同事 ...

  6. Spring整合Redis学习笔记

    1 Spring-Data-Redis 1.1 Spring-Data-Redis简介   Spring-Data-Redis(简称SDR)对Redis的Key-Value数据存储操作提供了更高层次的 ...

  7. 过滤器函数 filtes 的使用总结

    // import parseTime, formatTime and set to filter /** * Show plural label if time is plural number * ...

  8. Docker部署【项目管理和问题跟踪工具-Redmine】

    创建网络 docker network create redmine-network 启动Mysql数据库 docker run -d --name mysql --network redmine-n ...

  9. NXOpen遍历工作部件表达式

    //用户代码#include <uf_defs.h>#include <NXOpen/NXException.hxx>#include <NXOpen/Session.h ...

  10. uniapp使用阿里oss上传

    可以删除重新上传,点击图片大图等功能. <view class="uploadView"> <view class="imageView" v ...