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 целевых платформ и позволяет переиспользовать до 90% кода в KMM-проектах.

Главное

  • Kotlin/Native — компилятор, транслирующий Kotlin-код в нативный машинный код без использования JVM.
  • LLVM — бэкенд компилятора, отвечающий за генерацию машинного кода под каждую целевую платформу.
  • KMM — Kotlin Multiplatform Mobile использует Kotlin/Native для выполнения общего кода на iOS-устройствах.
  • Memory Manager — автоматический сборщик мусора, работающий на основе подсчёта ссылок без остановки потоков.
  • Interop — механизм двустороннего взаимодействия с нативными библиотеками Objective-C, Swift и C.

Что такое Kotlin/Native?

Kotlin/Native — это технология компиляции Kotlin-кода в нативный машинный код, разработанная компанией JetBrains. Основное отличие от 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-бэкенд (генерация машинного кода). Эта схема аналогична подходу, используемому в компиляторах Clang для C++ и Rust.

kotlin
// Kotlin/Native compilation via command line
kotlinc-native hello.kt -o hello -opt

// Build for iOS arm64 via Kotlin Multiplatform
./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 (Intermediate Representation)
Оптимизация~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 и Kotlin/Native на LLVM без ОС (standalone). Каждая платформа требует отдельного фреймворка или библиотеки на выходе.

Платформы для мобильной разработки

Для iOS Kotlin/Native генерирует универсальный фреймворк (.framework), который может быть подключён к Xcode-проекту. Для Android NDK создаются нативные библиотеки .so, которые можно вызывать через JNI. Платформа watchOS поддерживается начиная с Kotlin 1.6.0, а tvOS — с версии 1.7.0. Каждая архитектура требует отдельной сборки, но Kotlin Multiplatform автоматизирует этот процесс через Gradle-плагин.

Десктопные и серверные платформы

macOS и Linux используются для разработки нативных десктопных приложений на Kotlin с использованием фреймворка Compose Multiplatform. Платформа Windows (MinGW) поддерживается с Kotlin 1.3.70 и позволяет создавать Windows-приложения без установки JVM. Для серверной разработки Kotlin/Native может использоваться в средах, где JVM недоступна, например, в Docker-контейнерах с минимальным образом на основе scratch или Alpine.

КатегорияПлатформаАрхитектура
МобильныеiOSarm64, simulator (x64, arm64)
МобильныеAndroid NDKarm32, arm64, x86, x86_64
НосимыеwatchOSarm64, simulator (x64)
ДесктопmacOSx64, arm64
ДесктопWindowsmingw x64
ДесктопLinuxx64, arm64, arm32

Kotlin/Native для iOS-разработки

iOS является основной целевой платформой Kotlin/Native в контексте KMM. Компилятор создаёт iOS-фреймворк, содержащий весь общий код, который затем подключается к Xcode-проекту. Фреймворк поддерживает как статическую, так и динамическую компоновку. Kotlin/Native генерирует Objective-C-обёртки для Kotlin-классов и функций, обеспечивая прямую интеграцию с кодом на Swift и Objective-C.

Интеграция с iOS требует настройки Xcode для подключения сгенерированного фреймворка. Kotlin Multiplatform автоматизирует этот процесс с помощью embedAndSignAppleFrameworkForXcode задачи, которая запускается из Xcode Build Phases. Для отладки Kotlin/Native поддерживает брейкпоинты в коде общего модуля при запуске приложения на симуляторе iOS.

kotlin
// Kotlin code compiled into iOS framework
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 генерирует Objective-C-заголовки для Kotlin-классов, которые автоматически становятся доступны из Swift. Обратная связь обеспечивается с помощью аннотации @ObjCName для экспорта Kotlin-функций под указанным Objective-C-именем. Kotlin-коллекции автоматически конвертируются в NSArray и NSDictionary, а Kotlin-корутины оборачиваются в Combine publishers через библиотеку SKIE. Для работы с iOS-фреймворками из Kotlin используется cinterop — инструмент генерации Kotlin-привязок к Objective-C-заголовкам.

Примеры кода: настройка и компиляция

Для начала работы с Kotlin/Native требуется настройка build.gradle.kts с указанием Kotlin Multiplatform плагина и целевых платформ. Рассмотрим минимальную конфигурацию для KMM-проекта с поддержкой iOS и Android.

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 предоставляет доступ к iOS-функциям через Kotlin-обёртки. Например, получение UUID устройства на iOS требует вызова NSUUID из Foundation.

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
// Build release framework for iOS arm64
./gradlew :shared:linkReleaseFrameworkIosArm64

// Build universal framework x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
    :shared:linkReleaseFrameworkIosArm64

// Create XCFramework for App Store
./gradlew :shared:assembleReleaseXCFramework

Kotlin/Native vs Kotlin/JVM: сравнение

Kotlin/Native и Kotlin/JVM различаются по архитектуре, производительности и области применения. Kotlin/JVM компилирует код в байт-код, выполняемый на JVM, что даёт доступ к огромной экосистеме Java-библиотек, но требует установленной виртуальной машины. Kotlin/Native генерирует исполняемый файл без внешних зависимостей, но с более ограниченной экосистемой библиотек.

Производительность стартового времени у Kotlin/Native выше, так как не требуется загрузка JVM. По данным бенчмарков JetBrains, приложение Hello World на Kotlin/Native запускается за 0.003 секунды, в то время как Kotlin/JVM требуется 0.5–1 секунда на загрузку виртуальной машины. Однако размер исполняемого файла Kotlin/Native может быть в 2–3 раза больше из-за включённого рантайма.

ХарактеристикаKotlin/NativeKotlin/JVM
Целевые платформыiOS, macOS, Windows, Linux, WebAssembly, embeddedСерверы, Android, десктоп (JVM)
ЗависимостиБез рантайма (самодостаточный)Требуется JVM (JDK/JRE)
Стартовое время~3 мс~500–1000 мс
ЭкосистемаОграниченная (Kotlin + Interop)Полная (Kotlin + Java + Android SDK)
Размер бинарника~1–5 МБ (с рантаймом)~100–500 КБ (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 и серверов.

Можно ли использовать Kotlin/Native без KMM?

Да, Kotlin/Native можно использовать как самостоятельный компилятор для создания консольных приложений, нативных плагинов или библиотек для любой поддерживаемой платформы. KMM лишь упрощает организацию мультиплатформенного кода.

Как Kotlin/Native работает с памятью на iOS?

Memory Manager Kotlin/Native использует подсчёт ссылок с автоматическим циклическим детектором. Начиная с Kotlin 1.7.20, сборщик мусора не требует аннотаций @ThreadLocal и работает без остановки главного потока iOS.

Какие iOS-библиотеки доступны из Kotlin/Native?

Через cinterop доступны все iOS-фреймворки: Foundation, UIKit, CoreData, CoreBluetooth, MapKit и сотни других. JetBrains предоставляет готовые привязки для стандартных iOS-библиотек в составе Kotlin/Native.

Как отлаживать Kotlin/Native код на iOS?

Для отладки используется Xcode с подключённым Kotlin/Native фреймворком. Брейкпоинты в Kotlin-коде работают при запуске на симуляторе iOS. Для устройства требуется Debug-сборка и профиль разработчика Apple.

Итоги

  • Kotlin/Native — компилятор Kotlin в нативный код, основа фундамента Kotlin Multiplatform Mobile.
  • LLVM-бэкенд обеспечивает генерацию машинного кода для 13 целевых платформ, включая iOS, Android NDK, macOS и Windows.
  • Memory Manager с подсчётом ссылок работает без остановки потоков, что критически важно для мобильных платформ.
  • iOS-фреймворк генерируется автоматически и подключается к Xcode-проекту через embedAndSignAppleFrameworkForXcode.
  • Objective-C и Swift Interop обеспечивают двустороннюю интеграцию с нативным iOS-кодом через cinterop и @ObjCName.
  • Производительность стартового времени Kotlin/Native значительно выше JVM-версии — до 0.003 секунды вместо 0.5–1 секунды.
  • Используйте Kotlin/Native для iOS, встраиваемых систем и WebAssembly, где JVM недоступна или нежелательна.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также