Kotlin/Native — 什么是它,原生代码编译器及特点

作者: IT Sectr 发布日期: 2026-06-05 阅读时间: 8 分钟

Kotlin/Native — 是一个将 Kotlin 代码直接编译为原生机器码的编译器,无需虚拟机即可运行。与 JVM 版本不同,Kotlin/Native 使用 LLVM 后端为 iOS、Android NDK、macOS、Windows、Linux 和 WebAssembly 生成可执行文件。该技术是 Kotlin Multiplatform 的基础,并确保在 JVM 不可用的平台上执行共享代码。根据 JetBrains, 2025,Kotlin/Native 支持 13 个目标平台,并允许在 KMM 项目中重用高达 90% 的代码。

要点

  • Kotlin/Native — 将 Kotlin 代码转换为原生机器码的编译器,无需使用 JVM。
  • LLVM — 负责为每个目标平台生成机器码的编译器后端。
  • KMM — Kotlin Multiplatform Mobile 使用 Kotlin/Native 在 iOS 设备上执行共享代码。
  • Memory Manager — 基于引用计数的自动垃圾收集器,无需停止线程。
  • Interop — 与原生 Objective-C、Swift 和 C 库进行双向交互的机制。

什么是 Kotlin/Native?

Kotlin/Native — 是由 JetBrains 公司开发的将 Kotlin 代码编译为原生机器码的技术。与 Kotlin/JVM 的主要区别在于不需要虚拟机——最终的可执行文件只包含机器码和最小的运行时环境。这使得 Kotlin 应用程序可以在不支持 JVM 的设备和系统上运行,包括 iPhone、Apple Watch 和嵌入式系统。

Kotlin/Native 的历史始于一个实验性编译器项目,该项目于 2017 年集成到 Kotlin 主分支中。2019 年在 KotlinConf 上宣布支持 iOS 作为目标平台,这成为移动开发的转折点。从 Kotlin 1.9.20 版本开始,Kotlin/Native 编译器达到了稳定状态,并默认包含在 Kotlin Multiplatform 中。

Kotlin/Native 的关键特性是使用共享中间表示 IR,该表示为每个平台单独编译为机器码。这为所有 Kotlin 后端(JVM、JS 和 Native)提供了统一的编译前端。

Kotlin/Native 编译器如何工作

编译 Kotlin/Native 经历多个转换阶段。Kotlin 源代码首先转换为内部表示,然后进行优化并传递给 LLVM 后端以生成机器码。最后阶段是与运行时库链接并创建可执行文件或动态库。

架构包括三个关键组件:前端(解析和类型检查)、IR 生成器(构建中间表示)和 LLVM 后端(生成机器码)。此方案类似于 C++ 和 Rust 的 Clang 编译器中使用的方法。

kotlin
// 通过命令行编译 Kotlin/Native
kotlinc-native hello.kt -o hello -opt

// 通过 Kotlin Multiplatform 为 iOS arm64 构建
./gradlew :shared:linkDebugFrameworkIosArm64

对于内存管理,Kotlin/Native 使用自己的 Memory Manager,基于带有循环检测器的引用计数。从 Kotlin 1.7.20 开始,新的内存管理器默认工作,不需要 @ThreadLocal 或 @SharedImmutable 注释。垃圾收集器无需停止线程即可工作,这对于 iOS 至关重要,因为系统可能在主线程长时间阻塞时强制关闭应用程序。

Kotlin/Native 编译阶段

编译过程分为五个阶段:解析(分析源代码)、语义分析(类型检查和名称解析)、IR 生成(构建中间表示)、优化(简化和删除死代码)和 代码生成(通过 LLVM)。每个阶段可以针对不同的模块并行执行,从而加快大型项目的构建速度。

阶段持续时间结果
解析约 10% 时间源代码的 AST 树
语义分析约 20% 时间类型化 AST
IR 生成约 15% 时间Kotlin IR(中间表示)
优化约 25% 时间优化后的 IR
LLVM 代码生成约 30% 时间机器码 + 可执行文件

Kotlin/Native 支持的平台

Kotlin/Native 支持 13 个目标平台,分为不同的类别。对于移动开发,支持 iOS (arm64)Android (arm32, arm64, x86_64)watchOS。桌面平台包括 macOS (x64, arm64)、Windows (mingw x64) 和 Linux (x64, arm64, arm32)。对于服务器和嵌入式开发,支持 WebAssembly 和无操作系统的 LLVM 上的 Kotlin/Native(独立模式)。每个平台需要在输出端有单独的框架或库。

移动开发平台

对于 iOS,Kotlin/Native 生成一个可以连接到 Xcode 项目的通用框架 (.framework)。对于 Android NDK,创建可以通过 JNI 调用的原生 .so 库。watchOS 平台从 Kotlin 1.6.0 开始支持,tvOS 从 1.7.0 版本开始支持。每个架构需要单独的构建,但 Kotlin Multiplatform 通过 Gradle 插件自动化此过程。

桌面和服务器平台

macOSLinux 用于使用 Compose Multiplatform 框架在 Kotlin 中开发原生桌面应用程序。Windows (MinGW) 平台从 Kotlin 1.3.70 开始支持,允许无需安装 JVM 即可创建 Windows 应用程序。对于服务器开发,Kotlin/Native 可用于 JVM 不可用的环境,例如基于 scratch 或 Alpine 的最小镜像的 Docker 容器中。

类别平台架构
移动iOSarm64,模拟器 (x64, arm64)
移动Android NDKarm32, arm64, x86, x86_64
可穿戴watchOSarm64,模拟器 (x64)
桌面macOSx64, arm64
桌面Windowsmingw x64
桌面Linuxx64, arm64, arm32

Kotlin/Native 用于 iOS 开发

iOS 是 KMM 背景下 Kotlin/Native 的主要目标平台。编译器创建一个包含所有共享代码的 iOS 框架,然后连接到 Xcode 项目。该框架支持静态和动态链接。Kotlin/Native 为 Kotlin 类和函数生成 Objective-C 包装器,确保与 Swift 和 Objective-C 代码的直接集成。

与 iOS 集成需要配置 Xcode 以连接生成的框架。Kotlin Multiplatform 通过从 Xcode Build Phases 运行的 embedAndSignAppleFrameworkForXcode 任务自动化此过程。对于调试,Kotlin/Native 支持在 iOS 模拟器上运行应用程序时在共享模块代码中设置断点。

kotlin
// Kotlin 代码编译为 iOS 框架
package com.itsectr.shared

class GreetingProvider {
    fun createGreeting(): String {
        return "Hello from Kotlin/Native!"
    }

    fun formatVersion(major: Int, minor: Int): String {
        return "v$major.$minor"
    }
}

Objective-C 和 Swift Interop

Interop 与 iOS 代码双向工作。Kotlin/Native 为 Kotlin 类生成 Objective-C 头文件,这些头文件自动从 Swift 可用。通过 @ObjCName 注释提供反馈,用于以指定的 Objective-C 名称导出 Kotlin 函数。Kotlin 集合自动转换为 NSArray 和 NSDictionary,Kotlin 协程通过 SKIE 库包装到 Combine publishers 中。为了从 Kotlin 与 iOS 框架一起工作,使用 cinterop——一个用于为 Objective-C 头文件生成 Kotlin 绑定的工具。

代码示例:配置和编译

要开始使用 Kotlin/Native,需要配置 build.gradle.kts,指定 Kotlin Multiplatform 插件和目标平台。让我们来看一个支持 iOS 和 Android 的 KMM 项目的最小配置。

kotlin
plugins {
    kotlin("multiplatform") version "2.0.21"
}

kotlin {
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
        }
        iosMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
        }
    }
}

配置构建后,可以添加平台相关代码。Kotlin/Native 通过 Kotlin 包装器提供对 iOS 函数的访问。例如,在 iOS 上获取设备 UUID 需要调用 Foundation 中的 NSUUID

kotlin
import platform.Foundation.NSUUID

fun getDeviceId(): String {
    return NSUUID().UUIDString()
}

fun currentTimestampMillis(): Long {
    return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}

构建 iOS 框架

要生成 iOS 框架,使用 Gradle 任务 linkDebugFrameworkIosArm64 或用于生产的 linkReleaseFrameworkIosArm64。构建后,框架位于 build/bin/iosArm64/debugFramework/。连接到 Xcode 项目通过 Pods Podfile 或将框架添加到 General → Frameworks, Libraries and Embedded Content 部分来完成。

kotlin
// 为 iOS arm64 构建发布框架
./gradlew :shared:linkReleaseFrameworkIosArm64

// 构建通用框架 x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
    :shared:linkReleaseFrameworkIosArm64

// 为 App Store 创建 XCFramework
./gradlew :shared:assembleReleaseXCFramework

Kotlin/Native 与 Kotlin/JVM:比较

Kotlin/Native 和 Kotlin/JVM 在架构、性能和应用领域上有所不同。Kotlin/JVM 将代码编译为在 JVM 上执行的字节码,提供了对庞大 Java 库生态系统的访问,但需要安装的虚拟机。Kotlin/Native 生成没有外部依赖的可执行文件,但库生态系统更为有限。

Kotlin/Native 的启动时间性能更高,因为不需要加载 JVM。根据 JetBrains 的基准测试,Kotlin/Native 上的 Hello World 应用程序在 0.003 秒内启动,而 Kotlin/JVM 需要 0.5–1 秒来加载虚拟机。但是,由于包含了运行时,Kotlin/Native 的可执行文件大小可能大 2–3 倍。

特性Kotlin/NativeKotlin/JVM
目标平台iOS、macOS、Windows、Linux、WebAssembly、嵌入式服务器、Android、桌面 (JVM)
依赖无运行时(独立)需要 JVM (JDK/JRE)
启动时间约 3 毫秒约 500–1000 毫秒
生态系统有限 (Kotlin + Interop)完整 (Kotlin + Java + Android SDK)
二进制大小约 1–5 MB(含运行时)约 100–500 KB (JAR)

Kotlin/Native 和 Kotlin/JVM 之间的选择取决于目标平台。如果项目面向 iOS 或需要最少资源消耗,Kotlin/Native 是唯一的选择。对于 Android 开发,Kotlin/JVM 仍然是标准,尽管 Kotlin/Native 用于需要原生性能的 NDK 组件。在多平台项目中,Kotlin Multiplatform 结合了两种方法:共享代码通过 Kotlin/Native 为 iOS 编译,通过 Kotlin/JVM 为 Android 编译。

常见问题

Kotlin/Native 与 Kotlin/JVM 有什么不同?

Kotlin/Native 将代码编译为原生机器码而不需要虚拟机,而 Kotlin/JVM 编译为需要安装 JVM 的字节码。Kotlin/Native 用于 iOS、嵌入式系统和 WebAssembly,Kotlin/JVM 用于 Android 和服务器。

可以在没有 KMM 的情况下使用 Kotlin/Native 吗?

可以,Kotlin/Native 可以作为独立编译器使用,为任何支持的平台创建控制台应用程序、原生插件或库。KMM 只是简化了多平台代码的组织。

Kotlin/Native 在 iOS 上如何管理内存?

Memory Manager Kotlin/Native 使用带有自动循环检测器的引用计数。从 Kotlin 1.7.20 开始,垃圾收集器不需要 @ThreadLocal 注释,并且无需停止 iOS 主线程即可工作。

从 Kotlin/Native 可以使用哪些 iOS 库?

通过 cinterop,所有 iOS 框架都可用:Foundation、UIKit、CoreData、CoreBluetooth、MapKit 以及数百个其他框架。JetBrains 在 Kotlin/Native 组件中为标准 iOS 库提供现成的绑定。

如何在 iOS 上调试 Kotlin/Native 代码?

调试使用 Xcode 和连接的 Kotlin/Native 框架。Kotlin 代码中的断点在 iOS 模拟器上运行时有效。对于设备,需要 Debug 构建和 Apple 开发人员配置文件。

总结

  • Kotlin/Native — 将 Kotlin 编译为原生代码的编译器,是 Kotlin Multiplatform Mobile 的基础。
  • LLVM 后端 确保为 13 个目标平台生成机器码,包括 iOS、Android NDK、macOS 和 Windows。
  • Memory Manager 使用引用计数无需停止线程即可工作,这对移动平台至关重要。
  • iOS 框架 自动生成并通过 embedAndSignAppleFrameworkForXcode 连接到 Xcode 项目。
  • Objective-C 和 Swift Interop 通过 cinterop 和 @ObjCName 提供与原生 iOS 代码的双向集成。
  • 性能 Kotlin/Native 的启动时间明显高于 JVM 版本——0.003 秒而不是 0.5–1 秒。
  • 在 JVM 不可用或不理想的情况下,为 iOS、嵌入式系统和 WebAssembly 使用 Kotlin/Native。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读