kotlin 为什么不会替代java(每个程序员都应该知道的下一个编程语言)
kotlin 为什么不会替代java(每个程序员都应该知道的下一个编程语言)Kotlin不需要采用任何费用!它是开源的,但这不是我在这里的意思。我的意思是有一个高质量、一键式Java到Kotlin转换器工具,并强烈关注Java二进制兼容性。您可以一次将现有Java项目转换为一个文件,所有内容仍然可以编译,即使对于运行数百万行代码的复杂程序也是如此。这就是我采用Kotlin的方式,我希望它是大多数开发人员所做的。Kotlin来自工业,而不是学术界。它解决了当今工作程序员面临的问题。例如,类型系统可以帮助您避免空指针异常。研究语言往往根本就没有null,但这对使用大型代码库和API的人来说没有用。这篇文章在大家一开始看的时候可能会很奇怪:通常语言倡导文章首先列出新语言的所有酷炫功能。但这篇文章没有,我们稍后会讲到。我将首先向您介绍其他内容,因为2013年的一项研究表明,与开发人员评估编程语言时的生态系统问题相比,语言功能很少。这很符合我自己的经验,所以,我们开始吧:K
点击上方关注,All in AI中国Kotlin来自工业,而不是学术界。它解决了当今工作程序员面临的问题。例如,类型系统可以帮助您避免空指针异常。研究语言往往根本就没有空,但这对使用大型代码库和API的人来说没有用。
Kotlin是JetBrains的一种新编程语言,JetBrains是世界上最好的IDE的制造商。经过多次搜索,我已经确定了它作为我将在未来5到10年左右使用的编程语言。
我非常喜欢Kotlin,并认为这将是一个非常成功的项目。在这篇文章中,我将解释为什么我认为Kotlin是好的。然后,我将讨论如果您今天开始使用它可能遇到的一些问题。最后,我认为现在Kotlin已经出现了,如果你还没有使用JVM(例如因为你使用Go或Node),你应该考虑使用JVM。
为什么Kotlin很好?
这篇文章在大家一开始看的时候可能会很奇怪:通常语言倡导文章首先列出新语言的所有酷炫功能。但这篇文章没有,我们稍后会讲到。
我将首先向您介绍其他内容,因为2013年的一项研究表明,与开发人员评估编程语言时的生态系统问题相比,语言功能很少。这很符合我自己的经验,所以,我们开始吧:
Kotlin编译为JVM字节码或JavaScript。它不是您编写内核的语言。对于今天使用Java的人来说,可能会非常感兴趣,尽管它可以吸引所有使用垃圾收集运行时的程序员,包括目前使用Scala、Go、Python、Ruby和JavaScript的程序员。
Kotlin来自工业,而不是学术界。它解决了当今工作程序员面临的问题。例如,类型系统可以帮助您避免空指针异常。研究语言往往根本就没有null,但这对使用大型代码库和API的人来说没有用。
Kotlin不需要采用任何费用!它是开源的,但这不是我在这里的意思。我的意思是有一个高质量、一键式Java到Kotlin转换器工具,并强烈关注Java二进制兼容性。您可以一次将现有Java项目转换为一个文件,所有内容仍然可以编译,即使对于运行数百万行代码的复杂程序也是如此。这就是我采用Kotlin的方式,我希望它是大多数开发人员所做的。
作为上述的一个明显的含义,Kotlin程序可以使用所有现有的Java框架和库,甚至是依赖于注释处理的高级框架。互操作是无缝的,不需要包装器或适配器层。它与Maven、Gradle和其他构建系统集成。
它是平易近人的,只需阅读语言参考,就可以在几个小时内学会它。语法简洁直观。Kotlin看起来很像Scala,但更简单。语言很好地平衡了简洁性和可读性。
它没有强制执行特定的编程哲学,例如过度功能或OOP样式。
它不增加运行时开销。标准库小而紧凑:它主要包含Java标准库的重点扩展。大量使用编译时内联意味着像map / filter / reduce管道的功能构造类似于相同代码的命令式版本。
结合Anko和Kovenant等框架的外观,这种资源轻盈意味着Kotlin开始受到Android开发者的欢迎。如果你在Android上工作,你很快就会有好伙伴。您可以阅读Square的开发人员撰写的关于他们使用Kotlin和Android的经历的报告。
Kotlin允许您继续使用提高生产力的工具。如果使用IntelliJ、IDE互操作是完全无缝的:代码可以重构、搜索、导航和自动完成,就像Kotlin代码是Java一样,反之亦然。完全支持调试、单元测试、分析等。
- 除了Android,我认为Kotlin非常适合企业Java商店。如果你整天都在大公司的大型Java代码库上工作,你应该调查一下Kotlin,因为:
- 它得到了一家知名公司的强大商业支持。JetBrains致力于该项目,拥有一支庞大且非常称职的团队,拥有稳定的商业模式,甚至可以转换部分自己的旗舰产品来使用它。Kotlin不太可能很快被抛弃。
- 采用Kotlin的风险很低:它可以在一小部分代码库中由一两个热情的团队成员进行试验,而不会破坏项目的其余部分:Kotlin类导出一个看起来与常规Java代码相同的Java API。
- 采用Kotlin的风险很低:它可以在一小部分代码库中由一两个热情的团队成员进行试验,而不会破坏项目的其余部分:Kotlin类导出一个看起来与常规Java代码相同的Java API。
- 因为Kotlin专注于可读语法,所以代码审查不是问题:它们仍然可以由不熟悉该语言的团队成员完成。
- 它以Java 6为目标,因此即使您的部署难以升级到较新的JVM,也可以使用它。
今年早些时候,我向一家大型保险公司Swiss Re的Java和.NET架构师团队介绍了Kotlin。我首先定义了一个带有几个字段的简单Java类、toString、equals、hashCode等。它大约有50行代码。当我们完成将其转换为Kotlin(主要是自动)时,它只缩小到一行代码。然后我演示了其他节省时间的功能。他们很热情,并认为它是C#的潜在强大竞争对手。
我认为Kotlin是企业Java开发人员的最佳选择,所以即使Kotlin是免费的,我也希望JetBrains能够通过增加IDE商业版本的销量来扼杀它。这将激励他们根据客户的意愿不断改进。
与许多其他由不相关产品补贴的语言开发人员形成对比,这意味着当这些需求与预先存在的意识形态发生冲突时,他们几乎没有理由回应用户的需求。
特征
Kotlin因其专注于生态系统而在新的编程语言中脱颖而出:JetBrains明白生产力来自不仅仅来自于方便的语法。
尽管如此,Kotlin还是有许多有用的功能,可以让编写代码变得愉快:
- 我们已经提到了null安全性(可选性),它允许编译器系统地标记潜在的空指针去引用。与某些语言不同,这不涉及选项类型,因此是零开销。其他语言特征保证了它的不方便。
- 精益语法:类型推断无处不在,单行函数占用一行,简单的结构/ JavaBeans也可以在一行中声明。真正的属性在Java interop的幕后生成getFoo / setFoo方法。函数可以存在于类之外。
- 例外情况未经检查。
- 将数据注释添加到类会触发样板的自动生成,如equals、hashCode、toString、复制方法和变量传播支持(重构)。这为您提供了方便的不可变类,而无需构建器。
- 但是,如果您确实需要构建复杂的结构,那么语言功能的巧妙交叉会使构建器清晰且类型安全(读取:自动完成)。如果您使用Google协议缓冲区来存储结构化数据,那也会变得更容易。
- 功能编程支持零开销lambdas,能够在标准Java集合上进行映射、折叠等。Kotlin类型系统区分集合的可变和不可变视图。
- 扩展函数允许您在不修改源代码的情况下向类添加方法。这首先看起来像一个表面的语法糖(syntax sugar),以避免FooUtils样式类。然后你意识到以这种方式这样做可以让你通过自动完成轻松发现新方法,让你构建强大的语言扩展,并允许你将现有的Java API与其他Kotlin功能集成。特点如......
- 运算符重载。但好的一面:这里没有Scala / Perl风格的线条噪音。运算符映射到特殊方法名称,因此可以覆盖现有运算符的行为(包括函数调用),但不能定义全新的运算符。这在功率和可读性之间取得了平衡。
- Kotlin没有重新定义语言的宏或其他方法,但是一系列精心设计的功能允许像语言扩展一样的库比它们像对象集合一样。一个很好的例子:你想使用光纤、演员和Go风格的频道吗?您可以使用名为Quasar的库。
- Markdown而不是HTML文档的HTML。这使得编写JavaDocs更加愉快。“Dokka”工具(相当于JavaDoc)可以读取Kotlin和Java源代码,并生成组合的doc网站,这些网站既有自己的风格,也有标准的JavaDoc HTML风格。
- 更好的范型。如果你从来没有完全掌握super和extend在类型变量中的确切含义,不要担心:这不是您的问题。Java的泛型确实令人困惑,Kotlin解决了这个问题。
- 委派(转发方法)可以自动完成。
- ==运算符执行您实际期望的操作。
- 您想要快速方便的异步编程吗?当然,你会的。
- 字符串插值“就像$ {this.example}!”
- 函数参数可以是命名的、可选的和可变参数。
- 许多其他调整和改进。如果有人对Java感到恼火,我会给它50/50,它已经在Kotlin中修复了。
现在就试试!
像许多现代语言一样,Kotlin有办法通过您的网络浏览器进行试用。与其他语言不同,Kotlin的试用网站实际上是一个完整的IDE,具有快速自动完成、实时背景编译,甚至在线静态分析!
现在就试试
继续。我等你回来。
有什么收获?
注意:本文最初是在2015年7月编写的。到目前为止,由于JetBrains修复了各种问题,因此本节已经不准确了。我已将下面已解决的问题标记为粗体,但保留原样。
生活中没有任何东西是完美的,Kotlin也不是。以下是我在使用该语言时遇到的一些问题。
数据类特性是自动生成JavaBean样板的一种非常有用的方法,但它带来了严重的限制:这些类不能从任何东西继承,也不能继承。反过来,这使得“密封类”功能变得不那么有用,因为您不能拥有密封的数据类层次结构。JetBrains表示,当他们确切知道所涉及的行为应该是什么时,他们希望放松未来版本中数据类的限制。 (Kotlin 1.1:数据类可能继承自其他类)
还没有类型别名。因此,必须每次都冗余地写出函数类型。 (1.1添加类型别名)
IDE插件报异常的频率仍然会比它多。这些似乎永远不会破坏任何东西,因此与本机代码IDE中的崩溃相比,这是一个小麻烦。但“内部IDE错误”泡沫仍然可能是一种刺激。
默认情况下,类是最终的。如果您想要标准的Java行为,则必须将它们标记为“open”。一些依赖于字节码合成的Java框架假设类不是最终的,并且在遇到Kotlin代码时可能会失败或默默地做错事。这不是Kotlin的错,但我仍然需要通过调试来浪费大量的时间。随着Kotlin越来越普及,我希望这些框架能够得到改善。 (1.1为流行的框架添加了一些编译器插件,可以在适当的时候自动打开类)
Kotlin支持编译时函数内联。这使得在运行时使用像map / filter / reduce这样的高阶函数非常便宜,因此使用它很常见。内联还允许您在某些情况下解决JVM缺少reified泛型并执行非本地返回,例如从lambda内部退出函数。这些都是好事!但它们是有代价的:因为JVM不了解发生了什么,堆栈跟踪有时会搞砸。由于函数内联,IntelliJ试图“解扰”已经令人困惑的堆栈跟踪,但是遇到引用不存在的行号和其他奇怪怪异的异常堆栈仍然很常见。理想情况下,Kotlin不必这样做,因为JVM将具备所需的所有功能。但他们没有,所以,除非JVM学习如何处理由语言前端内联的函数,否则我们可能会坚持这一点。
Kotlin针对Java 6字节码,它没有使用Java 8中的一些改进。一个小问题是Kotlin标准库有时会复制Java 8标准库提供的内容。此外,编译器不使用“调用动态”字节码来减少lambdas生成的类文件的数量,因此与Java 8相比,使用大量非可内联lambda的Kotlin JAR可能会有点臃肿。修复此问题高高兴起JetBrain的议程,希望很快就会完成。
IntelliJ内部的编译是增量的,速度非常快(与Java一样快)。通过Gradle编译很慢,因为它根本不是增量的。如果可以,请避免通过Gradle进行编译。同样,这是他们要修复的事项列表中的高位。 (固定在1.1)
没有相应的宏或编译器插件,所以如果你喜欢来自Scala的宏或像Java的Checker Framework这样的东西,抱歉,你将不得不这样做。
其他需要考虑的问题:
- 社区很小。虽然优秀的Java互操作意味着您并不真正需要Kotlin库,但它们仍然很好用,目前并不多。
- FP纯粹主义者可能会觉得类型系统缺少Scala或Haskell中可以找到的一些更高级的功能。如果你是那种比普通人更关心这个的,Kotlin可能不适合你。funKTionale库将Haskell中已知的一些结构添加到语言中,如部分应用、函数局部套用、记忆等。
- 虽然它可以编译为JavaScript,但与Java后端相比,这种模式是实验性的,并且很多次/未完成。 (在1.1中完成)
- 没有标准的样式指南,在某些方面,Kotlin为您提供了几种可供选择的语法。由不同的人写的Kotlin可能看起来不同。这与Go形成对比,后者严格执行风格。 (现在有一个简单的约定文件)
- Kotlin有一个Eclipse插件,但它自然不如IntelliJ支持复杂。如果您的团队标准化IntelliJ,Kotlin将会发挥最佳作用。
- Kotlin比Java更挑剔。它不会自动将整数转换为long,等等,您需要明确指定要转换。这是因为该语言侧重于正确性,并试图解决著名的“Java Puzzlers”一书中的问题。JetBrains声称他们在网上找到了大约一半的内容。
- 因为Kotlin针对Java 6,所以它仅限于运行时具有的功能。虽然在许多领域它可以匹配或超过C#,但它缺乏像Java平台一样不属于价值类型的功能。
为什么要考虑JVM
最近我遇到过许多使用动态脚本语言(如JavaScript或Go)的初创公司。
当我在比特币空间工作时,使用动态语言尤其令人痛苦;这类工具缺乏类型安全性,已导致严重的货币损失。Go不易出错,但仍然因缺乏基本功能而受到严重影响,例如良好的调试器、快速GC、可靠的依赖关系管理和可靠的分析工具。
在过去15年左右的时间里,Java与冗长和过度工程密切相关。在很大程度上,这种声誉是应得的。Enterprise Java因类名为PathVariableMapMethodArgumentResolver的类而闻名。
最终,我被迫通过Android返回Java。原来事情发生了变化。虽然XML仍然比时尚所要求的更频繁地出现,但基础设施的能力已经变得非常令人印象深刻。IntelliJ比Eclipse更快、更直观。Maven虽然起初相当具有压倒性,但在另一个构建/依赖管理系统中,我常常希望拥有大量功能。Ninja和Play等较新的Web框架从Ruby on Rails等项目中学到了轻松。有大量的库,硬件变得更好,JVM效率也更高了。
没有真正改变的一件大事就是语言本身。编写Java仍然冗长且痛苦。
现在有了Kotlin,随之而来的是与Java生态系统相关的最后一次传统痛苦已经消失。您可以编写比脚本语言更具表现力和更简洁的代码,但可以减少错误并提高性能。您可以使用所有优秀的工具:只需尝试捆绑的VisualVM程序,即可体验这个生态系统中免费提供的内容,或者查看Chronon time - traveling调试器,看看如果您愿意支付一些钱,您可以获得什么。
如果你的JavaScript是你的东西,试试Kotlin的JS后端。或者,在Nashorn JS引擎中运行现有代码。
如果你喜欢JavaScript,试试Kotlin的JS后端。它为每个平台创建本地捆绑包,这意味着在Linux上,您可以获得完全独立且没有JRE依赖性的DEB或tarball。当然,一旦解压缩,它不是单个文件,但从部署角度来看,单个目录并不难。
简而言之:如果你以前忽略了JVM生态系统,是因为它终端不酷,你应该仔细研究下kotlin看看。