16.3 Kotlin Native 编译器 konan 简介

本小节我们简单介绍一下Kotlin Native 编译器的相关内容(主要以 Mac OS 平台示例)。

bin目录

bin目录下面是执行命令行

  1. cinterop klib konanc kotlinc kotlinc-native run_konan

run_konan 是真正的入口 shell,它的执行逻辑是

  1. TOOL_NAME="$1"
  2. shift
  3. if [ -z "$JAVACMD" -a -n "$JAVA_HOME" -a -x "$JAVA_HOME/bin/java" ]; then
  4. JAVACMD="$JAVA_HOME/bin/java"
  5. else
  6. JAVACMD=java
  7. fi
  8. [ -n "$JAVACMD" ] || JAVACMD=java
  9. ...
  10. java_opts=(-ea \
  11. -Xmx3G \
  12. "-Djava.library.path=${NATIVE_LIB}" \
  13. "-Dkonan.home=${KONAN_HOME}" \
  14. -Dfile.encoding=UTF-8)
  15. KONAN_JAR="${KONAN_HOME}/konan/lib/backend.native.jar"
  16. KOTLIN_JAR="${KONAN_HOME}/konan/lib/kotlin-compiler.jar"
  17. STUB_GENERATOR_JAR="${KONAN_HOME}/konan/lib/StubGenerator.jar"
  18. INTEROP_INDEXER_JAR="${KONAN_HOME}/konan/lib/Indexer.jar"
  19. INTEROP_JAR="${KONAN_HOME}/konan/lib/Runtime.jar"
  20. HELPERS_JAR="${KONAN_HOME}/konan/lib/helpers.jar"
  21. KLIB_JAR="${KONAN_HOME}/konan/lib/klib.jar"
  22. UTILITIES_JAR="${KONAN_HOME}/konan/lib/utilities.jar"
  23. KONAN_CLASSPATH="$KOTLIN_JAR:$INTEROP_JAR:$STUB_GENERATOR_JAR:$INTEROP_INDEXER_JAR:$KONAN_JAR:$HELPERS_JAR:$KLIB_JAR:$UTILITIES_JAR"
  24. TOOL_CLASS=org.jetbrains.kotlin.cli.utilities.MainKt
  25. LIBCLANG_DISABLE_CRASH_RECOVERY=1 \
  26. $TIMECMD "$JAVACMD" "${java_opts[@]}" "${java_args[@]}" -cp "$KONAN_CLASSPATH" "$TOOL_CLASS" "$TOOL_NAME" "${konan_args[@]}"

我们可以看出,Kotlin Native 编译器 konan 的运行环境还是在 JVM 上,但是它生成的机器码的可执行程序是直接运行在对应的平台系统上(直接编译成机器语言)。

konan目录

konan目录是 Kotlin Native 编译器的核心实现部分。目录结构如下:

  1. kotlin-native-macos-0.3$ tree konan
  2. konan/
  3. ├── konan.properties
  4. ├── lib
  5. ├── Indexer.jar
  6. ├── Runtime.jar
  7. ├── StubGenerator.jar
  8. ├── backend.native.jar
  9. ├── callbacks
  10. └── shared
  11. └── libcallbacks.dylib
  12. ├── clangstubs
  13. └── shared
  14. └── libclangstubs.dylib
  15. ├── helpers.jar
  16. ├── klib.jar
  17. ├── kotlin-compiler.jar
  18. ├── protobuf-java-2.6.1.jar
  19. └── utilities.jar
  20. └── nativelib
  21. ├── libcallbacks.dylib
  22. ├── libclangstubs.dylib
  23. ├── libllvmstubs.dylib
  24. └── liborgjetbrainskotlinbackendkonanhashstubs.dylib
  25. 6 directories, 16 files

我们可以看到在 run_konan 命令行 shell 中依赖了上面的这些 jar 包。上面的目录文件是 Mac OS 平台上的。

对应的 Linux 平台上的konan目录文件如下

  1. kotlin-native-linux-0.3$ tree konan
  2. konan
  3. ├── konan.properties
  4. ├── lib
  5. ├── Indexer.jar
  6. ├── Runtime.jar
  7. ├── StubGenerator.jar
  8. ├── backend.native.jar
  9. ├── callbacks
  10. └── shared
  11. └── libcallbacks.so
  12. ├── clangstubs
  13. └── shared
  14. └── libclangstubs.so
  15. ├── helpers.jar
  16. ├── klib.jar
  17. ├── kotlin-compiler.jar
  18. ├── protobuf-java-2.6.1.jar
  19. └── utilities.jar
  20. └── nativelib
  21. ├── libcallbacks.so
  22. ├── libclangstubs.so
  23. ├── libllvmstubs.so
  24. └── liborgjetbrainskotlinbackendkonanhashstubs.so
  25. 6 directories, 16 files

Windows 平台上的 konan 目录文件如下

  1. kotlin-native-windows-0.3$ tree konan
  2. konan
  3. ├── konan.properties
  4. ├── lib
  5. ├── Indexer.jar
  6. ├── Runtime.jar
  7. ├── StubGenerator.jar
  8. ├── backend.native.jar
  9. ├── callbacks
  10. └── shared
  11. └── callbacks.dll
  12. ├── clangstubs
  13. └── shared
  14. └── clangstubs.dll
  15. ├── helpers.jar
  16. ├── klib.jar
  17. ├── kotlin-compiler.jar
  18. ├── protobuf-java-2.6.1.jar
  19. └── utilities.jar
  20. └── nativelib
  21. ├── callbacks.dll
  22. ├── clangstubs.dll
  23. ├── llvmstubs.dll
  24. └── orgjetbrainskotlinbackendkonanhashstubs.dll
  25. 6 directories, 16 files

klib 目录

klib 目录下是 Kotlin 的标准库的关联元数据文件以及 Kotlin Native 针对各个目标平台的 bc 文件

  1. kotlin-native-macos-0.3$ tree klib
  2. klib/
  3. └── stdlib
  4. ├── linkdata
  5. ├── module
  6. ├── package_konan
  7. ├── package_konan.internal
  8. ├── package_kotlin
  9. ├── package_kotlin.annotation
  10. ├── package_kotlin.collections
  11. ├── package_kotlin.comparisons
  12. ├── package_kotlin.coroutines
  13. ├── package_kotlin.coroutines.experimental
  14. ├── package_kotlin.coroutines.experimental.intrinsics
  15. ├── package_kotlin.experimental
  16. ├── package_kotlin.internal
  17. ├── package_kotlin.io
  18. ├── package_kotlin.properties
  19. ├── package_kotlin.ranges
  20. ├── package_kotlin.reflect
  21. ├── package_kotlin.sequences
  22. ├── package_kotlin.text
  23. ├── package_kotlin.text.regex
  24. ├── package_kotlin.util
  25. ├── package_kotlinx
  26. ├── package_kotlinx.cinterop
  27. └── root_package
  28. ├── manifest
  29. ├── resources
  30. └── targets
  31. ├── android_arm32
  32. ├── kotlin
  33. └── program.kt.bc
  34. └── native
  35. ├── launcher.bc
  36. ├── runtime.bc
  37. └── start.bc
  38. ├── android_arm64
  39. ├── kotlin
  40. └── program.kt.bc
  41. └── native
  42. ├── launcher.bc
  43. ├── runtime.bc
  44. └── start.bc
  45. ├── iphone
  46. ├── kotlin
  47. └── program.kt.bc
  48. └── native
  49. ├── launcher.bc
  50. ├── runtime.bc
  51. ├── start.bc
  52. ├── start.kt.bc
  53. └── stdlib.kt.bc
  54. └── macbook
  55. ├── kotlin
  56. └── program.kt.bc
  57. └── native
  58. ├── launcher.bc
  59. ├── runtime.bc
  60. └── start.bc
  61. 16 directories, 42 files

上面的目录是 kotlin-native-macos-0.3 平台的版本。我们可以看出,在Mac OS上,我们可以使用 Kotlin Native 编译android_arm32、android_arm64、iphone、macbook等目标平台的机器码可执行的程序。

另外,对应的 Linux 平台的目录文件如下

  1. kotlin-native-linux-0.3$ tree klib
  2. klib/
  3. └── stdlib
  4. ├── linkdata
  5. ├── module
  6. ├── package_konan
  7. ├── package_konan.internal
  8. ├── package_kotlin
  9. ├── package_kotlin.annotation
  10. ├── package_kotlin.collections
  11. ├── package_kotlin.comparisons
  12. ├── package_kotlin.coroutines
  13. ├── package_kotlin.coroutines.experimental
  14. ├── package_kotlin.coroutines.experimental.intrinsics
  15. ├── package_kotlin.experimental
  16. ├── package_kotlin.internal
  17. ├── package_kotlin.io
  18. ├── package_kotlin.properties
  19. ├── package_kotlin.ranges
  20. ├── package_kotlin.reflect
  21. ├── package_kotlin.sequences
  22. ├── package_kotlin.text
  23. ├── package_kotlin.text.regex
  24. ├── package_kotlin.util
  25. ├── package_kotlinx
  26. ├── package_kotlinx.cinterop
  27. └── root_package
  28. ├── manifest
  29. ├── resources
  30. └── targets
  31. ├── android_arm32
  32. ├── kotlin
  33. └── program.kt.bc
  34. └── native
  35. ├── launcher.bc
  36. ├── runtime.bc
  37. └── start.bc
  38. ├── android_arm64
  39. ├── kotlin
  40. └── program.kt.bc
  41. └── native
  42. ├── launcher.bc
  43. ├── runtime.bc
  44. └── start.bc
  45. ├── linux
  46. ├── kotlin
  47. └── program.kt.bc
  48. └── native
  49. ├── launcher.bc
  50. ├── runtime.bc
  51. └── start.bc
  52. └── raspberrypi
  53. ├── kotlin
  54. └── program.kt.bc
  55. └── native
  56. ├── launcher.bc
  57. ├── runtime.bc
  58. ├── start.bc
  59. ├── start.kt.bc
  60. └── stdlib.kt.bc
  61. 16 directories, 42 files

也就是说我们可以在 Linux 平台上编译android_arm32、android_arm64、linux、raspberrypi等平台上的目标程序。

对应Windows 平台的如下

  1. kotlin-native-windows-0.3$ tree klib
  2. klib/
  3. └── stdlib
  4. ├── linkdata
  5. ├── module
  6. ├── package_konan
  7. ├── package_konan.internal
  8. ├── package_kotlin
  9. ├── package_kotlin.annotation
  10. ├── package_kotlin.collections
  11. ├── package_kotlin.comparisons
  12. ├── package_kotlin.coroutines
  13. ├── package_kotlin.coroutines.experimental
  14. ├── package_kotlin.coroutines.experimental.intrinsics
  15. ├── package_kotlin.experimental
  16. ├── package_kotlin.internal
  17. ├── package_kotlin.io
  18. ├── package_kotlin.properties
  19. ├── package_kotlin.ranges
  20. ├── package_kotlin.reflect
  21. ├── package_kotlin.sequences
  22. ├── package_kotlin.text
  23. ├── package_kotlin.text.regex
  24. ├── package_kotlin.util
  25. ├── package_kotlinx
  26. ├── package_kotlinx.cinterop
  27. └── root_package
  28. ├── manifest
  29. ├── mingw
  30. ├── kotlin
  31. └── program.kt.bc
  32. └── native
  33. ├── launcher.bc
  34. ├── runtime.bc
  35. └── start.bc
  36. ├── resources
  37. └── targets
  38. └── mingw
  39. ├── kotlin
  40. └── program.kt.bc
  41. └── native
  42. ├── launcher.bc
  43. ├── runtime.bc
  44. └── start.bc
  45. 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 。想更加深入了解学习的同学可以参考。