JetBrains在2011年7月发布了Kotlin,旨在创建一种在 JVM 和 Web 上运行的现代通用编程语言。
Kotlin 是一种跨平台的静态类型语言,具有现代简洁的语法,旨在克服Java开发停滞时期的 Java 缺陷。Kotlin 的关键特性包括 null 安全性、协程、数据类型、扩展函数等。
在 2011 年发布后,Kotlin 花了一年时间实现了开源,又花了四年时间才在2016年1.0版本中实现了稳定。
仅仅三年之后,谷歌就将其作为 Android 开发的首选语言,这很快导致超过60%的专业Android开发者采用了它。最近,Jetpack Compose 1.0的发布再次证实了谷歌对 Kotlin 的承诺。Jetpack Compose 1.0 完全使用该语言开发,并充分利用了其语法功能。
Kotlin 不仅仅是一种用于移动应用程序开发的语言,尽管它在这个领域取得了巨大的成功,在Play Store的前1000个应用程序中有80%以上使用Kotlin。事实上,据 JetBrains 称,超过480万名开发者已经将 Kotlin 用于服务器端、移动多平台、Android 和前端开发。
《Stack Overflow Developer Survey 2020》也证实了 Kotlin 的日益普及,该调查发现 JetBrains 的语言仅次于 Go 和 C/C++。
InfoQ 借此机会,与 JetBrains 的 Kotlin 项目负责人 Roman Elizarov 进行了交谈,以了解更多关于其过去、现在和未来的信息。
InfoQ: Kotlin 很快就取得了巨大的成功,最引人注目的是在 Android 平台上,它几乎取代了 Java。你怎么看待这些?
Roman Elizarov: 我们从最初发布的时间算起已经有 10 年了。如果你仔细考虑一下,就会发现它并没有迅速取得巨大的成功。事实上,你会看到一种不同的模式,它极大地促进了 Kotlin 后来的成功。Kotlin 并不是闭门开发的。在 Kotlin 1.0 于 2016 年发布之前,其一半以上的时间都是在根据早期采用者的真实反馈不断进行测试和调整。2016 年曝光的稳定语言与 2011 年提出的最初想法大不相同。这是 Kotlin 成功的第一个组成部分——Kotlin 是务实的。它不是一种基于一小部分设计者的理论、哲学或假设的语言,而是一种基于实际使用数据的语言,旨在简化从事大型项目的专业开发人员的日常工作。
使 Kotlin 脱颖而出的不是单一功能,而是它们的结合。从 null 安全和不变量的友好性,到对集合进行简洁高效的功能操作,它们都是为了解决 Java 开发人员当时所遭受的具体痛苦而设计的。然而,尽管当前的目标是设计更好的 Java,但灵感来自各种语言,包括生产型语言和实验型语言。
自 2016 年 Kotlin 稳定发布以来,团队非常重视向后兼容性,这也是 Kotlin 真正增长和采用的开始。这是 Kotlin 之所以获得成功的第二部分。作为一种行业语言,团队对确保向后兼容性的强烈关注随着时间的推移获得了回报。
事后看来,Kotlin 在 Android 的快速增长是合乎逻辑的,尽管它从未被计划过。2017 年,当谷歌正式采用 Kotlin 时,它已经是一种成熟、稳定且经过战斗考验的编程语言。
InfoQ: 展望现在和不久的将来,Kotlin 的进一步发展似乎与它作为服务器端或全栈语言的采用有关。在这些环境中,Kotlin 达到了什么成熟度级别?
Elizarov: Kotlin 在服务器端的前景是光明的。这是 Kotlin 的主场——这个语言最初就是为服务器端开发而设计的。服务器端相当复杂,需要维护大量现有代码。这就是为什么 Kotlin 设计优先考虑并将继续优先考虑与现有 Java 代码和库的良好互操作性。我们高兴地看到我们的努力得到了回报。根据Snyk最近的JVM生态系统报告,18%的 Java 开发人员已经使用了 Kotlin。我们预计这一数字将稳步增长。当然,由于领域的特殊性,服务器端的增长不会像 Android 那样快,但 Kotlin 会长期坚持,我们并不着急。
作为一种全栈、多平台的语言,Kotlin 才刚刚起步。整个 Kotlin multiplatform 于 2017 年发布,目前仍处于试验阶段。然而,我们看到我们的社区产生了巨大的兴趣和参与度,这与我们在 Kotlin 1.0 之前得到的反馈非常相似。因此,我们再次采取了一种慎重的方法,在它们通过时间考验并获得现实反馈之前,我们不会急于稳定任何东西。基于过去的历史,随着我们从Kotlin Multiplatform Mobile (KMM)开始稳定 Kotlin multiplatform 的各个部分,我们预计对 Kotlin multiplatform 的采用会大大加快步伐。
InfoQ: Kotlin 没有像 JVM 那样在不同的虚拟机实现上运行相同的字节码,而是通过编译到不同的平台来实现跨平台支持。你认为,随着 Kotlin 和其它语言采用相同的方法,Java 对“一次编写,到处运行”的理解现在是否已经过时?
Elizarov: Java 的“一次编写,到处运行”的思想在服务器端取得了成功,但在前端——无论是 Web 端还是移动设备端——都没有成功。有太多特定于平台的东西是 Java 太慢而无法适应的。即使在技术上可以运行 JVM 字节码的 Android 上,也不是每个 JVM 库都能开箱即用。因此,你可以在任何地方运行任何东西的想法确实已经过时,但在平台之间共享源代码的愿望仍然存在。这是一个不同的目标。
在我看来,Java 的主要错误是变得太大了,试图将太多东西标准化并嵌入到平台中,比如动态代码加载、XML 解析、甚至 UI 库,这些东西经不起时间的考验,结果只是昙花一现的时尚,而不是基本的东西。Java 模块化来的太晚了。在 Kotlin,我们正采取一种更为慎重的方法来扩展核心语言和核心库。我们正在确保 Kotlin 在未来几十年内保持相关性。此外,我们并不会幻想任何代码都可以在任何地方运行。我们的愿景是,开发人员将明确地在脑海中保留他们希望代码运行的平台列表,并且平台之间总会存在一些需要偶尔考虑的差异。
InfoQ: 作为一种服务器端语言或全栈语言,Kotlin 必须面对更激烈的竞争,(比它在 Android 平台上赢得的竞争更激烈),包括最近引入的 Rust 和 Swift 等语言。你如何看待 Kotlin 在这个竞技场上的表现?它的相对优点是什么?
Elizarov: Rust 和 Swift 在各自的方面都是伟大的语言,但我不认为 Kotlin 在正面直接与它们竞争,只是在某些领域。
在我看来,Rust 更像是一种系统语言,更安全地替代了 C 和 C++。在 Rust 中,你可以精确地控制内存和其它资源,并且与 Kotlin 相比,具有更多的低级别代码性能调优能力。你可以用 Rust 编写出色的应用程序软件,但它将为开发人员带来更陡峭的学习曲线、需要更多的努力和更详细的代码,来告诉 Rust 编译器你到底想做什么。Kotlin 的做法完全相反。Kotlin 的目标是从代码中完全删除任何仪式,包括内存管理,并让应用程序开发人员专注于他们代码的实质——他们正在编写的业务逻辑,即使这意味着牺牲一些运行时性能。
Swift 则不同。Swift 拥有现代的外观和感觉,但它仍然延续了苹果 Objective-C 的传统,拥有许多苹果生态系统之外的现代语言很少具有的功能和独特的设计选择。仅凭这一点,它就成为一种特殊市场定位的语言。此外,作为 Swift 的创造者,苹果似乎对 Swift 在其它平台上的未来并不感兴趣,或者在外部观察者看来是如此。对于 Kotlin 来说,这意味着在苹果平台上与 Swift 激烈竞争开发者们的意愿,但几乎不担心 Kotlin 瞄准的所有其它平台。
InfoQ: 你希望看到 Kotlin 在未来 10 年内如何发展?
Elizarov: 我们未来 10 年的主要重点是多平台生态系统。我们仍然需要稳定它的核心部分,包括编译器和工具,然后帮助社区提供生态系统繁荣所需的所有领域特定的库。
就语言本身而言,这一切都是为了保持相关性,跟上所有现代趋势和创新。我们目前正在经历一场 UI 革命。响应式框架处于领先地位,Kotlin 正追赶潮流,全面采用 Jetpack Compose 作为 Kotlin 的现代 UI 范式。随着响应式编程在开发人员中流行,处理不可变数据的工效学成为该语言的首要关注点,这也是我们计划在未来 10 年大力投入的领域之一。我个人确实可以预计,在这 10 年的晚些时候,服务器端也会发生类似的变化,重点将从可变数据转移到不可变数据,从命令式代码转移到更具功能性的响应式代码。
处理数据是这里的总体趋势。随着我们的信息系统变得越来越复杂,我们经常发现自己不得不处理更不结构化的变化更大的数据结构。到目前为止,像 Python 和 JS 这样的动态语言通过为开发人员提供一种任意数据的更简单的方法而获得了这种转换的好处,但代价是生成在工业规模和复杂度上更难扩展和支持的代码。我们正在寻找将其中一些方法与 Kotlin 强大的静态类型相结合的方法,以便为开发人员提供更好的工具来满足他们所有的数据操作需求。我们对不断增长的数据科学领域特别感兴趣,并将在这一领域继续改进。
随着 Kotlin 扩展到服务器端和移动设备及其之外的更多领域,我们不能忽视支持更好的元编程功能的需求。许多领域都希望有自己独特的特定领域的调整或扩展,这些调整或扩展根本不适用于常用库的严格框架。Kotlin 最初被设计为非常适合领域特定语言(DSL),具有接收器、构建器和内联函数。但我们现在正在超越这一点。既扩展了 Kotlin 的内联函数的功能,又为编译时计算提供了便利,还开发了编译器插件 API,用于对该语言进行更激进的领域特定扩展。
几个月前,Kotlin达到了1.5版本,引入了对一些最新 Java 特性的互操作支持,包括记录类、密封接口、内联类。此外,Kotlin 编译器切换到一个新的 JVM 中间表示,目的是提高性能,并为新的语言特性提供基础。Kotlin 可以作为IntelliJ IDEA和Android Studio的一部分安装,也可以通过克隆它的GitHub仓库安装。
嘉宾简介:
Roman Elizarov 是 JetBrains 的 Kotlin 项目负责人,目前以首席语言设计师的身份专注于 Kotlin 语言设计。在 2000 年,Roman Elizarov 从圣彼得堡 ITMO 毕业,开始了专业软件开发生涯。在本科学习期间,他参加了国际大学生编程竞赛(ICPC)。自 1997 年至今,Roman 担任 ICPC 北欧地区首席法官。他还保持学术联系,并在 ITMO 教授并发和分布式编程课程。Roman Elizarov 的职业生涯的大部分时间都在 Devexperts 工作,他在那里为领先的经纪公司和市场数据交付服务设计和开发了高性能的交易软件,这些服务通常每秒处理数百万个事件。他是 Java 和 JVM 方面的专家,特别是在并发、实时数据处理、算法和现代架构的性能优化方面。自 2016 年以来,他一直在 JetBrains 从事 Kotlin 方面的工作,并为 Kotlin 协程的设计和 Kotlin 协程库的开发做出了贡献。
作者简介:
Sergio De Simone 是一名软件工程师。Sergio 在一系列不同的项目和公司担任软件工程师超过 15 年,包括西门子、惠普和小型初创企业等不同的工作环境。在过去的几年中,他一直专注于移动平台和相关技术的开发。他目前在 BigML,Inc.工作,负责 iOS 和 OS X 开发。
评论 1 条评论