当前位置: 首页 > 科技观察

为什么Kotlin是我的下一门语言

时间:2023-03-12 16:37:07 科技观察

Kotlin是JetBrains的一种新编程语言,JetBrains是世界上最好的IDE背后的公司。经过一段时间的研究,我决定将它作为未来5到10年的编程语言。我非常喜欢Kotlin,它一定会是一个成功的项目。有人看到我在我的开源项目中使用这门语言,让我说点什么,所以在这篇文章中我会谈谈为什么我认为Kotlin更好。接下来我也会说一下如果你现在开始使用这门语言会遇到的问题。最后我会告诉你,Kotlin需要一个JVM,你需要考虑一下(因为你可能正在使用Go或Node),但我认为这不是问题。请注意,Kotlin仍处于测试阶段:1.0正式版预计将于2015年底发布,它将提供稳定的语言特性和标准库。科特林有什么好处?这篇文章乍一看可能有点奇怪:通常,提倡一种编程语言的文章都是从列出新语言的很酷的特性开始的。但事实并非如此,这个我们以后再说。先了解其他方面,因为对于开发者评价编程语言,2013年的一份研究报告显示,编程语言的特性相对不如语言的生态重要,这也和我的经验相符。因此,这是我们首先需要介绍的内容:Kotlin编译为JVM字节码或JavaScript。它不需要编写新的编程语言内核。Java开发者肯定会对这门语言感兴趣,但也值得关注所有其他具有垃圾回收机制的语言的开发者,包括Scala、Go、Python、Ruby和JavaScript。Kotlin来自工业界,而不是学术界。它解决了当前编程所面临的实际问题。例如,类型系统可以避免空指针异常的问题。使用Kotlin无需任何费用!它是开源的,但这不是我要说的,我是说它有一个高质量的Java到Kotlin的转换工具,并且非常注重Java二进制兼容性。您可以转换整个Java项目,一次只能转换一个文件。即使是具有数百万行的复杂程序。这就是我使用Kotlin并希望所有开发人员都使用它的原因。如上所示,Kotlin程序可以使用现有的Java框架和库,甚至可以使用高级框架进行注解处理。互操作性是无缝的,不需要包装器和适配层。它可以集成Maven、Gradle或其他编译系统。它易于上手,只需阅读参考手册即可在几个小时内学会。语法简洁直观。Kotlin有点像Scala,但更简单。语言平衡了简洁性和可读性。它不强制执行像函数式编程和面向对象风格这样的编程哲学。它没有运行时开销,标准库小巧紧凑,主要由对Java标准库的扩展组成。大量使用内联编译时间的功能结构,如map/filter/reduce管道。结合Anko和Kovenant等框架,轻量级资源意味着Kotlin开始在Android开发人员中流行起来。如果您正在进行Android开发,您将很快获得良好的工作单元。您可以阅读Square的开发人员撰写的报告,分享他们使用Kotlin和Android的经验,Kotlin代码就像Java。完全支持调试、单元测试、分析等。除了Android,我觉得Kotlin特别适合处理商业Java业务。如果你整天在大公司面对庞大的Java代码库,那么你应该开始研究Kotlin:Kotlin有知名公司提供的强大商业支持。JetBrains承诺:拥有一支庞大、高效、优秀的Kotlin开发团队,拥有稳定的Kotlin商业模式,甚至正在将其部分旗舰产品转为使用Kotlin。所以Kotlin不太可能很快被抛弃。采用Kotlin是低风险的:在您的代码库的一小部分进行尝试,与一两个热情的团队成员一起,而不会影响项目的其余部分。Kotlin类可以导入JavaAPI,使其看起来像普通的Java代码。由于Kotlin注重句法可读性,因此代码审查很容易:即使不熟悉Kotlin语言的团队成员也可以完成。Kotlin以Java6为目标,因此即使您在部署新版本的JVM时遇到困难,您仍然可以使用Kotlin。今年早些时候,我向一家大型保险公司SwissRe的Java和.NET架构团队演示了Kotlin。我首先在Java中定义了一个类,这个类有一些字段,以及toString、equals、hassCode等方法。这需要大约50行代码。当我将它转换为Kotlin(基本上是自动完成的)时,该类缩小到只有一行代码。然后我演示了其他可以节省键入代码时间的功能。他们都很高兴看到这一点,并将Kotlin视为他们项目的潜在竞争者。我认为Kotlin为商业Java开发提供了一个合适的时机,所以虽然Kotlin可以免费使用,但我预计JetBrains会随着商业IDE销量的增加而发财。客户持续改进产品的意愿。相比之下,那些从与现有IDE无关的产品中获得资金的其他语言开发人员,他们很少有先入为主的想法,因为用户的需求和他们自己的产品不一样,因此进行相应的调整。特点Kotlin从新兴编程语言的海洋中脱颖而出,因为它专注于生态系统:JetBrains明白生产力不仅仅来自更方??便的语法。尽管如此,Kotlin还是有很多有用的特性,让编写代码的人觉得有趣:我们已经提到了空指针安全(这是一个可选特性),它允许编译器系统地让空指针标志无效。与某些语言不同,这不涉及可选类型,因此是零开销。其他语言功能确保不会带来不便。精简语法:类型推断可以在任何地方工作,单行方法可以在一行中声明,简单结构或JavaBeans也可以在一行中声明。真实属性在Java互操作的幕后生成getFoo/setFoo方法。函数可以存在于类之外。异常是未经检查的。向类添加数据注释会触发样板文件的自动生成,例如equals、hashCode、toString、复制方法和对可变扩展的支持。您可以方便地拥有不带构造函数的不可变类。而且,如果您确实需要构建复杂的结构,可以使用语言功能的巧妙组合,使构建器简洁且类型安全(自动读取)。如果你使用GoogleProtocolBuffers来存储结构化数据,它会更加容器化。对函数式编程的支持使用零开销lambda以及映射和折叠Java集合的能力。Kotlin的类型系统区分集合的可变视图和不可变视图。扩展函数允许您向类添加方法而无需修改它们的源代码。这乍一看像是避免FooUtils样式类的语法糖。稍后你会发现这样做可以让你通过自动完成轻松发现新方法,让你构建强大的语言扩展,并让你将现有的JavaAPI与Kotlin功能集成。这些功能具有...运算符重载。这个非常好:这里不再有Scala/Perl风格的行混搭。运算符被映射到特定的方法名称,以便可以覆盖现有运算符的行为(包括函数调用),但您不能定义一个全新的运算符。这在功能和可读性之间取得了平衡。Kotlin没有宏或其他方法来重新定义语言,但有精心设计的功能,使这些库的行为更像是语言扩展,而不是对象集合。您想使用纤程、演员和Go风格的频道吗?名为Quasar的图书馆为您介绍了这一点。在API文档中使用Markdown而不是HTML。这使得编写JavaDoc变得更加愉快。更好的仿制药。如果在放入类型变量时从未完全考虑过超类和扩展的含义,请不要担心:这不是您的问题。Java的泛型确实有点乱。Kotlin解决了这个问题。调度(转发方法)是自动的。==运算符完全按照您的实际期望进行操作。你喜欢异步编程的速度和便利吗?你当然会。字符串插值“像${this.example}一样工作!”函数参数可以是命名的、可选的和可变的。许多其他的调整和改进。如果说Java有一些让你烦恼的地方,我觉得Kotlin中不会有一半。立即尝试!与许多现代编程语言一样,Kotlin可以通过浏览器进行实验性使用。但与其他语言不同的是,Kotlin的实验网站向您展示了一个功能齐全的IDE,包括快速响应的自动完成、实时后台编译,甚至在线静态分析!快来试试吧。继续尝试。然后回来,我们继续。有什么问题吗?生活中没有什么是完美的,Kotlin也不是。以下是我在试用这种编程语言时遇到的一些问题。最大的问题是不成熟。Kotlin是pre-1.0语言。这意味着:语言本身、ABI和标准库随每个版本而变化。好消息是这些更改往往相对较小,而且Intellij经常可以为您升级代码。所以它并不像听起来那么痛苦。Java-to-Kotlin转换器(J2K)尚未开发。它有时会混淆格式并静默删除Java8lambda表达式(2015年10月修改:M13转换器现在可以正确处理Java8功能)。它生成的代码并不总是最好的编写方式。但JetBrains正在为这个工具投入大量精力,它已经是我用过的同类产品中最好的了。所以我对此并不太担心:它会很快变得越来越好。您将遇到编译器错误。我的程序并不大,但我经常遇到应该编译但没有编译的代码,或者(更糟的是)代码编译成错误的东西。诊断这些问题并不难,但会给我们带来糟糕的体验。您将遇到内部IDE错误。发生这种情况时,您会看到一个气泡,其中包含向JetBrains报告的选项。IDE不会关闭,而且大多数错误似乎问题不大。但无论如何,这很烦人。文档有时会提到未实现的功能(编辑:在M14版本中我相信这不再是问题)。现在JetBrains专注于打磨1.0版本而不是添加新功能,我希望这些问题已经得到解决。我遇到的第二大问题是它有时与Java的交互有限。一个典型的错误是Java的类型系统不能保证您不会更改映射中键的类型。通常,如果您这样做会导致编译错误,例如,删除具有错误类型键的元素。但是当JDK集合使用了泛型,一些重要方法的参数是Object时,编译器就不会报错了。在Intellij中编写Java代码时,此类情况会被标记为黄色静态分析警告,但到目前为止,Kotlin编辑器没有此功能(有时)。因为Kotlin没有定义自己的任何集合库,所以这会导致一些类型安全问题,我已经遇到过好几次了。另一个例子是在调用或使用Java代码时,Kotlin的null-safety特性被禁用(可以使用注解来弥补)。因为作为一个Kotlin初学者,你可能写了很多调用Java类库的代码,但是这个特性并没有你希望的那么好用。这只有在Kotlin的采用率增长时才能得到改善。JetBrains已经在尝试解决与Java交互时nullsafetyfeatures的问题:他们的想法很好,但他们有时找不到问题所在。他们想这样做是为了修复与Java交互的空安全特性。(修改:在M13中他们使用了Java的@NotNull注解来解决)另一方面,这也让你可以更流畅的使用JavaAPI,我觉得这个折衷是值得的。但它需要一些注意。其他需要考虑的问题:社区相对较小。虽然与Java的出色互操作性意味着您实际上并不需要Kotlin库,但总比没有好,但目前此类库并不多。如果你更喜欢通过阅读来学习,你将不得不等到今年晚些时候曼宁出版一本。在此之前,没有任何网站或任何东西。顽固的函数式编程(FP)爱好者可能会觉得类型系统缺少Scala或Haskell中的一些高级功能。如果您更关心类型系统,那么Kotlin可能不适合您。虽然可以向下编译为JavaScript,但这种模式似乎没有JVM后端好用,你可能会遇到更多问题。需要说明的是我没有使用经验,这只是浏览我在论坛留下的印象(修改:为了更快的推出Kotlin1.0版本,JS后台已经是非优先,JetBrains会继续在JVM上稳定后执行此工作)。没有标准的风格指南,有时Kotlin会提供多种语法供您选择。不同程序员编写的Kotlin代码可能看起来不同。这是针对Go语言的强制风格。(修改:M14中去除了一些语法灵活性,因此运算符必须明确标记它。)Kotlin编译速度比Java稍慢,Intellij编辑器更慢。但不是认真的,两者都比Scala快。有一个用于Kotlin的Eclipse插件,但它自然不如Intellij支持的复杂。当您的团队要求Intellij开发时,Kotlin最有效。Kotlin比Java更挑剔。它不会自动将整数转换为长整数,您必须显式地显式转换它们。那是因为该语言更加强调正确性,并试图修复“JavaPuzzled”一书中发现的一些著名问题。JetBrains声称他们修复了其中的一半。由于Kotlin基于Java6,因此它仅包含该运行时具有的功能。虽然它可以在许多领域赶上或超越C#,但它缺少Java平台尚未包含的类似值类型的功能。为什么你真的需要对JVM做一些思考最近我遇到了很多使用动态脚本语言(如JavaScript、Go)的初创公司。当我在研究比特币时,使用动态语言真的很痛苦。这些工具中缺乏安全类型导致了巨大的金钱损失。Go不太容易出错,但在基本的东西上体验仍然很差,比如缺乏好的调试工具、快速的GC、健壮的管理器和可靠的分析工具。在过去的15年或更长的时间里,Java逐渐受到喜爱和过度使用——这在很大程度上归功于它的声誉。企业Java类的名称与PathVariableMapMethodArgumentResolver一样长。很长一段时间,我都没有考虑过JVM,我敢肯定这个环境不是为我设计的。最后我不得不转向Java,因为我想在Android上工作。原来它已经改变了。虽然根据趋势,XML的使用频率仍然比我们预期的要高,但基础设施的功能已经非常令人印象深刻。IntelliJ比Eclipse更快、更直观。Maven,尽管一开始让人不知所措,但事实证明它具有我想要的其他构建/依赖管理系统中的许多功能。Ninja和Play等较新的Web框架从RubyonRails等项目中学习了敏捷方法。还有大量的图书馆。硬件变得更好,JVM也变得更有效率。等等等等。没有真正改变的更大的事情之一是语言本身。Java代码仍然很长,编写起来痛苦且乏味。现在有了Kotlin,传统上与??Java生态系统相关的最后一个痛点已成为过去。您可以编写比脚本语言更具表现力甚至更简洁的代码,同时错误更少,性能更好。您可以使用所有这些出色的工具:只需试用捆绑的VisualVM程序即可体验生态系统中的免费试用功能,或者如果您愿意花一些钱,请访问ChrononTimeTravelDebugger网站看看有什么你可以得到。如果你喜欢JavaScript,试试Kotlin的后端JS。或者在NashornJS引擎中运行您现有的代码。最后,如果您喜欢GO语言,因为它会生成独立程序,请查看javapackager工具。Kotlin为每个平台本地创建包,这意味着DEB(linux安装包)或tarball可以在linux上独立获得,而无需依赖JRE。当然,从部署的角度来说,拆解后不是单个文件,而是一个不难操作的单个目录。简而言之:如果你之前因为JVM冷门而忽略了它,你可以再看看Kotlin或者掌握它。