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 через командний рядок
kotlinc-native hello.kt -o hello -opt

// Збірка для iOS arm64 через 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, симулятор (x64, arm64)
МобільніAndroid NDKarm32, arm64, x86, x86_64
НосиміwatchOSarm64, симулятор (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, скомпільований у 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 генерує 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
// Збірка release фреймворку для iOS arm64
./gradlew :shared:linkReleaseFrameworkIosArm64

// Збірка універсального фреймворку x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
    :shared:linkReleaseFrameworkIosArm64

// Створення XCFramework для 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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