點擊這裏 > 去京東商城購買閱讀
點擊這裏 > 去天貓商城購買閱讀
科特林島(Котлин)是一座俄羅斯的島嶼,位於聖彼得堡以西約30千米處,形狀狹長,東西長度約14千米,南北寬度約2千米,面積有16平方千米,扼守俄國進入芬蘭灣的水道。科特林島上建有喀琅施塔得市,爲聖彼得堡下轄的城市。html
咱們這裏講的Kotlin,就是一門以這個Котлин島命名的現代程序設計語言。它是一門靜態類型編程語言,支持JVM平臺,Android平臺,瀏覽器JS運行環境,本地機器碼等。支持與Java,Android 100% 徹底互操做。前端
其主要設計者是來自 Saint Petersburg, Russia JetBrains團隊的佈雷斯拉夫( Andrey Breslav , https://www.linkedin.com/in/a... )等人,源碼在github上,其實現主要是JetBrains團隊成員以及開源貢獻者。java
認識一個事物的最好的方式,首先是取了解它的歷史。python
咱們先來簡單看一下來自wikipedia[0]的Kotlin簡歷:android
標題 | 內容 |
---|---|
設計者 | JetBrains |
實現者 | JetBrains與開源貢獻者 |
最新發行時間 | Kotlin 1.1.2(2017年4月25日,34天前) |
最新測試版發行日期 | Kotlin 1.1.3 EAP(2017年5月27日,2天前 [1]) |
類型系統 | 靜態類型 |
系統平臺 | 輸出Java虛擬機比特碼以及JavaScript源代碼 |
操做系統 | 任何支持JVM或是JavaScript的解釋器 |
許可證 | Apache 2 |
文件擴展名 | .kt |
網站 | kotlinlang.org |
啓發語言 | Java、Scala、Groovy、C#、Gosu |
(注:這裏的日期時間,取的是本書當時寫做時間)git
Kotlin的親爹是大名鼎鼎的Jetbrains公司。它有一系列耳熟能詳的產品,諸如Android程序員們每天用的Android Studio, Java程序員們每天用的IntelliJ IDEA, 還有前端的WebStorm, PhpStorm等等。因此說,使用IntelliJ IDEA了開發Kotlin程序將會很是便捷。程序員
Kotlin這個語言從一開始推出到現在,已經有六年了。官方正式發佈首個穩定版本的時間相對比較晚(2016.2),這是一門比較新的語言。其大體發展簡史以下:github
2011年7月,JetBrains推出Kotlin項目。算法
2012年2月,JetBrains以Apache 2許可證開源此項目。編程
2016年2月15日,Kotlin v1.0(第一個官方穩定版本)發佈。
2017 Google I/O 大會,Kotlin 「轉正」。
Kotlin 具備不少下一代編程語言1靜態語言特性:如類型推斷、多範式支持、可空性表達、擴展函數、模式匹配等。
Kotlin的編譯器kompiler能夠被獨立出來並嵌入到 Maven、Ant 或 Gradle 工具鏈中。這使得在 IDE 中開發的代碼可以利用已有的機制來構建,能夠在新環境中自由使用。
Kotlin以K字打頭的用語,甚至連 contributors 這類詞也改爲了kontributors。
2016 年是 Kotlin 「元年(First year of Kotlin)」,官網給出了這樣一幅圖來展現它一年來的成績:
Github 上面的代碼量破千萬,8000多基於kotlin項目。使用 Kotlin 的人逐漸增多。
Kotlin 是由工程師設計,各類細節設計很是切合工程師的須要。語法近似 Java 和 Scala,且已活躍在 Android 開發領域,被譽爲 Android 平臺的 Swift。
其主要設計目標:
- 建立一種兼容 Java 的語言
- 讓它比 Java 更安全,可以靜態檢測常見的陷阱。如:引用空指針
- 讓它比 Java 更簡潔,經過支持 variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation 等實現。
- 讓它比最成熟的競爭對手 Scala語言更加簡單。
Kotlin 的學習曲線極其平緩,學習量至關於一個框架。有經驗的程序員閱讀了文檔即刻上手。
工欲善其事必先利其器
將來的是雲的世界。不須要搭建本地開發運行環境,直接用瀏覽器打開
你就能夠直接使用雲端IDE來即時編寫Kotlin代碼,並運行之。一個運行示例以下圖:
Kotlin是運行在JVM環境下的語言。首先咱們要有JDK環境。
有時候咱們並不須要打開IDE來作一些事情。打開 IDE 是件很麻煩的事情,在某些場景下,咱們比較喜歡命令行。
使用命令行環境,咱們能夠方便地使用Kotlin REPL(Read-Eval-Print-Loop,交互式編程環境)。REPL能夠實時編寫Kotlin代碼,並查看運行結果。一般REPL交互方式能夠用於調試、測試以及試驗某種想法。
下面咱們講下怎麼搭建 Kotlin 命令行環境。
Kotlin 命令行環境主要依賴就是Kotlin Compiler,目前最新版本是 1.1.2-2。其下載連接是:
https://github.com/JetBrains/...
這個zip包裏面就是Kotlin Compiler的核心依賴jar包。解壓後,目錄結構以下:
. ├── bin │ ├── kotlin │ ├── kotlin.bat │ ├── kotlinc │ ├── kotlinc-js │ ├── kotlinc-js.bat │ ├── kotlinc-jvm │ ├── kotlinc-jvm.bat │ └── kotlinc.bat ├── build.txt ├── lib │ ├── allopen-compiler-plugin.jar │ ├── android-extensions-compiler.jar │ ├── kotlin-annotation-processing.jar │ ├── kotlin-ant.jar │ ├── kotlin-build-common-test.jar │ ├── kotlin-compiler-client-embeddable.jar │ ├── kotlin-compiler.jar │ ├── kotlin-daemon-client.jar │ ├── kotlin-jslib-sources.jar │ ├── kotlin-jslib.jar │ ├── kotlin-preloader.jar │ ├── kotlin-reflect.jar │ ├── kotlin-runner.jar │ ├── kotlin-runtime-sources.jar │ ├── kotlin-runtime.jar │ ├── kotlin-script-runtime-sources.jar │ ├── kotlin-script-runtime.jar │ ├── kotlin-stdlib-js-sources.jar │ ├── kotlin-stdlib-js.jar │ ├── kotlin-stdlib-sources.jar │ ├── kotlin-stdlib.jar │ ├── kotlin-test-js.jar │ ├── kotlin-test.jar │ ├── noarg-compiler-plugin.jar │ ├── sam-with-receiver-compiler-plugin.jar │ └── source-sections-compiler-plugin.jar └── license ├── LICENSE.txt ├── NOTICE.txt └── third_party ├── args4j_LICENSE.txt ├── asm_license.txt ├── closure-compiler_LICENSE.txt ├── dart_LICENSE.txt ├── jshashtable_license.txt ├── json_LICENSE.txt ├── maven_LICENSE.txt ├── pcollections_LICENSE.txt ├── prototype_license.txt ├── rhino_LICENSE.txt ├── scala_license.txt ├── trove_license.txt └── trove_readme_license.txt 4 directories, 50 files
其中,kotlinc,kotlin兩個命令就是Kotlin語言的編譯.kt文件和運行Kt.class文件命令。
咱們來看一下kotlinc的命令:
#!/usr/bin/env bash # ############################################################################## # Copyright 2002-2011, LAMP/EPFL # Copyright 2011-2015, JetBrains # # This is free software; see the distribution for copying conditions. # There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. ############################################################################## cygwin=false; case "`uname`" in CYGWIN*) cygwin=true ;; esac # Based on findScalaHome() from scalac script findKotlinHome() { local source="${BASH_SOURCE[0]}" while [ -h "$source" ] ; do local linked="$(readlink "$source")" local dir="$(cd -P $(dirname "$source") && cd -P $(dirname "$linked") && pwd)" source="$dir/$(basename "$linked")" done (cd -P "$(dirname "$source")/.." && pwd) } KOTLIN_HOME="$(findKotlinHome)" if $cygwin; then # Remove spaces from KOTLIN_HOME on windows KOTLIN_HOME=`cygpath --windows --short-name "$KOTLIN_HOME"` fi [ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx256M -Xms32M" declare -a java_args declare -a kotlin_args while [ $# -gt 0 ]; do case "$1" in -D*) java_args=("${java_args[@]}" "$1") shift ;; -J*) java_args=("${java_args[@]}" "${1:2}") shift ;; *) kotlin_args=("${kotlin_args[@]}" "$1") shift ;; esac done if [ -z "$JAVACMD" -a -n "$JAVA_HOME" -a -x "$JAVA_HOME/bin/java" ]; then JAVACMD="$JAVA_HOME/bin/java" fi declare -a kotlin_app if [ -n "$KOTLIN_RUNNER" ]; then java_args=("${java_args[@]}" "-Dkotlin.home=${KOTLIN_HOME}") kotlin_app=("${KOTLIN_HOME}/lib/kotlin-runner.jar" "org.jetbrains.kotlin.runner.Main") else [ -n "$KOTLIN_COMPILER" ] || KOTLIN_COMPILER=org.jetbrains.kotlin.cli.jvm.K2JVMCompiler java_args=("${java_args[@]}" "-noverify") kotlin_app=("${KOTLIN_HOME}/lib/kotlin-preloader.jar" "org.jetbrains.kotlin.preloading.Preloader" "-cp" "${KOTLIN_HOME}/lib/kotlin-compiler.jar" $KOTLIN_COMPILER) fi "${JAVACMD:=java}" $JAVA_OPTS "${java_args[@]}" -cp "${kotlin_app[@]}" "${kotlin_args[@]}"
咱們能夠看出,kotlinc是直接依賴java命令的,因此,使用Kotlin Compiler,首先要有JDK環境。
其中kotlin-preloader.jar、kotlin-compiler.jar是其入口依賴jar,入口類是org.jetbrains.kotlin.cli.jvm.K2JVMCompiler。
kotlin命令腳本以下
export KOTLIN_RUNNER=1 DIR="${BASH_SOURCE[0]%/*}" : ${DIR:="."} "${DIR}"/kotlinc "$@"
咱們能夠看出,直接是依賴kotlinc。在if邏輯代碼中:
if [ -n "$KOTLIN_RUNNER" ]; then java_args=("${java_args[@]}" "-Dkotlin.home=${KOTLIN_HOME}") kotlin_app=("${KOTLIN_HOME}/lib/kotlin-runner.jar" "org.jetbrains.kotlin.runner.Main")
從這個邏輯,咱們能夠看出,Kt.class在java命令執行前,須要從kotlin-runner.jar這個邏輯裏走一遍。同時,咱們也能知道Kt.class跟Java.class文件有着這個kotlin-runner.jar的邏輯映射上的區別。也就是說,Kotlin的Bytecode跟純的JVM bytecode存在一個kotlin-runner.jar的映射關係。
像scala,groovy等基於JVM的語言的compiler,runner,基本都採用這種運行方式。在實現細節上也許會有不一樣,總的思路是一致的。好比說,scalac的入口類
https://github.com/EasyKotlin/scala/blob/2.12.x/src/compiler/scala/tools/nsc/Main.scala
對應scalac中的命令行腳本是:
... execCommand \ "${JAVACMD:=java}" \ $JAVA_OPTS \ "${java_args[@]}" \ "${classpath_args[@]}" \ -Dscala.home="$SCALA_HOME" \ $OVERRIDE_USEJAVACP \ "$EMACS_OPT" \ $WINDOWS_OPT \ scala.tools.nsc.Main "$@" ...
咱們解壓完kotlin-compiler-1.1.2-2.zip,放到相應的目錄下。而後配置系統環境變量:
export KOTLIN_HOME=/Users/jack/soft/kotlinc export PATH=$PATH:$KOTLIN_HOME/bin
執行source ~/.bashrc
, 命令行輸入kotlinc
, 便可REPL環境,咱們能夠看到以下輸出:
$ kotlinc Welcome to Kotlin version 1.1.2-2 (JRE 1.8.0_40-b27) Type :help for help, :quit for quit >>> println("Hello,World") Hello,World >>>
而後,咱們就能夠像使用python,ruby,scala,groovy的REPL同樣去盡情享受Kotlin的編程樂趣了。
最新版本的IDEA已經默認集成了Kotlin環境。
咱們首先去下載安裝IntelliJ IDEA。下載頁面是:
https://www.jetbrains.com/ide...
若是您以前沒用過IDEA,如今想嘗試一下,能夠去下面這個頁面瞭解一下:
https://www.jetbrains.com/ide...
安裝完畢,而後點擊File > New > Project
, 咱們能夠選擇
Koltin: Kotlin(JVM), Kotlin(JavaScript)
以下圖所示
也能夠選擇Maven,Gradle構建工程。本書採用Gradle來構建工程。以下圖所示:
而後按照後續步驟操做,最後等待Gradle下載依賴,完成工程構建。咱們將獲得一個標準的Gradle工程。
咱們在src/main/kotlin
下面新建package
:com.easy.kotlin.chaptor1
而後新建HelloWorld.kt,編寫如下代碼
package com.easy.kotlin.chaptor1 /** * Created by jack on 2017/6/5. */ fun main(args:Array<String>){ println("Hello,World!") }
右擊運行該類,以下圖
咱們將會獲得輸出
咱們觀察IDEA控制檯輸出的執行日誌,能夠看出IDEA集成Kotlin環境使用的核心依賴jar包:
/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=65404:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/deploy.jar:... ... .../kotlin-stdlib-jre8-1.1.1.jar: .../kotlin-stdlib-jre7-1.1.1.jar: .../kotlin-stdlib-1.1.1.jar:... com.easy.kotlin.chaptor1.HelloWorldKt ... Hello,World! Process finished with exit code 0
本小節的示例工程代碼:https://github.com/EasyKotlin...
使用Eclipse的開發者們,能夠經過安裝Kotlin插件來進行Kotlin程序的開發。可是,體驗上要比使用IDEA遜色不少。若是您想完美體驗Kotlin在IDE中的開發,強烈建議使用IDEA。JetBrains自家的東西,天然是比Eclipse支持的要好不少。
咱們下面簡單介紹一下在Eclipse中開發Kotlin程序的方法。
首先,打開Help > Eclipse Marketplace
, 以下圖
在搜索框裏輸入Kotlin
, 將獲得以下結果
點擊Install
, 等待完成安裝,重啓Eclipse。
而後,選擇Kotlin Perspective
, 以下圖
點擊OK。下面咱們就能夠新建 Kotlin
工程了。以下圖
新建完工程,咱們將獲得以下結構的工程
咱們能夠看出,kotlin-runtime.jar
, kotlin-reflect.jar
,kotlin-script-runtime.jar
被加到了工程依賴庫裏。
這個配置是在.classpath
, .project
配置的。固然這些配置依賴庫,執行程序等等的工做是由Eclipse Kotlin插件完成的。
咱們在src
目錄新建一個package
: easy_kotlin_chatper_1
而後在此package
下面新建一個HelloWorld.kt
源碼文件,內容以下
package easy_kotlin_chatper_1 fun main(args: Array<String>){ println("Hello,Kotlin!") }
以下圖
右擊HelloWorld.kt
源碼文件,以下圖運行
若是一切正常,咱們將獲得以下輸出
Hello,Kotlin!
本節示例工程源碼:https://github.com/EasyKotlin...
咱們在上面小節中展現了使用IntelliJ IDEA創建一個Kotlin Gradle工程的步驟。咱們在本節簡單介紹一下使用Gradle構建Kotlin工程的配置。這個配置主要在build.gradle文件中。
其中,構建過程的核心依賴配置以下:
buildscript { ext.kotlin_version = '1.1.1' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } }
kotlin-gradle-plugin完成了Gradle構建Kotlin工程的全部依賴構建執行的相關工做。
而後,使用Gradle java、kotlin插件:
apply plugin: 'java' apply plugin: 'kotlin'
固然,若是咱們同時想使用Groovy語言,加上
apply plugin: 'groovy'
源代碼JDK兼容性配置兼容1.8日後的版本:
sourceCompatibility = 1.8
配置Maven倉庫:
repositories { mavenCentral() }
工程依賴:
dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" compile 'org.codehaus.groovy:groovy-all:2.3.11' testCompile group: 'junit', name: 'junit', version: '4.12' }
其中,kotlin-stdlib-jre8是Kotlin JVM執行環境依賴。
org.jetbrains.kotlin:kotlin-stdlib-js是Kotlin JS執行環境依賴。
咱們能夠經過Gradle項目的依賴樹看出kotlin-stdlib-jre8依賴
org.jetbrains.kotlin:kotlin-stdlib:1.1.1
以下圖
kotlin-stdlib是Kotlin運行環境的標準庫。
學習一門語言大概會經歷以下幾步。
1.基本語法
學習任何東西,都是一個由表及裏的過程。學習一門編程語言也同樣。對於一門編程語言來講,「表」 就是基本詞彙和語法。
對於基礎語法的學習,咱們能夠看一些簡短而又系統的教程。
2.編碼實踐
所謂「紙上得來終覺淺,絕知此事要躬行」是也。此處就很少說。
掌握基礎,持續練習
每一門編程語言的學習內容都會涉及:
運行環境
數據類型(數字、字符串、數組、集合、映射字典等)
表達式
函數
流程控制
類、方法
等等,不一樣的語言還有一些不一樣的特性,能夠經過對比學習來加深理解。並經過大量實踐深刻理解,達到熟練使用。後面還要再去深刻了解面向對象編程OOP、函數式編程FP、併發、異常、文件IO、網絡、標準庫等內容,並輔以持續的練習,這些內容纔可以讓你真正進入編程領域並作出實際的軟件。
相信10000小時定律,No Pain, No Gain。
學習一門新的語言的時候,要利用之前所學的語言的功底,可是也要保持開放的心態。這些在認知心理學中有相應的講述。感興趣的讀者能夠去了解一下。
3.技近乎道
基礎語法學習,能讓你快速上手,應用實踐。對技巧和坑的關注,必定程度上拓展了你的知識面。系統學習,一方面會進一步拓展你的知識面。另外一方面,也有利於你語言知識結構的造成。
任何一門成熟語言,都有其特有的生態。這個生態包括: 框架,擴展包,解決方案,模式, 規範等。
在不斷編碼實踐過程當中,咱們逐步熟練使用不少API庫、框架,也不斷踩坑填坑、看源代碼、不斷解決問題,不斷加深對語言的理解,同時會看一些優秀的框架源代碼。
若是還有精力,咱們再去學習語言更底層的東西,而不只僅停留在應用層面。如Java中的集合類實現的算法與數據結構,如JVM是如何執行Java代碼的。如Java的線程和操做系統線程的關係。以及一些操做系統方面的知識。
最後,達到遊刃有餘的境界。這一層級,基本可入武林高手之列了。
庖丁釋刀對曰:「臣之所好者,道也,進乎技矣。始臣之解牛之時,所見無非牛者。三年以後,何嘗見全牛也。方今之時,臣以神遇而不以目視,官知止而神欲行。依乎天理,批大郤,導大窾,因其當然,技經肯綮之何嘗,而況大軱乎!
這裏的「牛」,能夠理解爲咱們所說的各類編程思想,編程範式,編程方法,編程技巧等等。最後,達到「運用之妙,存乎一心」之境也。
4.創造新世界
編程的本質就是創造世界。
達到這個境界的,基本都是世界頂尖大牛了。
例如,編程語言發展史上的傑出人物(下面只是一份不徹底名單):
約翰·馮·諾伊曼: 操做系統概念的發起者 肯·湯普遜&丹尼斯·裏奇: 發明了C和Unix 約翰·巴科斯:發明了Fortran 阿蘭·庫珀:開發了Visual Basic 詹姆斯·高斯林:開發了Oak,即後來的Java 安德斯·海爾斯伯格:開發了Turbo Pascal、Delphi,以及C# 葛麗絲·霍普,開發了Flow-Matic,該語言對COBOL形成了影響 肯尼斯·艾佛森:,開發了APL,並與Roger Hui合做開發了J 比爾·喬伊:發明了vi,BSD,Unix的前期做者,以及SunOS的發起人,該操做系統後來更名爲Solaris 艾倫·凱:開創了面向對象編程語言,以及Smalltalk的發起人 Brian Kernighan:與丹尼斯·裏奇合著第一本C程序設計語言的書籍,同時也是AWK與AMPL程序設計語言的共同做者 約翰·麥卡錫:發明了LISP 比雅尼·斯特勞斯特魯普:開發了C++ 尼克勞斯·維爾特:發明了Pascal與Modula 拉里·沃爾:創造了Perl與Perl 6 吉多·範羅蘇姆:創造了Python ......
這些人,都在創造一個美妙的思惟邏輯之塔,創造一個新世界。正是這些各個編程領域的引領者們,才使得咱們這個世界更加美好。
本章咱們簡單介紹了Kotlin語言的發展過程,以及Kotlin開發環境的搭建方法。簡單總結了學習一門編程語言的基本過程。咱們的這本書基本是按照這個思路組織架構的。
咱們將在下一章進入快速開始:Hello,World!
感謝您的閱讀!恭喜您已經正式開啓Kotlin世界之旅,但願本書可以幫到您的學習,哪怕是一點點啓發也倍感欣慰。
本書所涉及到的示例工程代碼統一放在這裏:https://github.com/EasyKotlin
1.http://www.onboard.jetbrains....
2.https://medium.com/@octskywar...