19

22 个必知编程语言之「Kotlin」

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzA5OTI2MTE3NA%3D%3D&%3Bmid=2658339118&%3Bidx=2&%3Bsn=dbec4af2ea122fe7a4e208be263b4e53
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

iQBJNju.jpg!mobile

Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。Kotlin 已正式成为 Android 官方支持开发语言。

2010 年,JetBrains 产生创造 Kotlin 的想法。关于大名鼎鼎的 JetBrains,想必在业内是人尽皆知,知名的 IntelliJ IDEA 就是他们的产品之一。拥有为各种语言构建开发工具经验的 JetBrains,自然是对编程语言设计领域最熟悉的一群人。当时,一方面他们看到了 C#在.NET 平台上大放异彩;另一方面,Java 相比新语言在某种程度上的滞后,让他们意识到改良 Java 这门主流语言的必要性。

JetBrains 团队设计 Kotlin 所要面临的第一个问题,就是必须兼容他们所拥有的数百万行 Java 代码库,这也代表了 Kotlin 基于整个 Java 社区所承载的使命之一,即需要与现有的 Java 代码完全兼容。这个背景也决定了 Kotlin 的核心目标——为 Java 程序员提供一门更好的编程语言。

Kotlin 的实用主义

Kotlin 常常被认为是一门近似于 Scala 的语言。的确,它们的诞生都源于对 Java 语言的改良,同时都在面向对象和函数式之间建立起了多范式的桥梁。不可否认的是,Kotlin 确实从 Scala 身上借鉴了许多,就连它的创作团队也表示过:“如果你用 Scala 感到很开心,那么你并不需要 Kotlin。”

然而,Kotlin 与 Scala 的设计哲学又十分不同。Kotlin 并没有像 Scala 那样热衷于编程语言本身的研究和探索。相反,它在解放 Java 的同时,又在语言特性的选择上表现得相当克制。

我们说过,Scala 旨在成为一门程序员梦想中的语言,它包含了所有你想拥有的语言特性。而 Kotlin 更加立足现实,它现阶段仍没有宏,也拒绝了很多所谓的高级函数式语言特性。但它在 Java 的基础上发展出很多改善生产力的语言特性,如数据类、when 表达式(一定程度上的模式匹配)、扩展函数(和属性)、可空类型等,而且它似乎偏好语法糖,比如 Smart Casts,因为这可以让编程人员的工程开发变得更加容易。

可以看出,Kotlin 的自我定位非常清晰,它的目标就是在计算机应用领域成为一门实用且高效的编程语言。如果说 Scala 的设计理念是 more than Java(不仅仅是 Java),那么 Kotlin 才是一门真正意义上的 better Java(更好的 Java)。

更好的 Java

如果你用 Kotlin 开发过业务,很快就会意识到它相较于 Java 的语法更加简洁、高效。比如 Kotlin 做了这些改良:

  • 在很大程度上实现了类型推导,而 Java 在 SE 10 才支持了局部变量的推导。

  • 放弃了 static 关键字,但又引入了 object,可以直接用它来声明一个单例。而作为比较,Java 则必须依靠构建所谓的“单例模式”才能等效表达。

  • 引入了一些在 Java 中没有的“特殊类”,比如 Data Classes(数据类)、Sealed Classes(密封类),我们可以构建更深程度上的代数数据类型,结合 when 表达式来使用。

但可能你会问,以上 Kotlin 的特性,Scala 也有,能否可以说前者只是后者的一个子集呢?这种表述其实是不恰当的。其实,Kotlin 在致力于成为更好的 Java 的道路上,不仅仅依靠这些新增的语言特性,它在兼容 Java 方面做了大量的工作,比 Scala 走得更远。

首先,从语言命名上就可以看出 Kotlin 在严格遵循 Java 的传统,它们都采用了岛屿的名字。

Java 的名字来源于印度尼西亚瓜哇岛的英文名称,而 Kotlin 是俄罗斯圣彼得堡附近的一个岛屿的名字。

其次,虽然都是兼容 Java,Scala(最近的几个版本)必须要求 Java 8,而 Kotlin 则可以与 Java 6 一起工作,这也是后者在 Android 上更加流行的原因之一。

另外,Kotlin 并没有像 Scala 那样在语法的探索上表现得“随心所欲”,Java 程序员在学习 Kotlin 新语法特性的同时,依旧可以保留更多原有的习惯。举个例子,在 Scala 中,一切皆有类型。所以在大部分时间里,我们都用等号来定义一个 Scala 的函数。函数体最后一个表达式的值就是这个函数的返回类型。

def foo( x : Int) = {

val y = x + 2

x + y

}

没错,Scala 舍弃了 return 关键字。在 Kotlin 中,它也引入了使用单行表达式来定义函数的语法,不需要用 return 来返回结果值。

fun foo (x: Int ) = x * 2 + 2

然而,大部分情况下,我们还是可以采用类似 Java 的方式来定义一个函数,如:

fun foo (x: Int ): Int {

val y = x * 2

return y + 2

}

由于 Kotlin 比 Scala 更加兼容 Java 的生态和语法,Java 程序员可以更加容易地掌握它。同时,Kotlin 非常注重语法的简洁表达。如果你了解 Scala 中的 implicit,可能曾被这个 Scala 的语法惊吓到,因为它非常强大。然而,正如我们提到的,“简单灵活”的另一面意味着抽象和晦涩。Kotlin 注重的是工程的实用性,所以它创造了扩展的语法,虽然相比 implicit 在功能上有损失,但显得更加具体直观,且依旧非常强大,可满足日常开发中绝大多数的需求。值得一提的是,Android 则依靠这个 Java 所没有的特性,推出了扩展库 android-ktx,我们在第 7 章将专门介绍这种强大的特性。

此外,Kotlin 还新增了一些 Java、Scala 中没有的语法糖。如果你从事 Android 开发,那么肯定少不了在工程中写过如下的 Java 代码:

复制代码

if(parentView instanceof ViewGroup){

((ViewGroup) parentView). addView(childView);

}

为了类型安全,我们不得不写两遍 ViewGroup。然而在 Kotlin 中我们却可以直接这么写:

复制代码

if (parentView is ViewGroup){

parentView.addView(childView)

}

这依靠的是 Kotlin 中的 Smart Casts 特性。我们不评价这种语法糖是好是坏,但它可以在一定程度上改善我们在工程开发中的体验。

总体而言,Kotlin 旨在成为一门提升 Java 生产力的更好的编程语言,它拥有简洁的表达能力、强大的工具支持,同时至今仍然保持着非常快速的编译能力。相较而言,用 Scala 开发则常常受到编译过慢带来的困扰。

强大的生态

现在,我们已经了解了 Kotlin 整体的设计哲学,以及它相较 Java、Scala 的魅力所在。当然,本章似乎并没有涉及任何语法细节,我们会在后续的内容中深入介绍 Kotlin 的语言特性,并且探索它具体的高级应用。

关于 Kotlin,还有一个问题需要解答:我们究竟可以用它来做什么?大概率上你是因为 Kotlin 成为 Android 官方支持语言的新闻而知晓它的。事实上,Kotlin 不仅支持 Android,它还是一门通用语言,如果用一句话来总结,那就是“Targeting JVM / JavaScript and Native”。现阶段,我们至少可以用 Kotlin 做以下的事情。

(1)Android 开发

我们不仅可以用 Kotlin 调用现成的 Java 库,而且还有 Google 提供的 Kotlin 扩展库。Kotlin 的语法非常适合 Android 工程开发,例如我们提到过的 Smart Casts。用它还可以改善 findViewById 的语法调用。

(2)服务端开发

这是 JVM 语言最大的一个应用领域,自然也是 Kotlin 发挥的舞台。在 Android 支持 Kotlin 之后,Spring Framework 5 也对它敞开了怀抱。基于 Kotlin 更自然的函数式特性,用 Spring 进行 Web 开发会在某些方面拥有比 Java 更好的开发体验。

(3)前端开发

Kotlin 还有两个强大的特性:dynamic 类型及类型安全的构建器。前者实现其与 JavaScript 互通,后者可以帮助开发者构建可靠的 HTML 页面。你可以尝试使用 Kotlin 来构建 UI。

(4)原生环境开发

因为 Kotlin Native 这个项目,Kotlin 终于告别了 Java,离开了 JVM,直接编译成机器码供系统环境运行。虽然 Kotlin Native 尚处于早期阶段,但后续的发展非常值得期待。如果你家里有一个树莓派,不妨可以用它来试一试。

如你所见,Kotlin 还是一门非常开放、具有强大生态的编程语言。如果说与 Java 兼容能让它运行在所有支持 Java 的地方,那么它的革命创新使得它超越了 Java,进入了更加广阔的世界。

Kotlin 为跨端开发带来哪些影响?

Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,它可以被编译成为 JavaScript 源代码。虽然与 Java 语法并不兼容,但 Kotlin 可以和 Java 代码相互运作,并可以重复使用现有的 Java 类库。为了解 Kotlin 的更多相关信息,InfoQ 采访了 Kotlin 编译器团队成员 Svetlana Isakova,并希望通过本文为你带来一些关于 Kotlin 方面的启示。

在 Kotlin 刚刚诞生之时,人们强烈需要一种能够解决 Java 痛点(例如语法冗长以及可空性)等问题的面向 Java 平台的现代语言。 Kotlin 很好地满足了这一需求,因此很多人现在倾向于选择 Kotlin 替代 Java。

如今,Kotlin 试图解决社区的另一大痛点:利用一种语言在不同平台之间共享代码。这种 Kotlin/ 多平台技术仍处于试验阶段,但通过观察有多少人在生产当中使用这项技术,我们得以确认这种需求相当强烈,我们也希望能够为此提供一套良好的实用解决方案。

另一项因素在于,编程语言需要拥有一家强大的公司作为后盾。JetBrains 是一家在全球范围内享有盛誉的成功企业,拥有丰富的相关专业知识。为多种不同语言(包括 Java、C#、Python、Ruby 以及 Go 等)创建 IDE,而 Kotlin 目前正是 JetBrains 的高优先级项目。目前,JetBrains 内部有一支 70 多人的团队,正在社区的帮助下推动 Kotlin 及其 IDE 支持工作。

Kotlin 语言中的大部分功能都是为了与 Java 实现轻松互操作而设计的。 但除此之外,通过运用 Kotlin 中的特定功能(例如带有接收者的 lambda 表达式以及运算符重载等 DSL 创建功能,以及协程等),Kotlin  API 将带来更强大的表达能力与功能水平。

Kotlin 的目标是实现多平台可用,这对前端开发者实现跨端开发带来在 多种平台之间共享代码! 这是开发者社区长期以来的持续需求,具体涵盖移动开发(在 Android 与 iOS 应用程序之间共享代码)以及 Web 开发(在后端与前端之间共享代码)。

Kotlin 多平台方案与其它现有解决方案(例如 Flutter、React Native 或者 Xamarin)之间最大的区别,在于前者可以改变需要共享的部件。我们并不需要对整个应用程序进行共享,有时候只需要保证其中部分组件——例如 UI 逻辑——具有平台中立性即可。Kotlin 方案提供理想的灵活性,所共享逻辑的百分比可以随时间变化,并根据您的实际需求调整。以往,如果有人最初选择 React Native,但之后决定转向 Kotlin 及 Swift 等原生语言,则需要从零开始重写整个应用程序。但使用 Kotlin/ 多平台则不会出现这样的问题:其中某些部分已经使用 Kotlin 及 Swift 编写,且具体需要共享的部分可以轻松完成修改。

再来看 Web 开发,在这方面多平台 Kotlin 项目主要针对那些需要同时编写前端与后端代码,但又更希望只使用同一种语言的开发者。在不同语言的上下文之间来回切换非常麻烦,Kotlin 则很好地解决了这个问题。

Kotlin 团队正在进行的几个研究方向:

  • 用于支持多种不同格式的多平台序列化库。由于其不使用 reflection,因而速度很快。

  • 持续开发,代表基于挂起的响应式流(reactive stream)的流(Flow),目前已经加入稳定版本。

  • 套用于向 Kotlin 标准库内添加不可变持久集合的原型方案。

Kotlin/Native关注开发出完整而且稳定的 Kotlin/ 多平台方案。 其次,则是提高 Kotlin/Native 的编译性能。

Self-host(也就是在一种语言中使用另一种语言编写代码)目前还不是优先事务,因为除了作为“一般性概念验证”之外,这种功能不会给最终用户带来明显的助益。Kotlin/Native 代码可以复用 Kotlin 编译器的代码,其主要由 Kotlin/JVM 编写而成。

選自:https://www.infoq.cn/article/rZwyqOr35FS9wtDGIIhu

Kotlin开发者社区

63qymyb.jpg!mobile

专注分享 Java、 Kotlin、Spring/Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、函数式编程、编程思想、"高可用,高性能,高实时"大型分布式系统架构设计主题。

High availability, high performance, high real-time large-scale distributed system architecture design

分布式框架:Zookeeper、分布式中间件框架等
分布式存储:GridFS、FastDFS、TFS、MemCache、redis等
分布式数据库:Cobar、tddl、Amoeba、Mycat
云计算、大数据、AI算法
虚拟化、云原生技术
分布式计算框架:MapReduce、Hadoop、Storm、Flink等
分布式通信机制:Dubbo、RPC调用、共享远程数据、消息队列等
消息队列MQ:Kafka、MetaQ,RocketMQ
怎样打造高可用系统:基于硬件、软件中间件、系统架构等一些典型方案的实现:HAProxy、基于Corosync+Pacemaker的高可用集群套件中间件系统
Mycat架构分布式演进
大数据Join背后的难题:数据、网络、内存和计算能力的矛盾和调和
Java分布式系统中的高性能难题:AIO,NIO,Netty还是自己开发框架?
高性能事件派发机制:线程池模型、Disruptor模型等等。。。

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。不积跬步,无以至千里;不积小流,无以成江河。

I3yMBrJ.jpg!mobile

Kotlin 简介

Kotlin是一门非研究性的语言,它是一门非常务实的工业级编程语言,它的使命就是帮助程序员们解决实际工程实践中的问题。使用Kotlin 让 Java程序员们的生活变得更好,Java中的那些空指针错误,浪费时间的冗长的样板代码,啰嗦的语法限制等等,在Kotlin中统统消失。Kotlin 简单务实,语法简洁而强大,安全且表达力强,极富生产力。

Java诞生于1995年,至今已有23年历史。当前最新版本是 Java 9。在 JVM 生态不断发展繁荣的过程中,也诞生了Scala、Groovy、Clojure 等兄弟语言。

Kotlin 也正是 JVM 家族中的优秀一员。Kotlin是一种现代语言(版本1.0于2016年2月发布)。它最初的目的是像Scala那样,优化Java语言的缺陷,提供更加简单实用的编程语言特性,并且解决了性能上的问题,比如编译时间。JetBrains在这些方面做得非常出色。

Kotlin语言的特性

用 Java 开发多年以后,能够尝试一些新的东西真是太棒了。如果您是 Java 开发人员,使用 Kotlin 将会非常自然流畅。如果你是一个Swift开发者,你将会感到似曾相识,比如可空性(Nullability)。Kotlin语言的特性有:

1.简洁

大幅减少样板代码量。

2.与Java的100%互操作性

Kotlin可以直接与Java类交互,反之亦然。这个特性使得我们可以直接重用我们的代码库,并将其迁移到 Kotlin中。由于Java的互操作性几乎无处不在。我们可以直接访问平台API以及现有的代码库,同时仍然享受和使用 Kotlin 的所有强大的现代语言功能。

3.扩展函数

Kotlin 类似于 C# 和 Gosu, 它提供了为现有类提供新功能扩展的能力,而不必从该类继承或使用任何类型的设计模式 (如装饰器模式)。

4.函数式编程

Kotlin 语言一等支持函数式编程,就像Scala一样。具备高阶函数、Lambda 表达式等函数式基本特性。

5.默认和命名参数

在Kotlin中,您可以为函数中的参数设置一个默认值,并给每个参数一个名称。这有助于编写易读的代码。

6.强大的开发工具支持

而由于是JetBrains出品,我们拥有很棒的IDE支持。虽然Java到Kotlin的自动转换并不是100% OK 的,但它确实是一个非常好的工具。使用 IDEA 的工具转换Java代码为 Kotlin 代码时,可以轻松地重用60%-70%的结果代码,而且修改成本很小。

Kotlin 除了简洁强大的语法特性外,还有实用性非常强的API以及围绕它构建的生态系统。例如:集合类 API、IO 扩展类、反射API 等。同时 Kotlin 社区也提供了丰富的文档和大量的学习资料,还有在线REPL。

A modern programming language that makes developers happier. Open source forever

7FrU3i.jpg!mobile

图来自《Kotlin从入门到进阶实战》 (陈光剑,清华大学出版社)

BZfEjy7.jpg!mobile

图来自《Kotlin从入门到进阶实战》 (陈光剑,清华大学出版社)

mm2Qjm3.jpg!mobile

https://kotlinlang.org/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK