Kotlin vs Scala:他们解决了哪些问题? https://superkotlin.com/kotlin-vs-scala/
2017年6月28日/在意见/ Gabriele Tomassetti
Scala和Kotlin是Java王座的两个竞争者。至少它们是在基于JVM的应用程序中考虑使用的两种主要语言。
他们的目标是解决同样的问题:提供更好的Java,但他们以一种非常不同的方式做到:
Scala是在领先的软件公司Kotlin的Academia设计的。他们出生的背景解释了他们的大部分差异。 Scala的诞生是为了尝试一些关于函数式编程和混合不同范式的很酷的想法。科特林正在解决实际问题。 Kotlin设计师关心编译时间和强大的工具支持,因为这些对程序员来说很重要,即使他们对其他语言设计师来说听起来并不令人兴奋。
Scala的一个很大的优点是它可以为JVM构建另一种主要的静态语言。它清楚地表明JVM足够灵活,可以让语言设计者从中受益。科特林很晚才到了。当时人们对使用新JVM语言的想法并不感到兴奋,他们开始关注实际方面。
在本文中,我们将比较Kotlin和Scala主要用于它们的用途,而不是它们的技术特性。我们将概述这两种语言的功能,我们主要关注它们的设计目标。
事实上,Java可能是世界上使用最多的编程语言。 Java也可以说是企业界最常用的语言,也是计算机科学课程中使用最广泛的语言。
所以Java很棒,就像C很棒。但就像C一样,Java已经过时了。
虽然Java已经发展得比C更多,幸运的是,它以更有条理的方式发展到C ++,但却落后于许多其他语言。它仍然足以满足日常使用。许多开发人员对Java感到满意。但是很多人将它与C#进行比较,C#是一种具有相似目的的语言。或者几乎任何其他现代语言。
许多开发人员和公司都希望提高效率并且我敢说使用起来并不是一个秘密。 Java本身存在很多技术批评,而且语言中的许多限制因素限制了它易于使用的内容。这是成功的诅咒:很多人使用它,设计师即使发现他们错了什么也不能真正改变基本面。
为什么Scala和Kotlin
Scuola di Atene是拉斐尔的一幅画
多年来,开发人员已经在JVM上构建了新语言。许多这些语言试图混合使用Java进行改进,并提供比Java更多的东西。也就是说,许多人试图提高开发人员的工作效率和体验,同时做与Java相同的事情和/或尝试做出不同的事情,比如动态语言或类似于Lisp。
Scala代表可扩展语言,一种旨在满足用户需求的语言,而Kotlin则是一个岛屿的名称,就像Java一样。
我们选择了Kotlin和Scala,因为它们都是非常流行的,静态类型语言和两种方法的良好代表:Kotlin有目的地作为对Java的改进,而Scala完全是另一种语言。 Kotlin为您提供所需的一切,Scala为您提供您想要的一切。
Scala具有正确的功能,但其最明显的缺点是编译速度非常慢
您已经可以找到决定从Scala搬到Kotlin的人的文章。在某些方面,Kotlin的创作者也做到了这一点。事实上,引用来自对Kotlin主要开发人员的采访,解释了其中一个原因,因为他们决定创建Kotlin。当然,另一个是创建比Java更好的语言,但它仍然与JVM兼容。
当然,这并不一定意味着Kotlin比Scala更好。相反,这意味着Kotlin设计师认为Scala是一门优秀的语言。他们和其他一些开发人员只是认为Scala不是为他们的需求而设计的,Java也不是。所以他们做了Kotlin。
一些特征的比较
正如我们在介绍中所说,我们没有列出所有技术特性,也没有看到语法。我们认为,如果没有上下文,过多的细节可能会让人感到困惑。此外,没有人选择带有清单的语言。然而,重要的是要看到一些重要的功能和语言选择的方法。
面向对象
Java是一种专为面向对象编程而设计的语言,但并非所有东西都是对象。基本类型(如数字)表示为基本类型。在Scala和Kotlin中,一切都是对象,可以这样访问。这不一定是一个慎重的选择,因为使用引用类型而不是原语会有轻微的损失,但这是因为在JVM中您无法定义值类型。因此,要获得智能型系统的优势,您只能使用引用类型实现它。
Scala和Kotlin也支持其他编程范例。虽然Kotlin仍然主要是面向对象的语言,但它包括所有编程范例的基本方面,这些范例在日常编程中是有利的。
功能编程
Kotlin支持基本的功能特性,例如lambda和高阶函数。 但它并不完全支持函数式编程范式。 与往常一样,它适用于对普通程序员有用的实用位,而不需要熟练使用计算机科学博士学位。 例如:
独立(顶级)函数很好,您不需要使实用程序类包含不同的函数
Kotlin定义了表达式而不是语句,因此您可以将变量分配给if等结果
您可以使用val而不是var轻松定义不可变数据。 不需要像final这样的修饰符
Scala同样支持功能和面向对象的编程范例。 它的设计考虑到了这个目标,它具有大部分功能,你可以在Haskell中找到,但不能在Kotlin或Java中找到,例如currying,memoization,部分应用程序,类型类......它有整个包,可以这么说。
小东西
每种语言都可以不同。 Kotlin和Scala都有许多生产力功能,这些功能在新语言中是标准的,但在创建Java时并非如此,诸如类型推断和创建单例或数据类的快速方法之类的东西。
科特林
考虑到语言的重点,Kotlin拥有所有必需品和其他一些功能,尽管它还具有一流的安全支持和智能演员等有趣的东西。智能强制转换意味着如果您检查自动转换为新类型的变量的类型,当然如果它实际上是该类型的变量。一般来说,Kotlin非常使用它的一组功能,而不是添加更多东西。例如,您可以重载运算符,但只有已经在语言中的基本运算符,您无法定义新的运算符。
Kotlin还可以轻松创建内部DSL或流畅的界面。它通过lambdas和一些语法糖的帮助来做到这一点。就像函数的最后一个参数(如果它是一个lambda)一样,也可以放在括号之外。这对于减少复杂字符串插值的需要很有用。例如,此示例使用库来创建HTML。
createHTML()。table {
for(语言中的语言){
tr {
td {+ language.name}
td {+ language.popularity}
}
}
}
Scala
相反,Scala可能只需要功能和面向对象的语言。例如,虽然它有一些小的缺陷,但是无效安全的效率低于Kotlin。
Scala还通过包含宏和创建自定义运算符的机会,在创建复杂的内部DSL方面表现出色。使用Scala,你有很大的自由,并有很多机会自己上吊。例如,许多开发人员对过度使用奥术自定义运算符感到遗憾,这些运算符的目的并非从代码本身清晰。
如果您想象任何构造,您可以在Scala中执行它,这只是一个轻微的夸张。因此,您必须关注开发人员的想象力和他们的能力。
与Java的互操作性
人们一起工作
Kotlin旨在使用Java
Kotlin是一种用于保持与Java兼容的语言。它甚至具有促进与Java的互操作性的功能,例如更容易从Java调用Kotlin惯用代码。因此,您可以继续使用Java开发旧版软件,但使用Kotlin创建新软件。
一个原因是因为Kotlin在Android上如此受欢迎,这是因为它与Java 6兼容,后者主要是当前的Java版本的Android。因此Kotlin带来了Java 8中已有的一些功能,但Android开发人员无法使用。
与Java的互操作性不是偶然的,或者只是通过使用在JVM上运行的语言可以获得的。 JetBrains设计Kotlin意识到当前的Java生态系统和情况。他们试图以更容易使用的方式带来最大的价值。这种兼容性归结为字节码本身的结构。并且是导致Corda选择Kotlin超过Scala的原因之一。
Scala可以使用Java
创建Scala是为了在JVM平台上运行,以便于部署,但兼容性并不是主要目标。这从技术方面开始,并继续使用语言功能。例如,最新版本的Scala需要Java 8。
这一点,加上语言的功能,意味着如果你想用Scala进行开发,那么来回Java很难,而不是真正的用例。使用现有的Java代码库?是的你可以。使用Scala保持开发Java软件?不是一个好主意。
由于Scala支持函数式编程以及面向对象的编程,因此兼容性也变得困难。如果您使用其高级功能特性,那么在Java中您无法做到这一点。而且,即使可以,您的Java程序员可能也不知道如何使用它们。
不同的哲学
许多成功的语言都有精确的目标和特定的编程理念。 Kotlin和Scala也不例外。 Kotlin希望成为更好的Java,而Scala计划远远超过Java。
Kotlin是一个更好的Java
你可以说Kotlin已经实现了它的最初目标:它成为第一种正式支持Android开发的语言,而不是Java。这无疑是一项伟大的成就,证明了一些事情:Java社区喜欢Kotlin,很容易将Kotlin介绍给Java开发人员。
Kotlin是一种实用的语言,旨在提高Java开发人员的工作效率和易学。它主要设计为Java,但在Java模型之上有一些C#甚至Scala。它增加了Java程序员想要的功能,如lambda和基本功能,并简化生活,如智能转换和非可空类型。在许多情况下,Kotlin的添加物通常被称为语法糖。一种更简洁的方式来表达开发人员使用的常见模式。
虽然Kotlin为函数式编程提供了一些支持,但它确实可以实现更简单的过程式编程或命令式编程。例如,个人职能现在可以成为该语言的一等公民。 Kotlin更喜欢简单而不是正式。
Scala比Java更强大
Scala从未尝试过这样做。它被设计为比Java更强大。或者更一般地说,是比Java更好的语言。 Scala旨在完成Java无法做到的事情。
Scala为高级函数编程提供了很好的支持,事实上函数式编程就像面向对象编程一样是一流的公民。这增加了复杂性,使Scala成为一种着名的比较难学习的语言。这不是严格意义上的语言缺陷,你可以做得更多,所以还有更多需要学习的地方。你可以混合范式,因此你必须全部了解它们。
这在权利手中可能是一个优势,在错误的手中也是一个缺点。 Scala中有多种编程风格,可能会导致混乱或为每种需求提供最佳风格。无论如何,这会导致更高的开发成本和优秀Scala开发人员的更高工资。根据你是谁,这可能是好事还是坏事。
语言世界
地球的一半在白天,一半在黑暗中
社区
Scala有一个更大的社区,如果没有其他因为它已经存在更长时间。除非我们谈论Android开发,否则Kotlin可能已占上风。只需看看2017年的Google I / O,就可以看到Kotlin收到的热情。
优秀的Java兼容性在某种程度上减轻了本机库的相对缺乏。但是具有惯用Kotlin代码的强大库并不总是在Kotlin中可用,或者它们不像Scala和Java那样深入开发。
文档和易学习
这两种语言都有很好的文档,但令人惊讶的是Scala的长寿可能会成为一个问题,因为某些部分“处于不稳定状态”(例如Scala Wiki)或者现在Scala官方网站已经更新可能已经过时了。此外,您必须在Scala中培训开发人员并以您的开发方式对其进行培训。你不能只选择一些Java开发人员并给他们几天的培训。实际上,如果你选择一个典型的Java开发人员,你甚至可能需要训练他进行函数式编程。
你可以用Kotlin做到这一点。 Corda实际上做到了这一点:
优秀的文档和小型标准库使其成为一种非常快速的语言学习。我们没有明确宣传我们的职位需要Kotlin经验,并且一直在招聘那些不知道它的人,在新团队成员制作惯用代码之前的1-3天内加速。
Kotlin更容易学习,更容易尝试,它有一个很好的在线测试环境,带有示例,甚至可以转换Java代码。因此,您可以立即看到如何使用Java执行相同的操作。
工装
Scala和Kotlin都是静态类型语言,允许一整套编译器检查和静态分析工具。所以潜力是相似的。话虽如此,对于Kotlin来说,工具更好,鉴于由着名的编程工具软件公司JetBrains创建,这并不令人惊讶。至于文档,Scala的情况并不是很糟糕,但Kotlin非常棒。
以前,官方Scala网站提供基于Eclipse的IDE。我们报告了这个事实,这就是为什么你会在评论中看到有关它的提及。现在它建议使用IntelliJ Scala插件,许多开发人员已经写过,他们说的就是这样。所以Scala有一个很好的IDE。
但是Kotlin已经集成在IntelliJ IDEA和Android Studio中。它还有一个Eclipse插件。此外,IntelliJ IDEA还具有相同的在线转换工具和示例,因此您可以轻松转换Java类并使用交互式示例学习该语言。如果需要与工作流程进行更高级的集成,也可以使用独立编译器。
概要
Kotlin设计似乎采取整体方法:其作者考虑了每个设计决策如何影响整个开发体验。功能真的有必要还是有替代品?那个选择会让编译器变慢吗?提供良好的工具支持会变得更加困难吗?
Scala设计师似乎没有受到实用主义的困扰,因为他们遵循另一个好主意。 Scala让我想起C ++:总有一个地方可以提供更多功能。当然,他们说您可以采用自己的子集,并降低组织中使用的语言的复杂性。它可以在某些地方使用,但我并没有为每个人都出售这个想法。
许多人转向Scala,希望有更好的语言和对Java的不满意。大多数有第一动机的人都对Scala感到满意。许多对Java完全不满意的人对Scala的复杂性感到有些困惑。它不适合他们。它只是与普通旧Java不同的东西。
Kotlin对他们来说可能是一种更好的语言。每个Java开发人员都可以轻松选择Kotlin,而Scala则不然。
如果你需要一种比Java本身更高效的类Java语言,你应该选择Kotlin。如果你需要Haskell和Java,你应该使用Scala。
我们希望这种务实的比较是有用的。但是如果你想进行更多的技术比较并看看这两种语言的语法,我们建议你看一下Scala vs Kotlin,或者A Java geek的一系列三篇文章。