16.3 Kotlin Native 编译器 konan 简介
本小节我们简单介绍一下Kotlin Native 编译器的相关内容(主要以 Mac OS 平台示例)。
bin目录
bin目录下面是执行命令行
cinterop klib konanc kotlinc kotlinc-native run_konan
run_konan
是真正的入口 shell,它的执行逻辑是
TOOL_NAME="$1"
shift
if [ -z "$JAVACMD" -a -n "$JAVA_HOME" -a -x "$JAVA_HOME/bin/java" ]; then
JAVACMD="$JAVA_HOME/bin/java"
else
JAVACMD=java
fi
[ -n "$JAVACMD" ] || JAVACMD=java
...
java_opts=(-ea \
-Xmx3G \
"-Djava.library.path=${NATIVE_LIB}" \
"-Dkonan.home=${KONAN_HOME}" \
-Dfile.encoding=UTF-8)
KONAN_JAR="${KONAN_HOME}/konan/lib/backend.native.jar"
KOTLIN_JAR="${KONAN_HOME}/konan/lib/kotlin-compiler.jar"
STUB_GENERATOR_JAR="${KONAN_HOME}/konan/lib/StubGenerator.jar"
INTEROP_INDEXER_JAR="${KONAN_HOME}/konan/lib/Indexer.jar"
INTEROP_JAR="${KONAN_HOME}/konan/lib/Runtime.jar"
HELPERS_JAR="${KONAN_HOME}/konan/lib/helpers.jar"
KLIB_JAR="${KONAN_HOME}/konan/lib/klib.jar"
UTILITIES_JAR="${KONAN_HOME}/konan/lib/utilities.jar"
KONAN_CLASSPATH="$KOTLIN_JAR:$INTEROP_JAR:$STUB_GENERATOR_JAR:$INTEROP_INDEXER_JAR:$KONAN_JAR:$HELPERS_JAR:$KLIB_JAR:$UTILITIES_JAR"
TOOL_CLASS=org.jetbrains.kotlin.cli.utilities.MainKt
LIBCLANG_DISABLE_CRASH_RECOVERY=1 \
$TIMECMD "$JAVACMD" "${java_opts[@]}" "${java_args[@]}" -cp "$KONAN_CLASSPATH" "$TOOL_CLASS" "$TOOL_NAME" "${konan_args[@]}"
我们可以看出,Kotlin Native 编译器 konan 的运行环境还是在 JVM 上,但是它生成的机器码的可执行程序是直接运行在对应的平台系统上(直接编译成机器语言)。
konan目录
konan目录是 Kotlin Native 编译器的核心实现部分。目录结构如下:
kotlin-native-macos-0.3$ tree konan
konan/
├── konan.properties
├── lib
│ ├── Indexer.jar
│ ├── Runtime.jar
│ ├── StubGenerator.jar
│ ├── backend.native.jar
│ ├── callbacks
│ │ └── shared
│ │ └── libcallbacks.dylib
│ ├── clangstubs
│ │ └── shared
│ │ └── libclangstubs.dylib
│ ├── helpers.jar
│ ├── klib.jar
│ ├── kotlin-compiler.jar
│ ├── protobuf-java-2.6.1.jar
│ └── utilities.jar
└── nativelib
├── libcallbacks.dylib
├── libclangstubs.dylib
├── libllvmstubs.dylib
└── liborgjetbrainskotlinbackendkonanhashstubs.dylib
6 directories, 16 files
我们可以看到在 run_konan
命令行 shell 中依赖了上面的这些 jar 包。上面的目录文件是 Mac OS 平台上的。
对应的 Linux 平台上的konan目录文件如下
kotlin-native-linux-0.3$ tree konan
konan
├── konan.properties
├── lib
│ ├── Indexer.jar
│ ├── Runtime.jar
│ ├── StubGenerator.jar
│ ├── backend.native.jar
│ ├── callbacks
│ │ └── shared
│ │ └── libcallbacks.so
│ ├── clangstubs
│ │ └── shared
│ │ └── libclangstubs.so
│ ├── helpers.jar
│ ├── klib.jar
│ ├── kotlin-compiler.jar
│ ├── protobuf-java-2.6.1.jar
│ └── utilities.jar
└── nativelib
├── libcallbacks.so
├── libclangstubs.so
├── libllvmstubs.so
└── liborgjetbrainskotlinbackendkonanhashstubs.so
6 directories, 16 files
Windows 平台上的 konan 目录文件如下
kotlin-native-windows-0.3$ tree konan
konan
├── konan.properties
├── lib
│ ├── Indexer.jar
│ ├── Runtime.jar
│ ├── StubGenerator.jar
│ ├── backend.native.jar
│ ├── callbacks
│ │ └── shared
│ │ └── callbacks.dll
│ ├── clangstubs
│ │ └── shared
│ │ └── clangstubs.dll
│ ├── helpers.jar
│ ├── klib.jar
│ ├── kotlin-compiler.jar
│ ├── protobuf-java-2.6.1.jar
│ └── utilities.jar
└── nativelib
├── callbacks.dll
├── clangstubs.dll
├── llvmstubs.dll
└── orgjetbrainskotlinbackendkonanhashstubs.dll
6 directories, 16 files
klib 目录
klib 目录下是 Kotlin 的标准库的关联元数据文件以及 Kotlin Native 针对各个目标平台的 bc 文件
kotlin-native-macos-0.3$ tree klib
klib/
└── stdlib
├── linkdata
│ ├── module
│ ├── package_konan
│ ├── package_konan.internal
│ ├── package_kotlin
│ ├── package_kotlin.annotation
│ ├── package_kotlin.collections
│ ├── package_kotlin.comparisons
│ ├── package_kotlin.coroutines
│ ├── package_kotlin.coroutines.experimental
│ ├── package_kotlin.coroutines.experimental.intrinsics
│ ├── package_kotlin.experimental
│ ├── package_kotlin.internal
│ ├── package_kotlin.io
│ ├── package_kotlin.properties
│ ├── package_kotlin.ranges
│ ├── package_kotlin.reflect
│ ├── package_kotlin.sequences
│ ├── package_kotlin.text
│ ├── package_kotlin.text.regex
│ ├── package_kotlin.util
│ ├── package_kotlinx
│ ├── package_kotlinx.cinterop
│ └── root_package
├── manifest
├── resources
└── targets
├── android_arm32
│ ├── kotlin
│ │ └── program.kt.bc
│ └── native
│ ├── launcher.bc
│ ├── runtime.bc
│ └── start.bc
├── android_arm64
│ ├── kotlin
│ │ └── program.kt.bc
│ └── native
│ ├── launcher.bc
│ ├── runtime.bc
│ └── start.bc
├── iphone
│ ├── kotlin
│ │ └── program.kt.bc
│ └── native
│ ├── launcher.bc
│ ├── runtime.bc
│ ├── start.bc
│ ├── start.kt.bc
│ └── stdlib.kt.bc
└── macbook
├── kotlin
│ └── program.kt.bc
└── native
├── launcher.bc
├── runtime.bc
└── start.bc
16 directories, 42 files
上面的目录是 kotlin-native-macos-0.3 平台的版本。我们可以看出,在Mac OS上,我们可以使用 Kotlin Native 编译android_arm32、android_arm64、iphone、macbook等目标平台的机器码可执行的程序。
另外,对应的 Linux 平台的目录文件如下
kotlin-native-linux-0.3$ tree klib
klib/
└── stdlib
├── linkdata
│ ├── module
│ ├── package_konan
│ ├── package_konan.internal
│ ├── package_kotlin
│ ├── package_kotlin.annotation
│ ├── package_kotlin.collections
│ ├── package_kotlin.comparisons
│ ├── package_kotlin.coroutines
│ ├── package_kotlin.coroutines.experimental
│ ├── package_kotlin.coroutines.experimental.intrinsics
│ ├── package_kotlin.experimental
│ ├── package_kotlin.internal
│ ├── package_kotlin.io
│ ├── package_kotlin.properties
│ ├── package_kotlin.ranges
│ ├── package_kotlin.reflect
│ ├── package_kotlin.sequences
│ ├── package_kotlin.text
│ ├── package_kotlin.text.regex
│ ├── package_kotlin.util
│ ├── package_kotlinx
│ ├── package_kotlinx.cinterop
│ └── root_package
├── manifest
├── resources
└── targets
├── android_arm32
│ ├── kotlin
│ │ └── program.kt.bc
│ └── native
│ ├── launcher.bc
│ ├── runtime.bc
│ └── start.bc
├── android_arm64
│ ├── kotlin
│ │ └── program.kt.bc
│ └── native
│ ├── launcher.bc
│ ├── runtime.bc
│ └── start.bc
├── linux
│ ├── kotlin
│ │ └── program.kt.bc
│ └── native
│ ├── launcher.bc
│ ├── runtime.bc
│ └── start.bc
└── raspberrypi
├── kotlin
│ └── program.kt.bc
└── native
├── launcher.bc
├── runtime.bc
├── start.bc
├── start.kt.bc
└── stdlib.kt.bc
16 directories, 42 files
也就是说我们可以在 Linux 平台上编译android_arm32、android_arm64、linux、raspberrypi等平台上的目标程序。
对应Windows 平台的如下
kotlin-native-windows-0.3$ tree klib
klib/
└── stdlib
├── linkdata
│ ├── module
│ ├── package_konan
│ ├── package_konan.internal
│ ├── package_kotlin
│ ├── package_kotlin.annotation
│ ├── package_kotlin.collections
│ ├── package_kotlin.comparisons
│ ├── package_kotlin.coroutines
│ ├── package_kotlin.coroutines.experimental
│ ├── package_kotlin.coroutines.experimental.intrinsics
│ ├── package_kotlin.experimental
│ ├── package_kotlin.internal
│ ├── package_kotlin.io
│ ├── package_kotlin.properties
│ ├── package_kotlin.ranges
│ ├── package_kotlin.reflect
│ ├── package_kotlin.sequences
│ ├── package_kotlin.text
│ ├── package_kotlin.text.regex
│ ├── package_kotlin.util
│ ├── package_kotlinx
│ ├── package_kotlinx.cinterop
│ └── root_package
├── manifest
├── mingw
│ ├── kotlin
│ │ └── program.kt.bc
│ └── native
│ ├── launcher.bc
│ ├── runtime.bc
│ └── start.bc
├── resources
└── targets
└── mingw
├── kotlin
│ └── program.kt.bc
└── native
├── launcher.bc
├── runtime.bc
└── start.bc
10 directories, 32 files
在 Windows 平台中,Kotlin Native 使用的是 mingw 库来实现的。目前,在 V0.3预发布版本,我们在 Windows 平台上可以体验的东西比较少,像 Android,iOS,Raspberrypi都还不支持。
提示:MinGW,是Minimalist GNUfor Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能。
samples目录
samples目录下面是官方给出的一些实例。关于这些实例的文档介绍以及源码工程是: https://github.com/JetBrains/kotlin-native/tree/master/samples 。想更加深入了解学习的同学可以参考。