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

第1章 Kotlin簡介


《Kotlin極簡教程》正式上架:

點擊這裏 > 去京東商城購買閱讀

點擊這裏 > 去天貓商城購買閱讀

很是感謝您親愛的讀者,你們請多支持!!!有任何問題,歡迎隨時與我交流~


1.1 kotlin簡史

1.1.1 Kotlin概述

科特林島(Котлин)是一座俄羅斯的島嶼,位於聖彼得堡以西約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。

1.1.2 Kotlin 元年:2016

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 的學習曲線極其平緩,學習量至關於一個框架。有經驗的程序員閱讀了文檔即刻上手。

1.2 快速學習工具

工欲善其事必先利其器

1.2.1 雲端IDE

將來的是雲的世界。不須要搭建本地開發運行環境,直接用瀏覽器打開

https://try.kotlinlang.org/

你就能夠直接使用雲端IDE來即時編寫Kotlin代碼,並運行之。一個運行示例以下圖:

1.2.2 本地命令行環境搭建

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的編程樂趣了。

1.2.3 使用IntelliJ IDEA

最新版本的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...

1.2.4 使用Eclipse

使用Eclipse的開發者們,能夠經過安裝Kotlin插件來進行Kotlin程序的開發。可是,體驗上要比使用IDEA遜色不少。若是您想完美體驗Kotlin在IDE中的開發,強烈建議使用IDEA。JetBrains自家的東西,天然是比Eclipse支持的要好不少。

咱們下面簡單介紹一下在Eclipse中開發Kotlin程序的方法。

首先,打開Help > Eclipse Marketplace, 以下圖

螢幕快照 2017-06-05 23.31.38.png

在搜索框裏輸入Kotlin , 將獲得以下結果

螢幕快照 2017-06-05 23.33.09.png

點擊Install, 等待完成安裝,重啓Eclipse。

而後,選擇Kotlin Perspective , 以下圖

螢幕快照 2017-06-06 00.01.35.png

螢幕快照 2017-06-06 00.02.02.png

點擊OK。下面咱們就能夠新建 Kotlin 工程了。以下圖

螢幕快照 2017-06-06 00.18.29.png

新建完工程,咱們將獲得以下結構的工程

螢幕快照 2017-06-05 23.58.32.png

咱們能夠看出,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!")
}

以下圖

螢幕快照 2017-06-06 00.05.07.png

右擊HelloWorld.kt源碼文件,以下圖運行

螢幕快照 2017-06-06 00.04.30.png

若是一切正常,咱們將獲得以下輸出

Hello,Kotlin!

本節示例工程源碼:https://github.com/EasyKotlin...

1.2.5 使用Gradle構建Kotlin工程

咱們在上面小節中展現了使用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.6 編程語言學習小結

學習一門語言大概會經歷以下幾步。

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...

3.http://kotlinlang.org/docs/tu...

4.http://hadihariri.com/2013/12...

相關文章
相關標籤/搜索