因为一款IDE爱上一门微软语言门户是一种什么体验

为什么国外本科学的第一门编程语言通常是Python或者JAVA,而我国大部分是C? - 知乎457被浏览<strong class="NumberBoard-itemValue" title="9分享邀请回答4110 条评论分享收藏感谢收起162 条评论分享收藏感谢收起为什么推荐你用 Kotlin语言?
时间: 19:51:15
&&&& 阅读:45
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&&
谷歌大牛说:为什么 Kotlin 比你们用的那些垃圾语言都好
原标题:谷歌大牛说:为什么 Kotlin 比你们用的那些垃圾语言都好
编译:伯乐在线/黄小非
【伯乐在线/程序员的那些事 导读】:5月18日,安卓团队在谷歌 I/O 2017 大会上宣布 Kotlin 成为官方头等支持语言。这条爆炸性资讯在当天就是 Hacker News 首页热门讨论。就在同一天,谷歌技术大牛 Steve Yegge 也发了一篇关于 Kotlin 的使用体会总结文章,同样也在首页热门,并引发 200+ 讨论。
(Steve Yegge )
为什么说 Kotlin 比你们用的那些垃圾语言都好
?? 哈,这个标题党的题目让你点进来看了吧。不要奇怪,现在标题党在网上很普遍的。而且这篇文章给出的回答,肯定能震撼到你。
说真的,其实我不想去攻击你们的语言信仰……至少不会“大大地”想。毕竟你喜欢的语言大放异彩的时期,可能要追溯到冰川时代了,对不?如果你喜欢的语言到今天还没有死,那只能说明这门语言在逐渐地改进和更新,保持与时俱进。
但改进的速度呢?好吧……假设你现在用的语言碰巧是 Java,并且你也沉溺于 Java 曾经是一门非常优秀的语言的想法,那么你就完蛋了。而且是早就完蛋了。尽管人类都不太喜欢思考终极命运问题,但是相比于在 20 多年前刚刚问世,Java 8 仅仅是做了部分语言特性的替换,对此你禁不住要想:“我真的要和这种语言来共度过的余生么?还是说 Java 也就只能这样了?”
因为终于要开始做 Android 开发了,我把各种老旧的语言问题又过了一遍。我写过一个老游戏 Wyvern,这个游戏已经有一个 iOS 版本了,最近我决定再搞一个 Android 版本。我从来没料到计算机语言会折腾到让我“思考人生”(例如“我这是他娘的在浪费生命么?”)如果你写过 Android 程序的话,你就知道在 Android 领域,语言的问题是会让你相当难熬的。
我第一次尝试写 Android 程序是在去年夏天,我的个老天爷,那感觉简直糟透了。其实是有人警告过我的。他们都说:“那些 API 可是很难搞啊。”而我却不听劝。一意孤行。
我想:这些玩意儿能糟糕到哪儿去呢?反正不就是 Java 么?
历史代码的灾难
真是很不走运——因为很复杂的历史原因,并且也没人在意——造成 Android 的核心 API 实在是糟糕透顶。我是说:真的很糟,真的很糟,真的很糟。你只能关掉参考书,深呼吸,然后出去猛喝咖啡来压压惊。人们之前给我的告诫看来是完全正确的。
Android API 库就是一个百宝箱。很多 API 真的是非常好用。我可以说,很多在 iOS 开发里非常难搞的事情在 Android 里面却很容易。Product flavors、Downloads 服务、findViewById() 方法、Preferences activity 等等,这些都是很好的例子。有太多 Android 里面有的东西在 iOS 里面是诶有的,所以在 iOS 里面你总能看到:开发者自己实现的恶心的和优雅的应用库并存。
但是!注意左边是一个大写加粗的但是!在写 Android 程序的时候,人们只关注那些不好的 API,就像你开车时候只会数路上遇到了几个红灯一样,绿灯的数量是没人关心的。因为人们只会通过红灯的数量来评价路途是否通顺。
Android 确实有几个很糟糕的“红灯”API。例如 Fragments,这就是在 Andoird “红灯” API 中的招牌 API。这个 API 的整个生命周期的糟糕程度达到了令人发指的地步,好吧其实 Activities 和 Fragments 都是如此。说句不中听的,iOS 反而却没有这么糟糕的API。去年夏天我试了试这些API,它们是如此之糟糕以至于我当时就放弃了。我算是彻底服了。去它的,我还是以后找个人来帮我写这些程序吧。
接下来的一年半,我就没再碰过 Android 编程。
来自俄罗斯的救星
我一直听说,有一种新语言叫做 Kotlin,可以用来写基于 JVM 或者 Android 程序。发明这种语言的不是别国,正是战斗的民族俄罗斯。更具体一点儿,它是由 JetBrains 开发。JetBrains 可是世界知名的 IDE 开发商,代表作是 Intellij IDEA,还有他们那可爱而且大名鼎鼎的橘色,绿色,紫色和黑色混合的暗色“Darcula”主题。
图:一个千年老妖按捺不住对 Java 8 的兴奋
那么为什么要给这种语言起名叫 Kotlin 呢?好吧,有一种说法是因为 Java 的第一个字母是“J”,而 Kotlin 则用了Java 的下一个字母“K”作为开头。除此之外,有人还猜想(这种猜想可能来自加州大学伯克利分校),“Kotlin”这个名字的灵感还来源于“克里姆林宫”,“赫鲁晓夫”以及“克格勃”。这些都是前苏联的骄傲,所以他们就用了一个前苏联军事基地的名字“Kotlin”来命名这种语言。总之这个名字不错,而且你会习惯它的。
伯乐在线补充:Steve Yegge 在前文关于 Kotlin 的名字来源,应该错了。在他自己原文评论中,也有网友指出了。
正确的应该是:① JetBrains 是一家注册地在捷克布拉格的公司,在全球共有 6 个办公点:布拉格、圣彼得堡、莫斯科、波士顿、慕尼黑和新西伯利亚。但主要管理层和开发者是在圣彼得堡。② 芬兰湾中有个岛就是「Kotlin/科特林」,在圣彼得堡以西 32 公里。
我发现去年业界关于 Kotlin 只是有不少“嘀咕(buzz)”。注意,只是“嘀咕”,不是天花乱坠地吹牛宣传。人们只是低调地“嘀咕”着。好吧,总之,我当时看了一下,然后就觉得这个语言和我过去 15 年看过的 50 ~ 100 种计算机语言一样,这也是一门可以替代 Java 的语言,当然,我认为任何理性的语言都能替代 Java。
对 Kotlin 的第一印象
我第一次看到 Kotlin 的时候,真心觉得这种语言不可能在现实生活中用到,真的是一点可能性都没有。其实我也就是走马观花。我的第一印象?这个语言也没什么大问题。它很简洁,也具有先进的特性。如果说它时髦也行,因为它几乎囊括了计算机语言设计上的所有最新潮流。不过这也没什么大不了,因为很多语言也都满足这一点。比如,Rust。Rust 也是一门健壮的,名字起得很好的,但是没什么人用的语言。
Kotlin 给我的一种奇怪的感觉是“似曾相识”,后来我才反应过来,原来这是因为它和 Swift 很像。我之所以没有马上反应过来,是因为我的 iOS 程序因为历史代码的原因不得不用 Objective-C 而不是 Swift 来写。当然现在我也弄明白了:其实 Kotlin 的历史比 Swift 要悠久几年,所以正确的说法应该是:Swift 和 Kotlin 很像。
不过即便如此我当时也没准备用这种语言干活。Kotlin 对我来说确实是一种语法优雅的语言,但是我觉得我对这门语言还没有掌握到足够的程度,以至于让我可以用它来应付残酷的现实工作。
从 Java 叛逃到 Kotlin
我不太记得我是具体怎么爱上 Kotlin 的了。但是我敢肯定的是这绝对不是有意为之。
我努力回忆了一下,事情是这样的,我做的那个游戏的玩家跟我说了好久,让我开发一个 Android 版本。这个游戏是 12 月份在 Apple Store 上架的,然后几周之内,大量粉丝就跟我说,他们是 Andorid 用户,所以没法玩到这个游戏。所以,尽管我已经“发誓”再也不碰Android 编程了,但是用户就是上帝,所以我又开始尝试了。不过这一次要换个玩儿法——不能再把胃口坏在 Android 的 Java 语言上了。我需要有个现成的框架,或者什么类似的东西,来让工作变得简单一点儿。
在 1 月中旬,我做了一个粗略评估,然后就决定用 Kotlin 来开发了,Kotlin 当时可同时支持 Dalvik 和 Art 两种 Android 虚拟机。我觉得我的评估是基于以下几个原因:
1. Kotlin 已经小有名气;
2. 当时我写 iOS 版的时候就想用 Swift(但是没用成);
3. Kotlin有一种挺不错的 Android DSL 叫做 Anko,这勾起了我的兴趣,虽然最后我并没有真的用到它。
所以我就用 Kotlin 开始做了。在接下来的 4-5 周内,我用 Kotlin 重写了游戏的服务平台。要知道这个平台之前已经有 20 多年历史了。用了一个月的 Kotlin,我就被完全征服了。我不是要说 Scala 或者其他语言的坏话,但是对我这种普通码农来说,Koltin 是完美的。我的要求不高,给口饭吃就行,知道不?Scala 固然很好,但是它好得过头了,就像牛蛙牛脑松露蜗牛这些高档菜那么好。要知道我就是个蓝领,Clojure、Scala 这类的语言对我来说太高大上了。
我大约花了 3 天时间来学习 Kotlin 的各种语法,然后就开始正式编程了,虽然我还是很不熟练,但是我知道这种语言和 IDE 工具足以让我解决各种麻烦。
当我对这种语言稍微熟悉了一些以后,我就知道,我应该不会再去爱上另外一种语言了,因为 Kotlin 实在是太迷人了。你在代码写出来的东西让你觉得很酷。当然我以前用其他的语言编程的时候也体验过类似的感觉,但是那些语言的学习曲线一般都非常陡峭。Kotlin呢,它就是大救星:当 Java 程序员为了 Java 8 弄出来的一大堆新概念挠头的时候,Kotlin 出现了。Kotlin 能实现 Java 8 的各种新特性,并且通过对 coroutines 的支持,其实能实现更强大的功能,而且语法表现力更简洁。Java 8 确实也能表达很有意思的逻辑,但是很繁琐,感觉就像让你说话之前要先给你嘴里塞沙子。
我想 Kotlin 上手很容易的原因太显而易见了,要归功于它的 IDE 支持。现在几乎所有的 JVM 语言或者 Android 语言的 IDE 支持都是由社区的几个志愿者在维护(当然 Java 除外)。而 Kotlin 则是来自世界级的 IDE 厂商(Jetbrains),所以 Kotlin 打一开始就是自带 IDE 支持的。有多少语言能做到从发明伊始就能有 IDE 支持呢?编程语言的进化历程一般做不到这一点。况且有的编程语言从一开始就是要避开 IDE 这个因素的(Hi!Rob)另外一个能一开始就做到 IDE 支持的语言就是 C#,当然 C# 毫无疑问是全世界最好的编程语言之一。
伯乐在线/程序员的那些事补注:上面这段中的 Rob,应该是指 Go 语言的发明者 Rob Pike,作者在这里也许是暗讽 Go 语言从发明到现在都没有一个靠谱的 IDE 支持吧。
作为一个自带 IDE 支持的语言,你在 Kotlin buffer 敲代码的时候,打字基本对就可以了。IDE 会帮你补全你没写完的部分。你知道吗,你甚至可以把Java代码复制到IDE里面,然后 IDE 会帮你自动转换成Kotlin代码。如果你觉得 Java 的 IDE 都还不错,那么我可以很荣幸地告诉你,Kotlin IDE 会把这种“不错”推进到前所未有的地步。甚至有一个前微软工程师跟我说:“我本以为微软的 Visual Studio 是 IDE 界的标杆,是不可超越的。但是我觉得 IntelliJ IDEA 的确要更好。”在我看来,因为我对 Visual Studio 不熟悉,所以我在这里只是引用他说的话。不过我认为 IntelliJ IDEA 至少和 VS 是同等水平。
诚然,在现实工作中我还是要经常切换到 Emacs 的。IntelliJ 在你打字很快的时候还是有点儿反应不过来。如果你打字总是只打一半儿的话,那么自动补全动能的运行压力还是很大。况且对纯文本的处理也很糟糕,这是所有 IDE 的通病。所以 IDE 和 Emacs 你都是需要用到的。不幸的是,目前 Emcacs 对 Kotlin 的支持现在也就那么回事儿,不过相信以后会越来越好。我现在反正就是在 Emacs 和 IntelliJ 之间来回切换。目前还算是 OK。
就是这样了。我曾经花了大约 10 年的时间,来找一种语言来取代 Java。我真的找得很努力很辛苦。讽刺的是,在我放弃了以后,这种东西居然出来了。去看看吧。Kudos 对 JetBrains 来说,是一个惊艳的成就。
Android:Kotlin 的杀手锏
这年头新生编程语言几乎很难产生什么巨大影响力。不是说现在没有新语言产生了,相反是每年都有质量不错的新语言产生,但是然并卵,没人用!要给“不可能”划定界限很难。但是计算机语言的市场已经非常饱和了。如果要让一个新的语言能够大火(而且这个规律在过去 10 到 20 年都成立),那么这个语言就必须有一个“杀手级”的应用。这门语言需要绑定一个平台,让大家都非常迫切地区使用这个平台,这才能促进大家学习这门语言以便在这个平台上编程。
就目前看来,我们上面所说的杀手级应用——也就是我们上面扯了这么多的东西——却是 Android 恶心的 API。每当你顺着 Android 路线往下走,一遇到 API 就会卡壳,这只会让你去诅咒 Android 这个平台。Android 不论有多少优秀的 API 都不管用,重要的是,Android 糟糕的 API 太多了,所以你不得不停下来去找”现成”的办法(solution)。
不过兄弟,Android 里面解决问题的“现成办法”可是不少。对于新手来说,有一大堆 Java annotation processors可用,这就为语言的问题埋下伏笔。更不要提一堆迷你的框架(比如 Lyft 的 Scoop)。还有那些和 Android(Java)完全独立的框架:React Native、Cordova、Xamarin、Flutter等等。
如果以上说的技术你都不喜欢,那么你还可以从语言的角度来解决问题。当然,那些完全独立的框架是基于特定语言的,而并不是Java。
Kotlin 的竞争优势在于它并不是完全隔离于 Java 语言。它基本上是 100% 可与 Java 相互翻译转换的。这很像C++ 与 C 的关系一样(但它们做不到 100% )。Kotlin 也是在不断进化的。所以你可以直接把你写的 Kotlin 代码扔到 Android 工程中,连目录都不用改,然后程序就能正常运行了,方便得眼睛都不用眨一下。
其他种类的 Android 平台都倾向于迫使你去学习一种全新的语言以及对应的平台,其编程范式,理念和特性都各不相同。Kotlin 则是让你直接写出 Android 可运行的类,就跟其他 Android 程序员用 Java 写出来的一样。其实其底层的 API 都是一样的,但是 Kotlin 组织得要好很多。
还记得我去年夏天把 Android 编程书扔了然后再也不打算看了么。现在 Kotlin 则让我感觉:Android 编程是快乐的?我甚至觉得可能 Android 那些糟糕的 API 很可能并不是那么糟,只是 Java 把它搞得太恶心了而已。
Kotlin 致力于让大家绕过 Android API 那些恶心的东西,并且能让你充分发挥你的经验,这一点甚至比 iOS 做得还要好。好吧,至少来说比 Objective-C 做得好,因为我觉得 Swift 肯定也不会差。知道为什么吗?因为 Swift 和 Kotlin 很像啊。
我特别喜欢 Kotlin 的地方有哪些?
嗯,这个话题其实要细说就很大了,我觉得我最好再开一篇文章来写这个。这里我就提一下那些高级(high-level)且共性的点。
Kotlin 很像 Java。它长得不像 Clojure 或者 Scala 那么奇怪(承认现实把,这两种语言就是挺奇怪的)。所以你学 Kotlin 应该很快。这门语言显然就是写给 Java 开发者来用的。
它比 Java 更安全。Java 很多需要 annotation processors 来做的事情在 Kotlin 里则是内置的,例如 overriding,nullability等等。而且 Kotlin 对数值转换的规则也更安全,虽然我不太喜欢 Kotlin 的处理方式,但是我还是很感谢这门语言强制我去思考我的数值表现形式。
Kotlin 和 Java 是可以互译的。真的是指无缝互译。我见过很多 JVM 语言最后挂掉,就是因为其不支持子类继承机制。我不知道什么时候就会用到静态内部类,非静态内部类,或者什么破玩意儿类。Kotlin 在设计时就把和Java互译的属性放在第一位,也就是说,把 Java 翻译到 Kotlin 可以逐渐进行,一次可以直接转换一个文件。
Kotlin 很简洁。你要知道我也算是个高尔夫球手,所以我实话实说。如果在一切都相同的情况下,我更喜欢短的程序,只要它写的逻辑清楚。Kotlin 对我来说就像是打了一轮好局。平均下来我发现 Kotlin 的代码长度比相同逻辑的 Jython 代码短了 5%-10%(这可是我用某种“黄金标准”测出来的),而且还能保证程序的可读性和类型安全。
Kotlin 更贴近实际。Kotlin 支持在一个文件里定义多个类,支持一等方法,操作符重载,扩展方法,类型别名,字符串模板,还有一堆看上去没什么新意的语言特性它都支持。而我就是不明白为什么 Java 什么都不支持,连人们需要的语言特性它都不做。
Kotlin 进化很快。例如刚刚宣布启动的对 coroutine 的支持,将会成为提供 asyn/await, geneator 以及所有其他无锁并发特性的基础设施。
Kotlin 很擅长“拿来主义”。Kotlin 经常从其他的计算机语言设计中抄点子,并且也毫不避讳。他们说:“我们很喜欢 C# 的处理方式,所以我们就自己照着撸了一个。”
Kotlin 支持 DSL。DSL 不到深思熟虑万不得已的话千万不要引入,但是不得不承认 DSL 威力巨大。例如你看 Gradle 的 DSL 和 Maven 比,在典型的 Maven 项目里,配置代码肯定要超过上千行。所以 Kotlin 是来给你降工作压力的。
Kotlin 的 IDE 是在是太棒了。刚才不久我才在 Emacs 里写程序文件,结果 Emacs 报了一对错。而我把同样的代码拷贝到 IntelliJ 里面,然后按 Alt-Enter 逐一自动修复了 50 多条,然后所有的错误就都搞定了。这真是帮了大忙啊。
Kotlin 很有趣。我跟你们说,Kotlin 就是有趣。也许这是我发自潜意识地在做广告。Kolint 的关键字和方法名都很有意思。Kotlin 把我从一个只会死编程的码农转变为了一个计算机语言的爱好者。
总之,你就这么想:我收拾东西搬家,然后碰到了邻居 Kotlin。我之前也算见过的一堆计算机语言,但是只有 Kotlin,能够让我在那么短的时间内重写我的游戏服务器代码。而我现在则是在用 Kotlin 重写我之前写过的一切。
我也知道还有好多其他的程序员也对 Kotlin 感觉非常好,打算成为 Kotlin 程序员。其中大部分的人应该在 1-2 年之内水平就能超过我了。我们私下里谈论过,互相都说“Kotlin 让编程感觉美好的感觉又回来了。”还不错,再我们尚未对编程全部失去兴趣之前,Kotlin 来了。就仿佛你只要把语言的语法学会了。这回把你带回到那种第一次学编程的感觉,无论写什么都觉得自己很牛逼。
再一次,向 JetBrains 致敬。他们对计算机语言做出了巨大的贡献!我脱帽致敬。
那么 Kotlin 比你用的任何其他编程语言都好吗?我想对我来说是的。因为,如果你碰巧是在用 Java 的话。如果你一整天就是泡在椅子面前写 Java,那么你会发现 Kotlin 简直就是一股清流。所以也让我知道你们是怎么想的吧。
免责声明:本文只是阐述我个人对 Android 开发的观点,并不代表我的雇主(谷歌)或者 JetBrains 的观点。
伯乐在线/程序员的那些事 摘录原文的一些评论:
Igor Tovstopyat-Nelip
JetBrains 不在捷克。虽然它是在(捷克)布拉格成立的,但主要在圣彼得堡。他们很多管理层和开发者都是俄罗斯人,很多是从圣彼得堡大学毕业的 。
关于取名,Java 语言是出自印尼群岛中的 Java 岛。Kotlin 是芬兰湾中的一座岛,离圣彼得堡很近。彼得大帝在 18 世纪早期从瑞典那里抢过了圣彼得堡。此后,一直是俄国波罗的海舰队的海军基地。圣彼得堡有北国风光之美,海军神庙(Naval Temple)令人印象深刻。
我们公司(位于亚特兰大)也试过多种 JVM 语言,Java 是首先。现在我们更对 Kotlin 感兴趣了。大家都非常喜欢。并且 Kotlin 和 Java 是无缝互通的。
Kotlin 也能编译成 JS,并且值得一提的是,Kotlin Native 也处于火热发展中,看起来会是 Rust 的强劲对手。
匿名网友:
我过去也一起用过 Eamcs 和 JetBrains 的 IDE(PyCharm 和 Webstorm)。虽然这种组合很怪,但出奇的好。Emacs 适合心灵控制级别的文本编辑,IDE 适合面向鼠标的闲逛和小修改。
Stephen French:
我喜欢 C#,对 Java 落后太多真的失望至极,因为我的工作倾向 JVM。Kotlin 看起来非常有意思!
看完本文有收获?请分享给更多人
关注「安卓开发精选」,看 Kotlin 技术文章
责任编辑:标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文地址:https://www.cnblogs.com/tsingke/p/8986560.html
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!谷歌大牛说:为什么 Kotlin 比你们用的那些垃圾语言都好-GAD腾讯游戏开发者平台第1章 Kotlin是什么 - 简书
第1章 Kotlin是什么
第1章 Kotlin是什么
当下互联网大数据云计算时代,数以百万计的应用程序在服务器、移动手机端上运行,其中的开发语言有很大一部分是用流行软件界20多年的、强大稳定的主力的编程语言Java编写。
如果我们用一辆汽车来比喻编程语言的话,Java 拥有一个快速、可靠的发动机,但防抱死刹车系统,动力转向系统却不是那么地完全可控。驾驶起来得小心翼翼地检查可能出现的空指针,处理检查异常,重复生成冗长而单调的样板代码行等等。而编程语言的防危性(safety)和安全性(security)却又是至关重要的。
要是有一门语言,既能继承Java的所有优点特性及其背后强大完备的生态库,又能更加简单、安全可控,那真是再好不过了。
我们很高兴地看到,Kotlin就是这样一门语言。Kotlin是一门非研究性的语言,它是一门非常务实的工业级编程语言,它的使命就是帮助程序员们解决实际工程实践中的问题。使用Kotlin 让 Java程序员们的生活变得更好,Java中的那些空指针错误,浪费时间的冗长的样板代码,啰嗦的语法限制等等,在Kotlin中统统消失。Kotlin 简单务实,语法简洁而强大,安全且表达力强,极富生产力。
本章我们先简单介绍Kotlin语言的发展历史和语言特性,然后简述为什么要去学习Kotlin语言。最后,简要介绍JVM语言家族。
初识Kotlin
Kotlin是一种基于JVM的静态类型编程语言。Kotlin从一开始推出到如今,已经有六年,2016年官方正式发布首个稳定版本,发展简史如下:
2011年7月,JetBrains推出Kotlin项目。
2012年2月,JetBrains以Apache 2许可证开源此项目。
日,Kotlin v1.0(第一个官方稳定版本)发布。
2017 Google I/O 大会,Kotlin “转正”。
Kotlin 具备类型推断、多范式支持、可空性表达、扩展函数、模式匹配等诸多下一代编程语言特性。
Kotlin的编译器kompiler可以被独立出来并嵌入到 Maven、Ant 或 Gradle 工具链中。这使得在 IDE 中开发的代码能够利用已有的机制来构建,可以在新环境中自由使用。
让我们从Hello World开始。与 C/C ++/Java 一样,Kotlin 程序的入口点是一个名为“main”的函数,它传递一个包含任何命令行参数的数组。
package com.easy.kotlin
fun main(args: Array&String&) {
println("Hello,World!")
上面的代码简单说明如下:
1.Kotlin中的包package的使用跟Java基本相同。
2.Kotlin 变量声明 args: Array&String& 类似于Pascal,先写变量名args,冒号隔开,再在后面写变量的类型Array&String& 。
3.与Scala和Groovy一样 ,代码行末尾的分号是可选的。在大多数情况下, 编译器根据换行符就能够推断语句已经结束。
4.Kotlin中使用fun关键字声明函数(方法),充满乐趣的fun。
人们为什么喜欢Kotlin?Kotlin为什么值得我们去学习?下面是一个不完全的清单列表:
与Java(以及JVM)的完全互操作性
多平台 - Android,浏览器(JavaScript)和本地系统编程(native)
语法简洁不啰嗦(学习起来很快)
富于表现力和高效地生产力
类型推断。我们可以只写 val number = 23,编译器会去推断这是一个 Int。
数据类以极简的方式创建POJO。
运算符重载相当简单。
快速方便地扩展内置类、自定义类的函数与属性。
直接在编译期语法层面检查可空类型,“强力清扫” NullPointerException,提供空安全。
功能丰富的集合类Stream API
集成扩展了简单实用的文件IO、正则匹配、线程等工具类
Lambda表达式、高阶函数一等支持
能够轻松方便地创建DSL
使用更加轻量级的协程进行并发编程
IntelliJ IDEA开发工具的一等支持
Android开发有Android Studio 3内置原生支持
提供的Anko库 ()
使得Android开发速度更快,充满更多的乐趣。
Kotlin的优势是,既有Java的完整生态(Kotlin 完全无缝使用各类Java API框架库),又有现代语言的高级特性 (语法糖)。
Kotlin 语言的设计的初衷之一是为了 JetBrains 团队的内部使用,旨在帮助公司降低成本。用过IntelliJ IDEA的都知道JetBrains 团队出品,皆是良品。毫无疑问,Kotlin的设计是务实的 。发展和促进 Kotlin 的好处大于其成本, 在这个过程中, Kotlin 已经演变成了一个 JetBrains 的效率工具。其强烈的务实取向强烈地吸引了一大批Java程序员。
Kotlin 也成为 JetBrains 工具生态系统中重要的一员。希望在未来几年内 Kotlin 成为主要的非 Java的 JVM语言,甚至有一天成为下一个Java语言。可以预测的是,Kotlin 将大大提升整个Java 互联网开发者的效率和质量。
Kotlin语言的特性可以简单概括如下:
1.实用主义( Pragmatic ):务实、注重工程实践性。我们经常会听到或者看到人们说编程是数学,或者是工程,是艺术,是科学,这些说法都是很有道理的。Kotlin是一门偏重工程实践与艺术上的极简风格的语言。
2.极简主义( Minimalist ):语法简洁优雅不啰嗦,类型系统中一切皆是引用(reference)。
3.空安全(Null Safety):有一个简单完备的类型系统来支持空安全
4.多范式 (multi-paradigm ):同时一等支持
OOP 与 FP 编程范式。各种编程风格的组合可以让我们更加直接地表达算法思想和解决问题的方案,可以赋予我们思考上更大的自由度和灵活性。
5.可扩展:直接扩展类的函数与属性(extension functions & properties)。这与我们在Java中经常写的util类是完全不一样的体验!Kotlin是一门非常注重用户体验的语言。
6.高阶函数与闭包(higher-order functions
& closures)。Kotlin 的类型中,函数类型(function type)也是一等类型( first class type),在Kotlin中我们可以把函数当成值进行传递。这直接赋予了 Kotlin 函数式编程的特性。
使用Kotin可以写出一些非常优雅的代码。
7.支持快速实现 DSL。有了扩展函数、闭包等特性的支持,使用Kotlin实现一个DSL将会相当简单方便。
“我们认为Kotlin的定位是一种现代化工业语言:它专注于代码重用和可读性的弹性抽象,以及面向早期错误侦测,和明确捕获维护与清理的意图,这些问题的静态类型安全性。Kotlin最重要的使用场景之一是对于一个庞大的Java代码库,其开发者需要一个更棒的语言:你能够将Java和Kotlin自由混合,迁移可以是渐进式的,不需要一下子对整个代码库进行改变。”
“Kotlin旨在成为一种面向工业的面向对象语言,而且是一种比Java更好的语言,但仍然可以与Java代码完全互操作,允许企业逐步从Java迁移到Kotlin 。”
Andrey Breslav, Kotlin创始人
编程的真正的问题在于,如何把人类脑子里对问题的解决方案“具化”到机器世界,而这个“具化”的过程正是编程语言所要表达的东西。如何富有表现力并且安全简洁地表达,这是所有编程语言所要解决的问题。让人类能够尽可能“自然地”和计算机进行沟通交流,这一直是促使人们提高编程语言抽象层次的主要目标之一。很显然的一个事实就是,跟用机器语言写的低层次结构代码相比,用编译语言写成的高层次结构代码更接近于人一般思考时所用的概念。
Kotlin设计了一个“归一化”的类型系统(一切类型皆是引用类型),纯天然地设置了一道空指针的屏障,使得Kotlin比Java更加安全可靠。Kotlin还引入了类型推断、一等支持函数式编程、Lambda、高阶函数、类的扩展函数与属性、DSL等诸多特性,使得我们可以编写简单、优雅且高效的代码,更加专注地投入在业务逻辑的实现上。
优秀的程序员当然会选择使用Kotlin这些更加先进的特性,因为它们毫无疑问有助于更直接地表达观点,而且也没有额外的开销。何乐而不为呢?
“工欲善其事必先利其器”。本节我们简单介绍一下学习Kotlin的工具平台。
如果你想快速体验一下Kotlin,只需要浏览器打开云端IDE
快速体验Kotlin
在这里你可以快速感受到Kotlin语言到底长什么样子。但是,这里不支持代码智能提示以及自动补全等功能。
命令行REPL
有时候我们并不需要打开IDE来做一些事情。打开 IDE 是件很麻烦的事情,在某些场景下,我们比较喜欢命令行。
使用命令行环境,我们可以方便地使用Kotlin REPL(Read-Eval-Print-Loop,交互式编程环境)。REPL可以实时编写Kotlin代码,并查看运行结果。通常REPL交互方式可以用于调试、测试以及试验某种想法。
如果你想本地快速测试一个简短的Kotlin代码,可以使用命令行REPL。Kotlin是运行在JVM环境下的语言。首先我们要有JDK环境(Java环境配置此处省略)。
目前,Kotlin最新正式发布的版本是1.1.50。首先,去下载Kotlin运行环境安装包:
解压完kotlin-compiler-1.1.50.zip,放到相应的目录下。然后配置系统环境变量:
export KOTLIN_HOME=/Users/jack/soft/kotlinc
export PATH=$PATH:$KOTLIN_HOME/bin
执行source ~/.bashrc, 命令行输入kotlinc,
即可进入 Kotlin REPL界面
Welcome to Kotlin version 1.1.50 (JRE 1.8.0_40-b27)
Type :help for help, :quit for quit
&&& println("Hello,World!")
Hello,World!
&&& import java.util.Date
&&& Date()
Wed Jun 07 14:19:33 CST 2017
我们如果想拥有学习Kotlin的相对较好的体验,就不建议使用eclipse了。毕竟Kotlin是JetBrains家族的亲儿子,跟Intelli IDEA是血浓于水啊。
我们使用IDEA新建gradle项目,选择Java,Kotlin(Java)框架支持,如下图:
使用IDEA新建Kotlin gradle项目
新建完项目,我们写一个HelloWorld.kt类
package com.easy.kotlin
import java.util.Date
import java.text.SimpleDateFormat
fun main(args: Array&String&) {
println("Hello, world!")
println(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()))
直接运行HelloWorld.kt,输出结果如下
Hello, world!
1.5 为什么要学 Kotlin
现在的编程语言已经足够多了,为什么我们还需要更多的语言?Java已经如此流行普及足够强大了,为什么我们还需要Kotlin、Scala这样的语言呢?
其实,如果我们仔细想想,这个问题本身的逻辑就不成立。你想想,我们能这样说吗——煎鸡排已经足够好吃了,为什么我们还要去吃煎牛排呢?
从最早的机器语言(01机器码,汇编语言)到高级语言(Lisp,Basic,Pascal,C,C++,Java,Haskell等),再到现代编程语言(Go,Swift,Scala,Kotlin等),编程语言百花齐放、百家争鸣,其演化史可谓是蓬勃繁荣。
最早的编程语言就是01机器码(Machine Code)。那个时候的程序员要会用0和1表示一切!
后来人们聪明地想到,是不是可以把一些常用的指令操作单独抽象出来,用特定的关键字来映射01机器码序列?这就是汇编语言,这可以算作是编程语言过程中的第一次抽象封装。也许,汇编语言的主要意义不在于它与机器语言之间并不显著的差别,而是这样一个关键的想法:程序完全可以在不同的层次上编制!人们可以用机器语言写一个“翻译程序”, 从而使得我们可以在一个更高层次进行编程。
后来汇编用久了,人们也逐渐发现了使用汇编过程中的问题:可移植性差。汇编代码中是大量的字节指令码,而且还必须一步一步地告诉计算机每一步要怎么做,一个步骤出错,执行结果就是程序员们意想不到的!使用汇编语言编程,极易在子程序调用过程中导致寄存器内容错误,而且调试程序也很困难。程序在正常运行时,我们基本不太去过多地关心和想象它的活动结构和层次空间。而只有当它出现bug或者崩溃的时候,我们才竭尽全力地在不同层次上思考和想象我们的程序运行的具体细节。而这其中的出错信息将变得至关重要。例如,一个除法操作,遇到除数为0的情况,程序将暂停运行,并把错误抛出给程序员。下面是不同层次上的debug信息:
机器语言层:程序运行异常终止于01001地址;
汇编语言层:程序运行异常终止于DIV指令;
编译语言层:程序运行异常终止于代码行256
(a+b)/c 处。
从上面的信息中,显而易见的是,层次越高,越容易被我们人类大脑所理解。
在高级语言中,所有参数都必须严格匹配其类型,这样就不会出现寄存器内容错误的情况。高级语言就是为了解决汇编语言的这些问题进行的更高一层的抽象与封装。这层封装就是编译器。编译器所要解决的问题就是,如何构造一个系统,使它可以接收当前层次的描述,然后从中生成另一个层次上的描述。通常来说,设计一门语言相对容易,而实现这门语言的编译器则是比较复杂的。编译器制定了一系列的协议规范、语法规则等,只要程序员们按照这个协议规范来编程,编译器就可以将高级语言的源代码翻译成对应CPU指令集上的汇编语言代码。高级语言不要求程序员掌握计算机的硬件运行,只要写好上层代码。著名的高级语言有 BASIC、FORTRAN(公式翻译)、 COBOL(通用商业语言)、 C、 PASACL、ADA 语言等。
尽管 C 语言 (1972, Dennis MacAlistair Ritchie,启发语言有 B语言、汇编、ALGOL68等)已经足够普及且非常强大,后来还是出现了针对 C 语言进行改进和功能扩展的新语言 C++ ( 1979,Bjarne Stroustrup ),C++ 集成了 C 语言的特性,然后加入了面向对象程序设计的特性支持。和汇编语言不同的是,在C语言的语句和机器语言的指令之间不再是简单的一一对应的关系,不过毫无疑问的是,仍然有一种从C语言代码到机器语言代码的映射关系,但是这种关系要比从汇编到机器语言之间的关系要复杂多了。而完成这个映射过程翻译的程序,我们就称之为“编译器”。
而C/C++语言最大的一个问题就是“一切都会尖叫着停止”,因为它们使用了直接操纵内存的指针。一旦因为使用指针而出现了内存错误,系统核心就会崩溃。
有没有一种语言可以控制这样的风险呢?
后来的Java(1995,James Gosling)继承了 C/C++ 语言的优点,摒弃了C++里的指针操作、手动管理内存、多继承等诸多复杂而并不实用功能特性,引入了划时代的 Java虚拟机(JVM,Java Virtual Machine),JVM是一种虚拟的计算机,从结构上看,它与实际的计算机架构相似,JVM的作用是使得一台实际的机器能够运行Java 字节码(bytecode)。引用James Gosling的话就是
“大部分人大谈特谈JAVA语言,这对于我来说也许听起来很奇怪,但是我无法不去在意。JVM才是Java生态系统的核心啊。
我真正关心的是Java虚拟机的概念,因为是它把所有的东西都联系在了一起;是它造就了Java语言;是它使得事物能在所有的异构平台上得到运行;也还是它使得所有类型的语言能够共存。”
首先,JVM实现了Java的可移植性。
另外,JVM里面实现了一个垃圾收集器(GC,Garbage Collector)来管理内存,GC 对保证系统的可靠性和安全性非常实用有益。
同时,JVM还奠定了一个庞大的语言生态的基础。
Java是互联网时代当之无愧的最流行的开发语言。经过20多年的积累和沉淀,Java生态拥有了很多优秀的开源社区,如Apache和Spring。有了这些框架,我们可以更加专注业务的实现。
Java语言也有不好的一面。我们简单列举如下。
1.检查异常(Checked Exceptions)。检查异常会在编译时强制执行try catch处理,同时还需要进行某种排序处理。 检查异常是一个失败的实践,几乎所有的主要API提供者都反对可检查异常。Kotlin中摒弃了检查异常。
2.基本类型和数组。Java的这个设计保留了字节码的底层细节,违反了“凡事皆为对象”原则。泛型无法包容基本类型就是一个经典的例子。这也使得Java的类型系统显得不是那么地简单统一。比较好的方案是,源代码不用直接使用基本类型或者数组,编译器(或者JVM)来决定是否可以帮你对其进行优化。Kotlin正是这么做的。
3.静态变量(Static)。静态方法经常会导致需要显式的定义接口,从而使得API更加复杂。一个更好的办法就是采用单例对象,单例对象在大多数情况下表现都跟静态对象差不多,只不过也可以像一个对象一样被传递而已。Kotlin中提供了 object 单例对象。
4.泛型。Java泛型本身就很复杂,当使用? exends和? super等变种句型时就变得尤其复杂。非常容易搞错。这个问题在《Effective Java》一书中提出了PECS(Producer extends Consumer super)的建议,Kotlin直接使用了这个方案。
5.空指针异常(NPE)。Java中我们不得不写一堆防御代码来避免令人头疼的NPE。Kotlin中引入了可空类型与安全调用符、Elvis操作符等特性实现空安全。我们将在第3章中介绍。
6.一堆getter/setter单调冗长的样板代码。例如下面的Person Bean类
class PersonJava {
public Integer getId() {
public void setId(Integer id) {
public String getName() {
public void setName(String name) {
this.name =
public PersonJava(Integer id, String name) {
this.name =
在Kotlin中是这样子的:
data class PersonKotlin(val id: Int, val name: String)
7.不容易传递函数。Java中没有提供一等函数类型,函数式编程(FP)只能通过使用接口类型以及多态特性“曲线”来实现。Java会将每一个算法(方法)都放入类中,这样的限制会出现这样的荒唐事:我们只是想要实现一个函数算法,而这个时候我们必须还得整出一个类出来放置这样的方法;同样,如果在其它地方要调用这个方法,我们也必须通过创建该类来实现调用。在Kotlin中直截了当地提供了一等函数类型(First-Class Function Type)。跟普通类型一样,函数类型可以作为值来传递,也可以作为返回值。
还有其它的经验教训,上面所述只是其中的一部分。
不可否认的是, C、 C++ 和 Java 都是非常优秀的编程语言。但是事物总是不断发展变化的。就像 C++ 是对 C 的继承与发展,Java 是对 C++ 的继承与改造,而Kotlin也是对Java 的继承与变革。
JVM语言生态
这里是一张来自Java官网文档()里面的一张 Java 技术模块架构图
Java 技术模块架构图
为了在JVM上正确运行我们的程序,我们只需要能够按照规范生成正确的 class 文件,然后加载到JVM中执行文件中指定的操作字节指令码(byte code)即可。
在过去20多年的发展历程中(,如果算上最初的称之为oak语言的Java前生的话),Java语言、JVM、API库和框架、应用工具和Web服务器的速度、稳定性和功能方面却一直在提升,现在已被公认为是开发高端服务器。
JVM最初是为了支持java编程语言。然而,随着时间的流逝,越来越多的语言被改编或设计运行在JVM上。除了java语言,比较知名的JVM上的编程语言还有:Groovy、Scala、Clojure等。
JVM上主流编程语言历史时间轴概览:
JVM语言发展简史.png
计算机中的所有问题 , 都可以通过向上抽象封装一层来解决。
Java虚拟机对各个平台而言,实质上是各个平台上的一个可执行程序。例如在windows平台下,java虚拟机对于windows而言,就是一个java.exe进程而已。
通常情况下,在JVM平台上语言从源代码编译到JVM上执行的整体过程如下图所示
JVM语言编译执行过程.png
其中,运行在JVM上的字节码文件是不依赖于硬件和操作系统的二进制格式的文件。依赖硬件和操作系统的部分,由JVM分别在这些平台上来实现。例如JDK 8
jdk各个平台的安装包
我们经常说的Java语言是平台无关的,跨平台的。其实这是针对从Java/Scala/Kotlin/Groovy等的源代码到JVM字节码这一层是平台无关的。
但是,真正到了把JVM字节码通过解释器映射到不同平台(操作系统,CPU硬件架构)上,JVM就必须针对各个平台实现一套解释器。只是这一层通过抽象封装,对 Java/Scala/Kotlin/Groovy 程序员而言已经完全透明,无需再做相关的工作而已。
下一代普遍可接受语言(next mass-appeal language)中,人的因素应该起到重要作用。在功能方面,应该具备诸如以下特性:
类C的语法(容易被大众程序员所接收,很好用也很熟悉)
静态类型(动态类型过于松散并且性能有限,不适用于大型项目)
遵循面向对象程序设计OOP思想,同时一等函数式编程FP支持。
反射(从而避免静态类型限制)
属性(getter和setter实在是太让人讨厌了)
高阶函数,Lambda与闭包
Null判断(提供一个判断变量能否为null的方式)
完善的工具支持
可扩展性(语言的设计具备很好的可扩展性)
语言设计其实堪比艺术品设计,每个人的口味跟审美都有各自的风格与特征,所以实现出一门好的编程语言确实不容易。
人的生命只有一次。生命太短暂,所以不要去做一些重复无聊的事情。能交给计算机做的,就尽量交给计算机去做。此乃人类进行计算机编程的滥觞之地。
未来人工智能将取代大部分的重复手工劳动。将大大解放人类的劳动力,从而使得人类能够花更多的时间和精力,去创造去创新。而人工智能的本质,就是对人类智能的抽象建模。我们人类写的操作系统、浏览器、办公软件、画图设计工具、3D建模软件、电商系统、金融平台、社交APP,不就是另一种层次上的人工智能吗?这些东西,背后都是01的映射。当然,01背后是物理层次的,量子微观的世界了,更加奥妙无穷。
纵览整个计算机的发展史,最重要的思想非“抽象”莫属。
一层层的抽象封装了实现的细节,计算机开疆扩土,南征北战,发展到了今天蔚为壮观的互联网,云计算,大数据,机器智能的时代。
同时,也使得程序员写代码,从最初的拿着符号表在纸袋上打孔,到使用近似自然语言的高级编程语言来编程(当然背后少不了编译器、解释器,还有的是先通过虚拟机中间字节码这一层,再通过解释器映射到机器码,最后在硬件上作高低电平的超高频率的舞蹈),以及当今各种库API、框架、集成开发工具集,智能化的编码提示,代码生成等等技术,使得我们现在程序员,能更多的去关注问题本身以及逻辑的实现。
从只有少数技术人会用的命令行的Unix、DOS操作系统,到人性化的GUI图形界面操作系统,再到移动互联网时代的智能设备,计算机与互联网越来越融入到人类生活的方方面面。
正如解决数学问题通常我们会谈“思想”,诸如反证法、化繁为简等,解决计算机问题也有很多非常出色的思想。思想之所以称为思想,是因为“思想”有拓展性与引导性,可以解决一系列问题。
解决问题的复杂程度直接取决于抽象的种类及质量。过将结构、性质不同的底层实现进行封装,向上提供统一的API接口,让使用者觉得就是在使用一个统一的资源,或者让使用者觉得自己在使用一个本来底层不直接提供、“虚拟”出来的资源。
一个会写诗的程序员。目前就职于阿里巴巴。参与过多种平台工具的开发,具有丰富的平台开发经验,精通Kotlin (布道者), Java 等编程语言, Spring Boot 专家。项目实战操练过Java、Android、Scala、Groovy等语言进行领域建模、架构设计、工具开发,在工作中积累了大量经验,善于总结,乐于分享,发布过大量技术文章。著有《Kotlin 极简教程》、《Spring Boot 开发实战》(基于 Gradle + Kotlin的企业级应用开发最佳实践)等技术书籍 。
第1章 JVM语言家族概览 《Kotlin极简教程》正式上架: 点击这里 & 去京东商城购买阅读 点击这里 & 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~ 天地和而万物生,阴阳接而变化起。《荀子·礼记》 1.1 编程语言简述 ...
前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程语言 用于现代多平台应用 100%可与Java(TM)和Android(TM)互操作,它是[JetBrains]开发的基于JVM的语言开发IDE : Intellij / ...
原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,所有函数都生产函数。 &函数式编程&, 又称泛函编程, 是一种&编程范式&(programming paradigm),也就是如何编写程序的方法论。它的基础是 ...
Google在今年的IO大会上宣布,将Android开发的官方语言更换为Kotlin,作为跟着Google玩儿Android的人,我们必须尽快了解和使用Kotlin语言。 不过Kotlin毕竟是语言级别的新事物,比起Java来说,从编程思想到代码细节都有不少变化,我们最好先...
Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具。了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板。 思维导图...
如楔子 钉在生命 渴望复活 却被折磨成腐朽 想要跳跃 却失去挣扎的心火 竭力忘记 却被纠扯的清晰 肉皮覆盖的外表 掩饰不住泄露伤心的汗滴
1、节奏感很重要。它意味着控制。控制每天穿什么衣服、吃什么东西、晚上回家要不要吃水果。一旦失去对自我的控制,就会出现混乱,简称,失控。 2、语言和文字其实都是很无力的,甚至可以说是苍白。不要相信文字,要相信行为。 3、所谓的偏激观点能够引起更多人的共鸣,真是好笑。如果生活是...
坚持就是胜利,这是大家都熟悉,也是常说的一句话,但现实太残酷,要坚持做一件事,难;坚持做好一件事,更难。但如果坚持了,你肯定“胜利”了,也许这胜利,未必看得见、摸得着,但它必将为你下一个更大的胜利打下基础,这又是肯定的。 01 4月16日,军事专题“军事日更一年”计划启动,...
亲爱的向日葵大小朋友们:
周末好!时间的脚步匆匆,开学三周以来,六下的向日葵们,按着上学期我们已经养成的生活学习节奏,紧张忙碌,却又充实快乐,从容自如地生活着,细心的葵爸葵妈们会发现我们的第一封家信更多的把内容放在了写给小向日葵们,其实用意很明确,小向日葵们要开始为自己...
我与笔记本的恋爱史 你喜欢用手写笔记本,还是喜欢用软件来记录呢? 曾经,我是一个只用手写记录的人,喜欢买各种好看的笔记本,把让我焦头烂额的东西整理在上面,每次写完一个本子,都会很有成就感。 后来,手机app开始普及,漂亮的设计,人性化的操作,完全吸引了我。我爱上了用软件做记...

我要回帖

更多关于 如何学好一门语言 的文章

 

随机推荐