Kotlin极简教程(第一章 Kotlin简介)详解编程语言

1.1 kotlin简史

科特林岛(Котлин)是一座俄罗斯的岛屿,位于圣彼得堡以西约30公里处,形状狭长,东西长度约14公里,南北宽度约2公里,面积有16平方公里,扼守俄国进入芬兰湾的水道。科特林岛上建有喀琅施塔得市,为圣彼得堡下辖的城市。

1.1.1 Kotlin概述

我们这里讲的Kotlin,就是一门以这个Котлин岛命名的现代程序设计语言。它是一门静态类型编程语言,支持JVM平台,Android平台,浏览器JS运行环境,本地机器码等。支持与Java,Android 100% 完全互操作。

其主要设计者是来自 Saint Petersburg, Russia JetBrains团队的布雷斯拉夫( Andrey Breslav , https://www.linkedin.com/in/a… )等人,源码在github上,其实现主要是JetBrains团队成员以及开源贡献者。

在正式介绍Kotlin之前,让我们来看一下Kotlin的发展历史。

2011年7月,JetBrains推出Kotlin项目。

2012年2月,JetBrains以Apache 2许可证开源此项目。

2016年2月15日,Kotlin v1.0(第一个官方稳定版本)发布。

2017 Google I/O 大会,Kotlin “转正”,成为Android开发的官方语言。

Kotlin 具有很多下一代编程语言1静态语言特性:如类型推断、多范式支持、可空性表达、扩展函数、模式匹配等。

Kotlin的编译器kompiler可以被独立出来并嵌入到 Maven、Ant 或 Gradle 工具链中。这使得在 IDE 中开发的代码能够利用已有的机制来构建,可以在新环境中自由使用。

Kotlin以K字打头的用语,甚至连 contributors 这类词也改成了kontributors。

1.1.2 Kotlin 元年:2016

2016 年是 Kotlin “元年(First year of Kotlin)”,官网给出了这样一幅图来展示它一年来的成绩:

这里写图片描述

Kotlin 是由工程师设计,各种细节设计非常切合工程师的需要。语法近似 Java 和 Scala,且已活跃在 Android 开发领域,被誉为 Android 平台的 Swift。

设计Kotlin之初,主要是为了解决下面的一些问题:

  • 创建一种兼容 Java 的语言
  • 让它比 Java 更安全,能够静态检测常见的陷阱。如:引用空指针
  • 让它比 Java 更简洁,通过支持 variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation 等实现。
  • 让它比最成熟的竞争对手 Scala语言更加简单。

1.2 快速学习工具

1.2.1 云端IDE

未来的是云的世界。不需要搭建本地开发运行环境,直接用浏览器打开。当然Kotlin也是支持这种云端运行方式的。打开下面的地址:

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文件命令,这两个命令有点类似于Java的javac和java命令。分别是将文件编译成.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, 我们可以选择。

这里写图片描述

也可以选择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

1.2.4 使用Eclipse

使用Eclipse的开发者们,可以通过安装Kotlin插件来进行Kotlin程序的开发。但是,体验上要比使用IDEA逊色很多。如果您想完美体验Kotlin在IDE中的开发,强烈建议使用IDEA。JetBrains自家的东西,自然是比Eclipse支持的要好很多。

首先,打开Help > Eclipse Marketplace, 如下图:
这里写图片描述

在搜索框里输入Kotlin , 将得到如下结果。
这里写图片描述

点击Install, 等待完成安装,重启Eclipse。然后,选择Kotlin Perspective , 如下图:
这里写图片描述

这里写图片描述

然后我们就可以新建 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源码文件,如下图运行:
这里写图片描述

本节示例工程源码:https://github.com/EasyKotlin

1.2.5 使用Gradle构建Kotlin工程

在本节简单介绍一下使用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依赖

这里写图片描述

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/13030.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论