《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))
}

“我真正关心的是Java虚拟机的概念,因为是它把所有的东西都联系在了一起;是它造就了Java语言;是它使得事物能在所有的异构平台上得到运行;也还是它使得所有类型的语言能够共存。” ( James Gosling, Java之父 (2011, ServerSide))

JetBrains开源其Kotlin语言 基于JVM的新编程语言。
Kotlin,类似 Xtend 一样,旨在提供一种更好的 Java 而非重建整个新平台。这两种语言都向下编译为字节码(虽然 Xtend 是首先转换成相应的 Java 代码,再让 Java 编译器完成繁重的工作),而且两者都引入了函数和扩展函数(在某个有限范围内静态地增加一个新方法到某个已有类型的能力)。Xtend 是基于 Eclipse 的,而 Kotlin 是基于 IntelliJ 的,两者都提供无界面构建。能够首先演变到其他 IDE 的语言有可能成为最后的赢家。

Kotlin1.1发布日志(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 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。

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

其主要设计目标:

创建一种兼容 Java 的语言

让它比 Java 更安全,能够静态检测常见的陷阱。如:引用空指针

让它比 Java 更简洁,通过支持 variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation 等实现。

让它比最成熟的竞争对手 Scala语言更加简单。

一个非常好的交互式Kotlin学习教程:
http://try.kotlinlang.org/

此开篇第一回也。

kotlin的定位非常有特点,它并不像是scala另起炉灶,将类库,尤其是集合类都自己来了一遍.
kotlin是对现有java的增强,通过扩展方法给java提供了很多诸如fp之类的特性,但同时始终保持对java的兼容.
这是kotlin官网首页重点强调的:

100% interoperable with Java™

这意味着什么呢?或者换个问法:我什么时候可以开始在我的项目中引入kotlin呢?
我的回答是:现在,立刻,马上!

上个图。

JVM语言家族

JVM语言家族

一个完整的语言有:

前端、优化、后端、runtime、库

JVM生态体系,把后面四个都给包办了。

jvm(Java虚拟机),是用C写的,跟操作系统打交道C/C++目前看来,是好的选择。虚拟机就是java与操作系统的中间层。

库/API就基本是java自身封装实现。

从最初的Jython和JRuby,到Scala,Clojure都是在JVM上实现的语言。为什么它们选择JVM?

跨平台

你的语言编译器后端只需要输出 JVM 字节码就可以。跨平台需要极大的工作量(这个轮子,造起来有点耗时耗力)

JIT (Just-In-Time 即时编译)性能

JIT 可以在运行中记录程序运行的特征,并在其基础上做大量的优化(Java 企业级应用的优秀性能很大程度上是由此而来)。 JIT 自从 HotSpot JVM 随 Java 1.2 发布以来,JVM JIT 的性能不断提高,是无可争议的成功产品。把 JVM 作为目标平台意味着大量的性能优化工作可以「外包」给 JVM 来做,大大缩减了 Guest 语言的开发预算。

JVM 作为一个成熟的高层运行环境,为 Guest 语言提供了很多运行时所需要的服务,比如内存管理(有业界领先的垃圾回收等),很大程度上避免了额外的独立开发。

社区庞大且成熟

JVM 有多个独立实现,也有若干厂商会持续推进,资料完备,社区巨大。
Java 社区有大量成熟的库,一般来说,运行在 JVM 上的其它语言都会设计一个专用的「桥」来帮助直接使用 Java 的库。
Java 有成熟的开发工具和环境。

题外话

另外一个趋势是把 Javascript 成为新的目标平台。很多主流语言都已经出现了编译器可以翻译成 Javascript,这也是得益于近年来 Javascript 虚拟机性能的显著提升。

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)中,人的因素应该起到重要作用。

  1. 新的程序设计语言中的代码片段应该具备一个典型程序员所希望的适度复杂性。程序员会去期望在每天的工作中使用的语言。
  2. 中级程序员认可。所谓中级程序员是指那些普遍对博客、微博或者新语言不感兴趣的人。
  3. 程序员可以不用别人的帮助或者接受培训,就能对新的程序设计语言中的代码片段的功能进行合理的准确的推测。

NBJL可以走多远就目前来看是难以下定论的,但是我相信这是一个比较实际的问题。我们所需要的新的程序设计语言能够不需要大规模的培训,程序员们可以快速上手。

在其功能方面,注诸如如下条目:

  • 类C的语法(很好用也很熟悉)
  • 静态类型(动态类型过于松散并且性能有限)
  • 遵循面向对象程序设计(Object Oriented Programming,OOP)思想,并且包括函数式语言的元素(纯函数式言非主流编程语言)
  • 易于反射获得(从而避免静态类型限制)
  • 属性(getter和setter实在是太让人讨厌了)
  • 闭包
  • Null判断(提供一个判断变量能否为null的方式)
  • 并发(好过原始线程和共享可变状态(shared mutable state))
  • 模块化(需要考虑更大的单元)
  • 工具(希望新语言能够对于工具开发有所帮助)
  • 可扩展性(语言的设计具备很好的可扩展性,以支持其上的二次开发,而不需要去修改语言本身的设计)
    ...

当然还有其他一些可以讨论的主题-语言设计其实堪比艺术品设计,有太多角度可以观察了。

9个杀手级 JVM 编程语言

Java虚拟机已经不再是仅仅局限在 Java 了,很多语言提供了脚本转换,可以让其他的程序在java虚拟机上运行,这样能够让更多的开发者能够依靠JVM在Java平台上大有作为。而且虚拟机以及 对应的字节码都是开源的,所以你也能很容易地生成对应字节码来做一款属于你自己的编程语言。我们今天来看看以下9种新的编程语言。

Groovy
Groovy是一个被编译成字节码的面向对象的语言。它的语法风格与java很像,但是又没java那么混乱。Java程序员能够很快的熟练使用 Groovy;实际上,Groovy编译器是可以接受完全纯粹的Java语法格式的,这样能够让程序员在学习Groovy时不需要学习任何新语法。需要注 意使用Groovy的一个重要特点就是使用类型推断,即能够让编译器能够在程序员没有明确说明的时候推断出变量的类型。同时Groovy也提供了一个高级 架构来解决字符串处理,xml的序列化与反序列化以及单元测试等等 -- 所有的这一切好处都能为程序员节约不少时间。

JRuby
JRuby是用来桥接Java与Ruby的,它是使用比Groovy更加简短的语法来编写代码,能够让每行代码执行更多的任务。就和Ruby一 样,JRuby不仅仅只提供了高级的语法格式。它同样提供了纯粹的面向对象的实现,闭包等等,而且JRuby跟Ruby自身相比多了很多基于Java类库 可以调用,虽然Ruby也有很多类库,但是在数量以及广泛性上是无法跟Java标准类库相比的。

Jython
Jython,aka JPython,属于第一种专门为JVM专用的脚本语言。它能够用Python语言来高效生成动态编译的Java字节码。一些可选的静态编译方式能够被用 来开发applets,servlets,以及beans。作为Jython的首席程序员,Jim Hugunin,现在已经停止了Jython的相关工作而去微软干活。所以这门语言的发展仅仅也就从2005-2008年,所以就现在看来Jython已 经无法与Groovy以及JRuby作为对手了。现在Jython可以在一些商业应用中找到,也已经得到了WebSphere Application Server以及IMB的商业Java EE产品部门的官方支持。

Clojure
Clojure是纯粹的函数式编程语言。与Scala类似,Clojure已经有很多内置的并行运行基础建设能够让很多方法同时执行。Clojure也是 被设计为生成通用语言,能够生成.NET以及JavaScript。虽然Clojure也能被直接编译成Java字节码,但是无法使用动态语言特性以及直 接调用Java类库。与其他的JVM脚本语言不一样,Clojure并不算是面向对象的。

Scala
Scala经常被我们描述为多模式的编程语言,因为它混合了来自很多编程语言的元素的特征。但无论如何它本质上还是一个纯粹的面向对象语言。它相比传统编 程语言最大的优势就是提供了很好并行编程基础框架措施了。这是唯一一个在JVM中拥有actors -- 另一种并行编程代码生成器。Scala代码能很好的被优化成字节码,运行起来和原生Java一样快。

Kotlin
Kotlin是静态类型的语言,也可以编程成Java字节码以及JavaScript,作为一个时髦又表现丰富的编程语言,Kotlin就是被设计用来生 产高性能要求的程序的,所以运行起来和Java也是不相上下。Kotlin可以从 JetBrains InteilliJ Idea IDE这个开发工具以插件形式使用。

Rhino
Rhino是使用Java编写的开源的JavaScript引擎。当前是Mozilla公司在主导它的发展,Rhino的特点是为JavaScript加 了个壳,然后嵌入到Java中,这样能够让Java程序员直接使用。其中Rhino的JavaAdapters能够让JavaScript通过调用 Java的类来实现特定的功能。

Ceylon
Ceylon是一个通用的,静态类型编程语言,也是基于阻塞以及面向对象的。据说这个语言深受Java的影响,而且它一开始就是被Red Hat公司设计为给大型团队合作完成大型项目来的。Ceylon的主要努力方向是将语言变得更加可读,更加可预期,更加工具化以及更加模块化。据 Gavin King所说,Ceylon将不仅仅只是个编译器,而将是一个可以取代Java SDK的新Ceylon SDK。

Fantom
Fantom能够在运行时为JVM以及.NET或者JavaScript平台生成字节码,Fantom是与Groovy以及JRuby差不多的一样面向对 象的编程语言,但是悲剧的是Fantom无法使用Java类库,而是使用它自己扩展的类库。忘了说Fantom也包括actors,而且它最大的优势就是 在网站上有一个非常完备卓越的API文档系统。

中文参考文档:

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


Kotlin 开发者社区

国内第一Kotlin 开发者社区公众号,主要分享、交流 Kotlin 编程语言、Spring Boot、Android、React.js/Node.js、函数式编程、编程思想等相关主题。

开发者社区 QRCode.jpg

推荐阅读更多精彩内容