《Kotlin極簡教程》第一章 Kotlin簡介

正式上架:《Kotlin極簡教程》Official on shelves: Kotlin Programming minimalist tutorial
京東JD:https://item.jd.com/12181725.html
天貓Tmall:https://detail.tmall.com/item.htm?id=558540170670

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

fun main(args: Array<String>) {
    println(max(1, 2))
}

“我真正關(guān)心的是Java虛擬機(jī)的概念,因?yàn)槭撬阉械臇|西都聯(lián)系在了一起;是它造就了Java語言;是它使得事物能在所有的異構(gòu)平臺上得到運(yùn)行;也還是它使得所有類型的語言能夠共存?!? ( James Gosling, Java之父 (2011, ServerSide))

JetBrains開源其Kotlin語言 基于JVM的新編程語言。
Kotlin,類似 Xtend 一樣,旨在提供一種更好的 Java 而非重建整個(gè)新平臺。這兩種語言都向下編譯為字節(jié)碼(雖然 Xtend 是首先轉(zhuǎn)換成相應(yīng)的 Java 代碼,再讓 Java 編譯器完成繁重的工作),而且兩者都引入了函數(shù)和擴(kuò)展函數(shù)(在某個(gè)有限范圍內(nèi)靜態(tài)地增加一個(gè)新方法到某個(gè)已有類型的能力)。Xtend 是基于 Eclipse 的,而 Kotlin 是基于 IntelliJ 的,兩者都提供無界面構(gòu)建。能夠首先演變到其他 IDE 的語言有可能成為最后的贏家。

Kotlin1.1發(fā)布日志(2017.3.1):

Our vision for Kotlin is to enable the use of a single expressive, performant, strongly typed language across all components of a modern application. Kotlin 1.1 makes two major steps towards this goal.

First, the JavaScript target is no longer experimental, and supports all Kotlin language features, a large part of the standard library, as well as JavaScript interoperability. This allows you to migrate the browser frontend of your applications to Kotlin, while continuing to use modern JavaScript development frameworks such as React.

Second, we’re introducing support for coroutines. As a lightweight alternative to threads, coroutines enable much more scalable application backends, supporting massive workloads on a single JVM instance. In addition to that, coroutines are a very expressive tool for implementing asynchronous behavior, which is important for building responsive user interfaces on all platforms.

Below we describe these two changes further. In other news: we’ve added type aliases, bound callable references, destructuring in lambdas and more. See the details in our What’s new page (check out the runnable examples!).

March 1, 2017
https://blog.jetbrains.com/kotlin/2017/03/kotlin-1-1/

Kotlin語言

Kotlin 是一個(gè)基于 JVM 的新的編程語言,由 JetBrains 開發(fā)。

Github源碼:https://github.com/JetBrains/kotlin

其主要設(shè)計(jì)目標(biāo):

創(chuàng)建一種兼容 Java 的語言

讓它比 Java 更安全,能夠靜態(tài)檢測常見的陷阱。如:引用空指針

讓它比 Java 更簡潔,通過支持 variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation 等實(shí)現(xiàn)。

讓它比最成熟的競爭對手 Scala語言更加簡單。

一個(gè)非常好的交互式Kotlin學(xué)習(xí)教程:
http://try.kotlinlang.org/

此開篇第一回也。

kotlin的定位非常有特點(diǎn),它并不像是scala另起爐灶,將類庫,尤其是集合類都自己來了一遍.
kotlin是對現(xiàn)有java的增強(qiáng),通過擴(kuò)展方法給java提供了很多諸如fp之類的特性,但同時(shí)始終保持對java的兼容.
這是kotlin官網(wǎng)首頁重點(diǎn)強(qiáng)調(diào)的:

100% interoperable with Java?

這意味著什么呢?或者換個(gè)問法:我什么時(shí)候可以開始在我的項(xiàng)目中引入kotlin呢?
我的回答是:現(xiàn)在,立刻,馬上!

上個(gè)圖。

JVM語言家族

JVM語言家族

一個(gè)完整的語言有:

前端、優(yōu)化、后端、runtime、庫

JVM生態(tài)體系,把后面四個(gè)都給包辦了。

jvm(Java虛擬機(jī)),是用C寫的,跟操作系統(tǒng)打交道C/C++目前看來,是好的選擇。虛擬機(jī)就是java與操作系統(tǒng)的中間層。

庫/API就基本是java自身封裝實(shí)現(xiàn)。

從最初的Jython和JRuby,到Scala,Clojure都是在JVM上實(shí)現(xiàn)的語言。為什么它們選擇JVM?

跨平臺

你的語言編譯器后端只需要輸出 JVM 字節(jié)碼就可以。跨平臺需要極大的工作量(這個(gè)輪子,造起來有點(diǎn)耗時(shí)耗力)

JIT (Just-In-Time 即時(shí)編譯)性能

JIT 可以在運(yùn)行中記錄程序運(yùn)行的特征,并在其基礎(chǔ)上做大量的優(yōu)化(Java 企業(yè)級應(yīng)用的優(yōu)秀性能很大程度上是由此而來)。 JIT 自從 HotSpot JVM 隨 Java 1.2 發(fā)布以來,JVM JIT 的性能不斷提高,是無可爭議的成功產(chǎn)品。把 JVM 作為目標(biāo)平臺意味著大量的性能優(yōu)化工作可以「外包」給 JVM 來做,大大縮減了 Guest 語言的開發(fā)預(yù)算。

JVM 作為一個(gè)成熟的高層運(yùn)行環(huán)境,為 Guest 語言提供了很多運(yùn)行時(shí)所需要的服務(wù),比如內(nèi)存管理(有業(yè)界領(lǐng)先的垃圾回收等),很大程度上避免了額外的獨(dú)立開發(fā)。

社區(qū)龐大且成熟

JVM 有多個(gè)獨(dú)立實(shí)現(xiàn),也有若干廠商會持續(xù)推進(jìn),資料完備,社區(qū)巨大。
Java 社區(qū)有大量成熟的庫,一般來說,運(yùn)行在 JVM 上的其它語言都會設(shè)計(jì)一個(gè)專用的「橋」來幫助直接使用 Java 的庫。
Java 有成熟的開發(fā)工具和環(huán)境。

題外話

另外一個(gè)趨勢是把 Javascript 成為新的目標(biāo)平臺。很多主流語言都已經(jīng)出現(xiàn)了編譯器可以翻譯成 Javascript,這也是得益于近年來 Javascript 虛擬機(jī)性能的顯著提升。

List-of-languages-that-compile-to-JS:
https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS

下一代普遍可接受語言(next mass-appeal language)

下一代普遍可接受語言(next mass-appeal language)中,人的因素應(yīng)該起到重要作用。

  1. 新的程序設(shè)計(jì)語言中的代碼片段應(yīng)該具備一個(gè)典型程序員所希望的適度復(fù)雜性。程序員會去期望在每天的工作中使用的語言。
  2. 中級程序員認(rèn)可。所謂中級程序員是指那些普遍對博客、微博或者新語言不感興趣的人。
  3. 程序員可以不用別人的幫助或者接受培訓(xùn),就能對新的程序設(shè)計(jì)語言中的代碼片段的功能進(jìn)行合理的準(zhǔn)確的推測。

NBJL可以走多遠(yuǎn)就目前來看是難以下定論的,但是我相信這是一個(gè)比較實(shí)際的問題。我們所需要的新的程序設(shè)計(jì)語言能夠不需要大規(guī)模的培訓(xùn),程序員們可以快速上手。

在其功能方面,注諸如如下條目:

  • 類C的語法(很好用也很熟悉)
  • 靜態(tài)類型(動(dòng)態(tài)類型過于松散并且性能有限)
  • 遵循面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming,OOP)思想,并且包括函數(shù)式語言的元素(純函數(shù)式言非主流編程語言)
  • 易于反射獲得(從而避免靜態(tài)類型限制)
  • 屬性(getter和setter實(shí)在是太讓人討厭了)
  • 閉包
  • Null判斷(提供一個(gè)判斷變量能否為null的方式)
  • 并發(fā)(好過原始線程和共享可變狀態(tài)(shared mutable state))
  • 模塊化(需要考慮更大的單元)
  • 工具(希望新語言能夠?qū)τ诠ぞ唛_發(fā)有所幫助)
  • 可擴(kuò)展性(語言的設(shè)計(jì)具備很好的可擴(kuò)展性,以支持其上的二次開發(fā),而不需要去修改語言本身的設(shè)計(jì))
    ...

當(dāng)然還有其他一些可以討論的主題-語言設(shè)計(jì)其實(shí)堪比藝術(shù)品設(shè)計(jì),有太多角度可以觀察了。

9個(gè)殺手級 JVM 編程語言

Java虛擬機(jī)已經(jīng)不再是僅僅局限在 Java 了,很多語言提供了腳本轉(zhuǎn)換,可以讓其他的程序在java虛擬機(jī)上運(yùn)行,這樣能夠讓更多的開發(fā)者能夠依靠JVM在Java平臺上大有作為。而且虛擬機(jī)以及 對應(yīng)的字節(jié)碼都是開源的,所以你也能很容易地生成對應(yīng)字節(jié)碼來做一款屬于你自己的編程語言。我們今天來看看以下9種新的編程語言。

Groovy
Groovy是一個(gè)被編譯成字節(jié)碼的面向?qū)ο蟮恼Z言。它的語法風(fēng)格與java很像,但是又沒java那么混亂。Java程序員能夠很快的熟練使用 Groovy;實(shí)際上,Groovy編譯器是可以接受完全純粹的Java語法格式的,這樣能夠讓程序員在學(xué)習(xí)Groovy時(shí)不需要學(xué)習(xí)任何新語法。需要注 意使用Groovy的一個(gè)重要特點(diǎn)就是使用類型推斷,即能夠讓編譯器能夠在程序員沒有明確說明的時(shí)候推斷出變量的類型。同時(shí)Groovy也提供了一個(gè)高級 架構(gòu)來解決字符串處理,xml的序列化與反序列化以及單元測試等等 -- 所有的這一切好處都能為程序員節(jié)約不少時(shí)間。

JRuby
JRuby是用來橋接Java與Ruby的,它是使用比Groovy更加簡短的語法來編寫代碼,能夠讓每行代碼執(zhí)行更多的任務(wù)。就和Ruby一 樣,JRuby不僅僅只提供了高級的語法格式。它同樣提供了純粹的面向?qū)ο蟮膶?shí)現(xiàn),閉包等等,而且JRuby跟Ruby自身相比多了很多基于Java類庫 可以調(diào)用,雖然Ruby也有很多類庫,但是在數(shù)量以及廣泛性上是無法跟Java標(biāo)準(zhǔn)類庫相比的。

Jython
Jython,aka JPython,屬于第一種專門為JVM專用的腳本語言。它能夠用Python語言來高效生成動(dòng)態(tài)編譯的Java字節(jié)碼。一些可選的靜態(tài)編譯方式能夠被用 來開發(fā)applets,servlets,以及beans。作為Jython的首席程序員,Jim Hugunin,現(xiàn)在已經(jīng)停止了Jython的相關(guān)工作而去微軟干活。所以這門語言的發(fā)展僅僅也就從2005-2008年,所以就現(xiàn)在看來Jython已 經(jīng)無法與Groovy以及JRuby作為對手了。現(xiàn)在Jython可以在一些商業(yè)應(yīng)用中找到,也已經(jīng)得到了WebSphere Application Server以及IMB的商業(yè)Java EE產(chǎn)品部門的官方支持。

Clojure
Clojure是純粹的函數(shù)式編程語言。與Scala類似,Clojure已經(jīng)有很多內(nèi)置的并行運(yùn)行基礎(chǔ)建設(shè)能夠讓很多方法同時(shí)執(zhí)行。Clojure也是 被設(shè)計(jì)為生成通用語言,能夠生成.NET以及JavaScript。雖然Clojure也能被直接編譯成Java字節(jié)碼,但是無法使用動(dòng)態(tài)語言特性以及直 接調(diào)用Java類庫。與其他的JVM腳本語言不一樣,Clojure并不算是面向?qū)ο蟮摹?/p>

Scala
Scala經(jīng)常被我們描述為多模式的編程語言,因?yàn)樗旌狭藖碜院芏嗑幊陶Z言的元素的特征。但無論如何它本質(zhì)上還是一個(gè)純粹的面向?qū)ο笳Z言。它相比傳統(tǒng)編 程語言最大的優(yōu)勢就是提供了很好并行編程基礎(chǔ)框架措施了。這是唯一一個(gè)在JVM中擁有actors -- 另一種并行編程代碼生成器。Scala代碼能很好的被優(yōu)化成字節(jié)碼,運(yùn)行起來和原生Java一樣快。

Kotlin
Kotlin是靜態(tài)類型的語言,也可以編程成Java字節(jié)碼以及JavaScript,作為一個(gè)時(shí)髦又表現(xiàn)豐富的編程語言,Kotlin就是被設(shè)計(jì)用來生 產(chǎn)高性能要求的程序的,所以運(yùn)行起來和Java也是不相上下。Kotlin可以從 JetBrains InteilliJ Idea IDE這個(gè)開發(fā)工具以插件形式使用。

Rhino
Rhino是使用Java編寫的開源的JavaScript引擎。當(dāng)前是Mozilla公司在主導(dǎo)它的發(fā)展,Rhino的特點(diǎn)是為JavaScript加 了個(gè)殼,然后嵌入到Java中,這樣能夠讓Java程序員直接使用。其中Rhino的JavaAdapters能夠讓JavaScript通過調(diào)用 Java的類來實(shí)現(xiàn)特定的功能。

Ceylon
Ceylon是一個(gè)通用的,靜態(tài)類型編程語言,也是基于阻塞以及面向?qū)ο蟮?。?jù)說這個(gè)語言深受Java的影響,而且它一開始就是被Red Hat公司設(shè)計(jì)為給大型團(tuán)隊(duì)合作完成大型項(xiàng)目來的。Ceylon的主要努力方向是將語言變得更加可讀,更加可預(yù)期,更加工具化以及更加模塊化。據(jù) Gavin King所說,Ceylon將不僅僅只是個(gè)編譯器,而將是一個(gè)可以取代Java SDK的新Ceylon SDK。

Fantom
Fantom能夠在運(yùn)行時(shí)為JVM以及.NET或者JavaScript平臺生成字節(jié)碼,F(xiàn)antom是與Groovy以及JRuby差不多的一樣面向?qū)?象的編程語言,但是悲劇的是Fantom無法使用Java類庫,而是使用它自己擴(kuò)展的類庫。忘了說Fantom也包括actors,而且它最大的優(yōu)勢就是 在網(wǎng)站上有一個(gè)非常完備卓越的API文檔系統(tǒng)。

中文參考文檔:

https://github.com/MiniSpringBootTutorial/KotlinDoc-cn


Kotlin 開發(fā)者社區(qū)

國內(nèi)第一Kotlin 開發(fā)者社區(qū)公眾號,主要分享、交流 Kotlin 編程語言、Spring Boot、Android、React.js/Node.js、函數(shù)式編程、編程思想等相關(guān)主題。

開發(fā)者社區(qū) QRCode.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容