如果您想找点东西,请从最好的地方学习。 今天,Corutin和并发神Roma
elizarov Elizarov回答了我的问题。 您可能会想到,我们不仅讨论了Kotlin,还讨论了许多相关主题:
- Golang和goroutines;
- JavaScript及其在重大项目中的适用性;
- Java和Project Loom;
- 在Kotlin上进行奥林匹克竞赛编程;
- 如何正确学习编程;
- 和其他令人兴奋的事情。

Kotlin-做得好!
你好 首先,关于您自己的几句话。 您从事Kotlin已有很长时间了吗?
我在Kotlin拥有悠久的历史。 2010年,Kotlin最初是在JetBrains的一个项目,当时我当时不在那儿工作。 但是马克斯·沙菲罗夫(Max Shafirov,他当时在科特林(Kotlin)从事工作,是JetBrains内部这一运动的发起者之一)邀请我成为一名外部专家,并研究设计和评论。 最初,该语言旨在解决其问题,因为JetBrains具有自己的庞大Java代码基础,并且代码中不断存在可理解的问题,因此我想为自己编写语言,以便使我的代码更愉快,高效,出错更少。 只要进行现代化。 自然,这很快就变成了一个想法,因为我们遇到了这样的问题,这意味着其他人也遇到了这样的问题,并且需要其他人的确认,他们的做法是正确的。
我应邀作为专家来查看和比较正在发生的事情与需要的事情。 关于可空性-我坚持应该这样做,因为那时候对我来说很明显,如果您使用Java编写,则会遇到很多问题,但是可空性是您经常遇到的主要问题。
我没有参加团队的工作,只是定期浏览一下,参加了科特林杯(科特林杯)的比赛。 我一生都在竞争,但即使到那时我也没有积极参加。 例如,我不会像Facebook Hacker Cup那样进入决赛,其形式也不一样,因为我不再持续参加比赛。 我参加了科特林杯,由于它没有吸引广泛的观众,所以我很容易进入了决赛。
当时(2012-2013年),从调音的角度来看,科特林是一个可悲的景象,因为那里的一切都变慢了。 自那时以来,团队一直做得很好。 我是两年前加入团队的,当时是1.0版本发布之后,Google正式认可该语言之前。 作为一个团队,我承担了各种各样的异步和协程,因为事实证明我拥有正确的经验,我在DevExperts的各种不同的大型企业系统中工作了很多,并且存在很多异步和通信。 因此,我很好地想象了问题领域-需要解决的问题和伤害人们的问题。 这很好地满足了Kotlin的需求,因为它不仅伤害了我们。 它伤害了所有人。 甚至JVM都启动了Project Loom,这实际上暗示着它伤害了所有人。 我仍然处理Kotlin库,我们的主要重点是各种连接的应用程序和异步性。
也就是说,您主要从事的是库,而不是编译器,仅此而已?
不,我正在做编译器。 我与他们沟通,我们的图书馆团队预先准备好他们在编译器中所做的一切。 我们也是客户,遇到一些缺点时我们会创建许多功能需求,并且我们对所有推出的新产品的第一行进行测试。
事实证明,如果您进入YouTrack,按您进行过滤,就会发现很多有趣的东西。
是的,您可以找到很多各种各样的任务,因为我经常遇到一些问题。
您提到了Project Loom。 它是由制造Quasar的人制造的。 从侧面看,这很有趣,我只想写一篇关于哈布拉的关于织布机的文章。 你能告诉我一些关于他的事吗?
我看到一个演示文稿,想法很明确。 每个人都需要协程和异步编程。 例如,过去在JPoint上, 阿里巴巴的伙计们告诉他们如何入侵JVM并搞砸了热点,只是发布了一个他们甚至没有写过的补丁,但之前有一些家伙。 他们后来看见了自己。 很棒的报告。 我强烈推荐它。
您是否建议这样做?
因此有必要在企业中做。 规模超过一定规模的每个大型企业,当数千人开始为您(以及为更少的人)工作时,都维护您的OpenJDK hack。 当然,如果您有关键业务用例,那么为什么不自己动手做某事,我认为这没有什么大问题。 不是我推荐它,但我必须这样做。 如果HotSpot中没有轻量级线程,那该怎么办? 实际上,这表明人们需要成熟的东西。 而且我们收到的针对协程的反馈还说,是的,这是过期的,人们需要轻量级的流,人们需要轻量级的yuzkey货车。 应该以某种方式在JDK中支持它们的事实早就该出现了,从这个意义上说,毫无疑问,当Loom迟早投入生产时,就会有需求。 有人需要它。 有人甚至为了这个补丁而热点。
我看到了一个常见的问题-您有某种Web服务器,很多人都在敲它,并且它开始阻塞线程。
这是一个相当普遍的问题。 以及Web服务器,应用程序服务器和后端。 如果您查看阿里巴巴的同一演示文稿,为什么需要此内容,那么它们就没有Web服务器,它们具有经典的企业体系结构,它们具有在Java后端上编写的各种服务,这些服务正在承受负载。 我与DevExperts的合作方式相同:服务处于负载状态,您收到的请求毕竟是您没有处理的-在现代世界中,您已将所有内容连接在一起。 并且您不会自己处理此请求,而是会呼叫100500所有其他服务并等待它们响应。 如果这些服务很慢,那么您将有很多线程在等待。 您无法承受成千上万的等待流。 只是由于一些废话,您得到了以下信息:您使用的一项服务速度变慢,并且有许多线程处于等待状态。 现在,这是一个很大的问题。
人们大量迁移到Go的原因之一不是因为语言不错,而是因为开箱即用的轻量级流程,并且没有这样的问题:goroutine可以等待,而且不花任何钱。 在同一个阿里巴巴中,他们实施的解决方案通常比所有愚蠢的解决方案都愚蠢。 从它们为每个协程分配一个2 MB的大堆栈的意义上讲,它们不是很轻巧,可以入侵HotSpot,以便可以切换这些堆栈。 它们节省了物理流量,但不节省堆栈。 对于他们来说,该解决方案有效-顺便说一句,这很简单,据我所知,他们有一个HotSpot补丁,不是很大。 Loom的家伙开始了更全球化的事情。 他们决定不仅要节省物理流,还要节省堆栈,以免每个流花费2兆字节。 在原型中,当前堆栈经过HotSpot,然后被复制到一个小的臀部结构中。 他们可以将该物理堆栈重用于其他目的。
但是有一个狡猾的技巧:当您恢复性能时,他们不会复制所有内容,而是复制最顶层的内容。
是的,有很多黑客工具和优化工具。 最终产生的结果很难说。 因为在复制方法的示例中,立即出现以下问题:如何处理本机调用? 在本地调用中,您不再可以复制本地调用的堆栈。 阿里巴巴的做法没有这样的问题。 本机,而不是本机-有什么区别,您只是完全取消了该堆栈的操作,而是将其保留下来,拿起另一个堆栈,一切正常。 现在说它是否成功还为时过早,有时您可以使用此本机堆栈,有时则不能使用-在此阶段,还为时过早。 例如,如何在Go中实现它是完全不同的机制。 在执行gosh代码时,将使用小的gosh堆栈。 因此,当gosh运行时调用函数时,它将查看堆栈需要多少。 如果当前堆栈不足,则会重新分配-增加所选堆栈的大小。 因此,如果您进行本地调用,那么他们已经从某个池中获取了一些大型本地堆栈并使用了它。
还有天哪的代码吗?
没关系 如果您需要调用某些外部函数,它们只是可以切换到大型本机堆栈,尚不清楚为此需要多少堆栈。 而且,当您执行gosh代码时,您知道需要多少堆栈,因此我们可以在一个小的堆栈上执行它。 这是一种完全不同的方法。 不要复制,而是立即在一个小的堆栈上执行。 实际上,这两种方法之间的差别并不大,直到您偶尔入睡。
我们经常被问到一个问题:“什么更快? 什么合适? 您如何在协同程序中做到这一点?” 我们协程不会破解JVM。 我们的目标是在常规JVM下工作。 而且Android也可以使用。 有自己的ART,对协程一无所知。 因此,自然地,我们必须用笔生成字节,这与复制Loom所做的堆栈非常相似,只是我们以字节码进行。 我们已经晚了。 拿一叠,放松并复制到臀部。 我们不在为我们执行此操作的运行时中,我们已经生成了执行此操作的字节码。 它保留并恢复了协程的状态。 当然,由于我们不进行运行时,因此会有更多开销。 在运行时,您可以更快地完成所有操作。 另一方面,如果您使用协程进行异步编程,那么您就需要入睡,如果您要等待某个服务的响应,然后将请求发送到某个服务,则非常昂贵,以至于复制堆栈的全部开销根本不会困扰任何人-无论是慢还是快,都没有关系。 是的,如果您专门将其用于异步编程。 如原型机织机所示,在科特林的协程中,它的缩放比例显着。
另一个区别是,由于我们Kotlin不得不以字节码方式执行此操作,因此产生了非常有趣的副作用。 一方面,这似乎是不成功的,另一方面,相反。 它包含以下内容:无法对任意函数实施安乐死。 您需要可以入睡的函数,使用修饰符将标志挂起-明确指出该函数可能会暂停并等待更长的时间。 一方面,您不需要在Loom中使用它,因为运行时可以使任何东西进入睡眠状态。 阿里巴巴的解决方案是相同的-您可以从任何线程中获取堆栈。 或者在Go中-一切都可以锁定在那里,任何代码都可以入睡。 将gorutin塞进去。 一方面,这种方法与使用线程编程非常相似。 就像您以前一样在编程,只是现在线程称为光纤,并且变得非常便宜。 如果仔细看一看同一台织机的外观,结果发现纤维和线仍然是不同的东西。 如何确保用线程编写的旧代码完全缠绕在光纤上,这是不明显的,以及它们将成功使用的是什么,没人知道。 问题从那里开始:如何处理死锁,如何使用针对线程本地优化的代码,再次使用某些局部哈希或线程id进行性能优化。 Go遇到了同样的问题-当不公开硬件ID时,编写某种高性能算法变得不容易。
但是在科特林,这不是吗?
在Kotlin中,我们并不是要假装线程和光纤是同一回事。 我们甚至不尝试运行旧代码,原则上我们没有这样的任务。 我们说:“对不起,因为我们不是运行时,所以我们不能随意采用旧的Java代码并开始在此处进行切换。” 而且我们甚至不会尝试。 我们有不同的任务。 我们说我们有一种语言功能,可以入睡,可以用它们编写异步代码,这是该语言的新功能。 我们完全避免了这个问题(“如何运行旧代码”),我们说:“有一个新代码,好的,正统的,您可以让它沉睡。” 在某种程度上,这使生活变得更轻松,因为您不必自己或任何人腾飞,但是如果某些不知道会在纤维上发射的老govnokod突然在它们身上发射会发生什么。
在我们的模型中,我们没有任何旧代码,只有一个新的代码就可以开始使用,因为现在它在一个线程上,明天在另一个线程上,如果例如需要找出现在是哪个线程,它将知道它。 是的,您需要本地线程,但他可以识别它们。 但是,他必须为今天的线程本地人是一个,明天是其他线程这一事实做好准备。 如果他希望这些语言环境与他一起旅行,那么还有另一种机制,即协程环境,他可以在其中存储自己的东西,协程环境将与协程一起从一个线程到另一个线程。 从某种意义上讲,这使我们的生活更轻松,因为我们不是在尝试维护旧代码。
另一方面,我们让一个人明确地考虑他们的API,例如:在这里,我正在用协同程序在Kotlin中编写一个函数。 如果以前看过代码中的某种方法getget (尚不清楚),则该方法可以快速工作并立即返回,或者可以联机运行一个小时-我只能阅读文档并了解它的运行速度。 也许他现在工作很快,明天程序员Vasya Pupkin就会来使他现在上网。 使用Kotlin Coroutines,我们提供了带有suspend修饰符的语言保证机制。 当我自己与协程一起工作时,我会看一些功能,如果看不到suspend修饰符,则意味着它可以快速运行,并且可以在本地进行所有操作。 有一个suspend修饰符,这意味着该函数某种程度上是异步的,它将在网络上运行很长时间。 而且它有助于制作一个自我记录的API,以便我们可以立即看到等待我们的内容。 当我忘记了我长时间调用的代码中的某个地方和某个地方时,这有助于立即避免愚蠢的错误,而无需怀疑。
实际上,这非常好。 这需要明确标记这些即将入睡的功能。 例如,在Go中不是,我不必在那里标记任何内容。 事实证明,我们实现的这种副作用(应使用suspend修饰符标记)可以帮助您正确构建体系结构,帮助您控制在最初希望一切会很快发生的地方不会引起一些随机的,冗长的异步游戏。
但是有些事情很难禁止,例如某种网络IO文件。
不,网络IO很容易禁止。 这是文件IO-非常复杂。 但是,这又是一个棘手的问题:对于大多数应用程序来说,文件IO是一件快速的事情,因此同步工作是完全正常的。 一个非常罕见的应用程序对IO的工作量很大,以至于要花很长时间才能成为一个问题。 在这里,我们给一个人选择的机会:您可以直接与我们一起制作IO文件,而无需洗个澡,因为它会阻止正在发生的事情(因为通常速度很快)。 但是,如果您的特殊情况需要进行很长的计算,这不是异步的,但是会占用大量CPU时间,并且您不想阻塞其他线程池,我们提供了一种简单易懂的机制:您可以单独启动线程池进行大量计算,而不是编写一个有趣的常规函数computeSomething() ,而是在文档中写明“伙计,仔细地讲,此函数可以工作很长时间,因此请注意 -不要在任何地方使用它,不要使用UI”,我们提供了一种更简单的方法 可汗主义。 您可以简单地将此函数编写为suspend funcomputeSomething() ,并为其实现使用一个特殊的库函数withContext ,该函数将计算结果扔到您指定的特殊线程池中。 这非常方便:用户不再需要腾飞大脑:他立即看到挂起状态,知道此调用不会阻塞线程,并且可以很容易地从UI流中调用它,依此类推。
它将切换到已经在内部的所需流,并且其流将不会被阻止。 这是正确的关注点分离:用户不在乎如何实现它,但是实现者可以正确地转移到需要它的池中,并在他的应用程序中正确分配计算资源。 实际上,就编程风格而言,这被证明非常方便。 我们需要编写更少的文档,编译器将检查并更正更多内容。
我认为它有多安全。 有人可以破坏线程池或破坏他人的数据吗?
自然,一切皆有可能。 很难防止弯曲的手。 显然,无论我们在编译器中编写各种类型的系统和进行检查的数量多少,总会被破坏。 问题是编译器应该帮助编写正确的代码。 不幸的是,禁止错误代码的梦想是乌托邦式的。 我们明确不包含该语言的任何功能。 如果Kotlin知道它们主要用于其他目的,并且附带的代码大多不好,则Kotlin中没有Java东西。 但是Kotlin中的任何出色功能都可以通过多种不同方式用于其他目的。 不幸的是,没有选择。 语言可以通过多种不同方式滥用。 您无法保护自己免受弯曲的手的伤害。
我从Kotlin学生那里学到了一个有趣的问题。 他们放弃了,并说您非常狡猾,可以灵活地回避他们的问题。
有什么问题?
例如,一个问题在两个人中幸存下来:为什么在Kotlin中没有原始类型? 没有泛型。
因为您总是可以写一个星号。
它将与Java兼容吗?
是的
也就是说,您有某种Java方法,它需要一些没有泛型的方法。 以清单为例。
如果有这样的java方法没有泛型,则可以在那里传递任何List。 您可以使用星号传输列表,也可以使用字符串传输列表。 Kotlin将允许您将任何游戏转移到Java方法。 raw List, platform type, , , List . raw type, , Java , . Java, , , , , , raw type. , — , . , — . — , , raw types. , migration story.
platform type ?
flexible. nullable-. , String. , String nullable String — . , String — nullable -nullable. Kotlin , , . String, nullable String. , - Java, .
?
, , , , . Flexible , dynamic. Flexible — , Java, String, nullable String, int.
- - , .
, , . . read only mutable. List MutableList. Java List, , Java- , , - List MutableList. , Java. , Java - , . , , . , , , List, , , MutableList, List . List, String, .
- , ? - ?
, . , . It just works. Java . nullability- , , nullable . , . , , , . , , , , - . , -. - JavaFx, - , JavaFx Java, , . , - , . . , , .
, .
当然可以 , . Kotlin Native. : , seamless C- , , - .
, Native ?
, , Kotlin JavaScript, - - . «Write once, run anywhere», , . : , Common Kotlin Portable Kotlin, , . , - - , , . , , - . , .
JVM , Java, JS , JS, Native . , , , , . - JS, . -. - : double, String. JVM- 0 «0.0», JS . . JS , , — ? , . , , JS- . , -. , . - — , , — . , , , , JVM, JS, Native — , , - . .
?
是的 , , .
, …
, . , . Loom . - JVM. , .
, , Java?
, . . — . , . , - . , for ( i in 0..10 ) , for (int i = first . , , . . , .
- ?
, … , . . JVM JS.
Node.js?
! . , JS-. , , JS- . , . , - — , JS-, - — . , . .
« ». , ?
当然可以 , , . JVM , Java, . JVM . legacy, enterprise, . , , . , JVM. , — , . , . , — JVM « ». . API , . , . , . , , . , , .
TechTrain « ?» 。 . , .
JS , Kotlin Java?
Java . «Kotlin in Action», , Java-. , Java- , , Kotlin-. , «by design». , Java- . . JPoint , Kotlin . , . , 60-70% Java. Java, , - . Java .
- — , , -. as-is. , , . Kotlin , , «», «». , «» — . while — . 100500 . 但是为什么呢? , Java-. - , « Kotlin», , .
, . . , , . , .
, -, ?
, . . Java- . Android- — , . . , . — .
- , ?
, . , , . , , . — , , . Kotlin . , . - , , , . : , . C++, Java, Python. . Java - , Java, . , , puiblic static void main… -, . Java, , . ?
Kotlin : , , Python, . C++ , C++ . , , . , . , , . Kotlin — . — Python. . . , . , . . — , , , , — . , .
, — ?
, . must have. , — . . , . — . , , , .
?
… , , . . JS- — . — . JS, , . - JS, type checkers, Flow TypeScript. - JS . Python. - DSL, . Django , . , . , , , . . Django, , CRUD-. , - — . -, - , , . . . Kotlin, , Java, . core belief Kotlin, .
, - , Kotlin ?
当然可以! , , - CRUD-. : , , — , . -, — , . , TypeScript Flow — JS.
Kotlin , Kotlin JS TypeScript , . TS Kotlin/JS, , TS , JS-, . Kotlin/JS , . , .
, — double…
, . , , .
- .
.
?
我举办奥林匹克竞赛:-)我自己参加,但很少参加。
我只是看到在奥林匹克运动会上,有时Java是主要语言之一。
现在,它几乎总是可用。 她出现在十五年前。 Java和C ++是两种标准语言,它们都可以支持,然后根据竞争情况进行变化。
用Java赢得胜利更难,是否有任何隐藏的开销?
这取决于竞争。 在正常竞争中,如果想法和正确算法中还有更多任务,则是相同的。 但是,当任务涉及非渐近优化时,有一种游戏需要您对所有细节进行优化-当然,在Java中这很困难,您将不得不尝试很多。 另外,测试交付时间非常短。 粗略地说,如果您将运行时间限制在几秒钟内,则HotSpot会在一秒钟内预热到一个小的代码,并且不在乎。 而且,如果您对所有内容都有限制(一秒钟),那么在Java中,您可能会因为HotSpot进行预热和编译而损失一秒钟。
是的,在Java很难的激烈竞争中。 但是正常的比赛(受欢迎的比赛,有好人支持)-他们试图以Java和加号具有平等机会的方式来完成任务和环境。 原因很明确:尽管Java在教育方面没有增长,但在任何地方它的使用量都没有减少。 在某个地方,一些大学拒绝学习Java并改用Python-正因为如此,现在许多比赛都学习了Python。 这是一种如此稳定的第三语言。 比赛主要是学生。 有专业比赛,大公司正在做类似Facebook Hacker Cup的比赛,每个人都可以参加,但体育节目的主要主题仍然是学校和学生。 在学校和学生时代,人们会不断表演和训练。 但是毕业后,上班后-很少有人会继续参加。 因此,语言的选择取决于教育中使用的语言。 如果他们教加号,Java和python,那么他们将参加比赛。 对于许多程序员而言,Java分别是第一语言,所有竞争都试图支持Java。 为了竞争而学习C ++-游戏。 它是针对系统编程,低级编程的,您不需要一百万个C ++程序员,这毫无意义。
您如何将Kotlin添加到标准语言列表中?
好吧,实际上,我们正在积极推广这一想法。 ICPC每年举行一次,吸引了全球成千上万的参与者,有一百多支队伍进入了决赛。 在ICPC中,支持Kotlin。 现在有一种语言列表:C / C ++,Java,Python和Kotlin。 但是,由于这个问题的原因,现在当然还没有人真正写过它:很早就渗透到教育中了。 在学生比赛中,使用那些教给学生的语言。
Kotlin已经在某个地方教过吗?
确切地教过的地方。 例如,在圣彼得堡理工学院。 但是我们还处于起步阶段,处于此过程的“第0步”。
有没有致命的缺陷?
不,科特林比其他语言在基础教育方面更好。 公正的教育是保守的。 人们有一个现成的程序,教科书。 没有人喜欢改变。 为什么在学生的第一年里教授编程的教授为什么会改变他的语言,这有什么好处呢? 可能每十年审查一次。
例如,红利是离开它的人将更适应现实。
不行 因为首先学习哪种语言并不重要。 一个职业程序员一生中已经学习了十二种语言,并积极使用大约三种语言。 另外,所有这些都在不断变化。 首先教您编程的知识并不重要。 大学毕业时要有多少种语言很重要-这是另一个主题,这很重要。 在这里,我们面临着以权威为中心的保守市场问题。 例如,在中国,与那里的人交谈后,一个问题得以澄清。 您问任何有很多程序员的大型办公室,为什么-不使用Kotlin? 但是因为现在,这些家伙没有在大学里教科特林,他们不想学习任何新知识,但是为什么要这样做呢?
我们不是吗?
无处不在,只是规模不同。 以不同的文化以不同的方式。 正如大师所说或老师所说,在某些文化中您会这样做。 人们在某个地方更加独立,更容易进行实验和创新。 人们会去某个地方自己学习一切。 在某个地方,他们不会伸出手指,并且会完全按照所教的去做。 俄罗斯有更多Kotlin实施方案,但这也是因为我们最初来自这里,在会议上等等。
这是在我们这一代,程序员一直是发烧友。 当我喜欢编程时,我长大了,他们自己学习了一切,因为什么都没有。 现在,这是正在教授的大众事物。 以现代程序员为例,大多数这样做不是因为他喜欢,而是因为他们教了他这一点,现在他们付出了很多钱。 因此,这些人不会研究刚刚发布的技术。 他们为什么需要它?
因为您可以使用这项技术的出色功能来赚很多钱。
当然不是! 在Kotlin,您更有可能获得更多的乐趣。
有一些特定的东西确实具有商业价值-我们讨论了正面和背面之间的重用...
并非每个人都需要它。 另一方面,乐趣也是如此。 并非所有人都喜欢工作。 他们付了钱-他们工作,不管他们喜欢与否,对他们都没有影响。 工作日结束了-他们关闭并忘记了它,然后开始做其他事情。
这虽然不是很可怕,但还是很沉闷。
不幸的是,这是生活的真相。 不管她多么可怕。 当然,这些人不在乎。 Kotlin,而不是Kotlin。
据我了解,只有很多人在JetBrains工作,因为他们喜欢工作。
当然,JetBrains在这方面是一个非代表性的示例。 特别有动机的人,他们真的很喜欢这个东西。
我们的时间正在慢慢结束,所以问题是:您能否将某些东西传递给哈布雷的读者? 有什么离别的话,有些启示吗?
我可以传达热烈的问候:-)但是我不会说任何启示,可以是什么样的启示? 从我们的谈话中可以得出的唯一结论是,喜欢工作的人是快乐的。 我读了一些关于用Java编程的好人的博客,这些博客工作并不愉快。 然后出于某种原因,他们变得好奇,生活造就了他们,他们尝试了Kotlin,并意外地发现自己可以享受工作。 你可以爱你所做的事。 您可能喜欢的编程语言。 而不是不加情感地将其用作工具。 当然,语言是一种工具,但是您可以间接地与它联系,或者您可以喜欢它。 这是一种不同的态度,包括对工作创造的不同态度。
Kotlin的很多人都拥有与爱情可比的温暖感觉,这恰恰是因为Kotlin擅长编程,尤其是在Java之后。 也许不仅仅是Java之后。 可能没有任何一种语言对它如此好 (只是一个字)进行编程。 有功能更多的语言,功能更强大的语言,类型系统更严格的语言,所有事物都是纯净的语言,反之亦然-不安全。 无论从哪个角度看,在此属性中,您都会发现比Kotlin更好的语言。 但是Kotlin如此平衡,以至于在今年的民意调查中 ,他在StackOverflow上名列最受欢迎的语言第二名并非偶然。 第一个似乎是Rust。 但是Rust不是我们的竞争对手,因为Rust是一种系统编程语言。 我们不会进入这个利基市场。 Rust在这方面超过Kotlin一点也不令人讨厌。 我们努力使Kotlin成为应用程序编程的主要语言,在其中可以轻松解决应用程序问题。 我们没有并且永远不会拥有Rust的某些功能,因为应用程序程序员根本不需要它们。 他不应该手动管理内存或考虑所有权的复杂性,应用程序程序员必须解决业务问题。 他必须将自己的领域转换为代码。 并且这应该是最直接的转换,而不会干扰任何因素。 我们正在努力消除这些干扰因素。 这样您就可以尽可能直接地将您的业务任务转换,而无需花很多水和额外的代码就可以解决。
好吧,这在某种程度上是不公平的竞争-所有这些语言(例如Java)都是在多年前发明的,而您刚刚知道。
自然,科特林考虑了其前任的经验。 像任何现代语言一样。 这是进步-在创建新的东西时要考虑到旧的缺点。 有充分的理由,在Kotlin中创建了可为空的类型。 好吧,走远,走到任何企业,去任何大型办公室,查看其崩溃日志,您将看到最常见的异常是NullPointerException。 这是一个众所周知的事实,如果您要制作新的语言,则需要解决它。 因此,我们在语言中非常注意可为空性。 依此类推。 如果您不以抽象的方式设计语言,而不是作为学术活动来设计,而是尝试解决他们经常遇到的人的问题,那么该语言就会证明是不错的。 他为什么被爱? 因为他解决了他们的问题。