不使用虚拟机的 Kotlin
Kotlin/Native 技术预告版:不使用虚拟机的 Kotlin
我们很高兴发布 Kotlin/Native 的第一个技术预告版,它直接将 Kotlin 编译成机器码。Kotlin/Native 编译器将编译出不依赖于任何虚拟机运行的可执行程序。
现在还不是完整的功能发布,但是你现在已经可以使用这一技术并且在这里阅读它的源码。编译器可在Apache 2 OSS 许可证下使用。
任务
Kotlin/Native 是使现代应用随处可以使用 Kotlin 的另外一步。最终,使用 Kotlin 编写每一个组件成为可能,从服务器后端程序到 web 应用或者移动客户端。共享技能集是整个计划的重要动机之一。另一个是共享真实代码。
我们跨平台代码重用的愿景这样的:你可以使用 Kotlin 以平台独立的方式编写整个模块,然后将它们编译成任何支持的平台(目前支持的平台有 Kotlin/JVM, Kotlin/JS 和即将出来的 Kotlin/Native)。我们将这些称为通用模块。通用模块的一部分可能需要平台相关的实现,这一部分可以为单独为每一个平台开发。通用模块为客户端提供通用接口,但是其他的模块(平台相关)可以扩展这些接口来提供一些平台专有的能力。
注意我们不想专门使 Kotlin/JVM 程序在 Kotlin/Native 或者 Kotlin/JS 上运行。因为那样相当于实现另外一个 JVM,这有很多工作同时对运行时也意味着很多限制。我们以另外一种方式实现:为所有平台提供一种通用语言,同时允许通过和平台语言之间的无缝交互创建通用库。
技术
Kotlin/Native 使用 LLVM 编译器来生成机器码。在该预告版本中,我们支持以下目标平台:
- Mac OS X 10.10 及以后的版本(x86-64)
- x86-64 Ubuntu Linux(14.04, 16.04及以后的版本),其他的 Linux 发行版本也许也可以
- Apple iOS(arm64),在 MacOS X 宿主上编译
- 树莓派,在 Linux 宿主上编译
更多的平台可以相对容易的添加进来,只要 LLVM 对它们支持。以后我们也许会支持更多的平台开箱即用。
通常,内部交互是我们的第一优先级,所以 Kotlin/Native 可以高效的调用 C 语言函数,并且向他们传递数据或者从它们那里读取数据。你可以在编译时通过一个 C 头文件生成 Kotlin bindings, 也可以快速安全访问目标平台的任何 native 接口。详细的使用说明参考这里
内存管理
Kotlin/Native 的设计潜在允许不同的平台使用不同的内存管理方案。例如,未来在服务器以及桌面平台上使用跟踪式的 GC 也许是有意义的,同时在 iOS 上使用 ARC 也许更有意义。有的平台也许仅仅需要手动管理内存,结果将使用一个甚至更小的 Kotlin/Native 运行时。
这个技术预览版本通过一个顶层的循环搜集器实现自动引用计数,但是现在还不知道最终的内存管理方案会是什么样子。
目前的局限
如上所述,Kotlin/Native 还非常不完整,所以这个技术预览版存在一些局限,这些局限在后续会消除:
- 还没有做任何性能优化,所以现在用标准去衡量 Kotlin/Native 没有任何意义
- 标准库和反射支持还非常不完整,后续会添加更多接口。
- 更多信息参考 Release Notes
未来计划
我们现在在开发 Kotlin/Native 的核心技术,这些技术对所有的目标平台都是一样的(编译器、核心运行时和库)。作为未来可能的工作,我们在考虑以下可能的用例:
- iOS应用(复用 Android 的代码)
- 嵌入式系统/物联网(例如:Ardunio 和 beyond)
- 数据分析和科学计算
- 服务端微服务
- 游戏开发
How to try
我们已经为 Mac 和 iOS 平台 以及 Linux 和 树莓派 准备了压缩包,包含编译器、示例和文档。
更多说明请查阅 Github 项目和 Release Notes