引子
Kotlin 1.2 的发版节奏越来越快了。从 16 年 2 月 19 日发布 1.0 到 17 年 3 月 14 日发布 1.1,这次只花了半年多的时间,厉害了。1.1 发布的时候让人比较激动的是有了协程这样一个杀手级的特性,以及正式支持的 JavaScript Target,那么现在半年过去了,Native 搞得风生水起,1.2 又会给我们带来什么呢?
跨平台新特性
Kotlin 官方的这个跨平台的概念,大家要与 RN 这类深度定制的框架区别开来,Kotlin 的跨平台范畴只在逻辑代码层面 —— 当然,如果有哪个第三方针对不同平台的 API (例如 UI)做了适配,那么就有了 Kotlin 版本类似 “RN” 这样的东西,那是另一码事了。
看图就知道,这个跨平台的思路其实与 C 跨平台的思路很像,我们只写通用逻辑来跨平台,至于一些与平台交互紧密的部分,使用相应的 Native 代码完成就好了。
例如我要写一个图像识别的算法实现,这个算法是通用的,也基本上不依赖平台的 API,我就把它写到 Common 这个模块当中,那么你可以选择把我这个模块的代码编译成 Java 虚拟机字节码,或者 js,甚至将来的机器码,就这样代码就实现了复用,很轻松的那种复用。
这事儿要放到之前,还是有些麻烦的,作为一门语言本身,Kotlin 有自己的标准库,但标准库本身也是与平台挂钩的。所以在 1.2 之前如果你想要做到复用,那么你需要小心,你的算法里面用到 java.lang.Math 这个类了么?JavaScript 里面可没有一个完全相同的类啊。所以在 1.2 当中,Kotlin 启用了一对儿关键字: expect
和 actual
,方便通用模块使用平台模块中提供的平台相关的实现,这里就不具体展开啦。
这个特性现在看来其实还不算多么强势,可能要等到对 Kotlin Native 支持之后,同样一段逻辑代码可以很方便地在 Java 虚拟机和 C 环境下切换,那么 Android 和 iOS 除了一些平台相关的 UI 之类的东西还需要分开写,其他的可以直接共享。所以这一招很有意义。
后面有空的话我也会专门写一篇文章介绍这个内容。
协程还是实验特性
协程是 1.1 开始支持的,我写第一篇文章介绍协程的时候还没有标上 “experimental”,结果过了几天回来一看,嘿,以前的代码都编不过了,所有的包名都在原有的基础上做了调整 —— 这是发生在今年过年那几天的事儿。
当时原本以为 1.2 就可以去掉 “experimental”,官方当时也表示基本大概差不多会在 1.2 转正,然而并没有。原因吧,我觉得一方面是标准库的 API 倒是没啥毛病,但作为普通开发者必备的 kotlinx.coroutines 对于 JavaScript 的支持还没断奶;再一个就是,Kotlin 协程 API 和 协程库的使用率不高,这个也跟它本身对大家(”大家“主要是 Android 开发者)来说是一个不太常见的东西有关系。
反正就是还没有正式毕业吧,但作为实习生,Kotlin 的协程本身在 Jvm 上面的表现已经很稳定了,投入生产没毛病,就算将来转正,API 也会在一段时间内保持兼容,大可不必担心。
可以直接创建 Kotlin DSL 的 Gradle 工程
安装 1.2 插件之后,我们发现 IntelliJ 开始允许大家创建 Kotlin DSL Gradle 工程,这意味着,Kotlin DSL 作为 Gradle 的脚本语言已经可以正式在生产环境中使用啦。尽管我在生产环境中暂时还不会选择这个构建工程,不过,谁知道几个月之后会不会呢。
Kotlin 的发版节奏在加速
- Kotlin 的 1.0 版是一个重要的版本(废话),所以从 Github 上的第一笔提交到发版用了 5 年半的时间
- 1.1 用了 13 个月
- 1.2 用了 8 个月
- 1.3 呢?明年清明节?
Kotlin 尽管版本迭代的速度明显变快,但产出也基本符合预期,比如今年拿出来的 Native(最近已经 0.4,并开始有 IDE 支持) 和跨平台特性,很不错。后续 Jvm 上面的新特性迭代应该放缓了,主要以维稳为主;JavaScript 的工作量也还是有的,例如协程、反射等的完善,以及对生态的更好的支持之类;Native 应该算是一个发力点,所以后面我觉得大家应该重点期待一下这个。
当然,现在人工智能这么火,也许出一套 Kotlin 版本的 TensorFlow 的 API (不要 Java 那个的),也许会比较有意思。
其他
1.2 当然也优化了编译的性能,也支持了注解当中数组的语法,增加了对 lateinit
类型变量是否初始化的判断等等,这些内容比较细节,我们就不在这里啰嗦了。