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 у нативний машинний код, розроблена компанією 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 спочатку перетворюється у внутрішнє представлення, потім оптимізується та передається в LLVM-бекенд для генерації машинного коду. Фінальний етап — лінкування з рантайм-бібліотеками та створення виконуваного файлу або динамічної бібліотеки.
Архітектура включає три ключові компоненти: фронтенд (парсинг та перевірка типів), IR-генератор (побудова проміжного представлення) та LLVM-бекенд (генерація машинного коду). Ця схема аналогічна підходу, що використовується в компіляторах Clang для C++ та Rust.
// Компіляція 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, де система може примусово завершити застосунок при тривалому блокуванні головного потоку.
Процес компіляції поділяється на п'ять етапів: парсинг (розбір вихідного коду), семантичний аналіз (перевірка типів та розв'язання імен), генерація IR (побудова проміжного представлення), оптимізація (спрощення та видалення мертвого коду) та кодогенерація через LLVM. Кожен етап може виконуватися паралельно для різних модулів, що прискорює збірку великих проєктів.
| Етап | Тривалість | Результат |
|---|---|---|
| Парсинг | ~10% часу | AST-дерево вихідного коду |
| Семантичний аналіз | ~20% часу | Типізоване AST |
| Генерація IR | ~15% часу | Kotlin IR (Intermediate Representation) |
| Оптимізація | ~25% часу | Оптимізований IR |
| LLVM кодогенерація | ~30% часу | Машинний код + виконуваний файл |
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.
| Категорія | Платформа | Архітектура |
|---|---|---|
| Мобільні | iOS | arm64, симулятор (x64, arm64) |
| Мобільні | Android NDK | arm32, arm64, x86, x86_64 |
| Носимі | watchOS | arm64, симулятор (x64) |
| Десктоп | macOS | x64, arm64 |
| Десктоп | Windows | mingw x64 |
| Десктоп | Linux | x64, arm64, arm32 |
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, скомпільований у 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"
}
}
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.
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.
import platform.Foundation.NSUUID
fun getDeviceId(): String {
return NSUUID().UUIDString()
}
fun currentTimestampMillis(): Long {
return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}
Для генерації iOS-фреймворку використовується Gradle-задача linkDebugFrameworkIosArm64 або linkReleaseFrameworkIosArm64 для продакшену. Після збірки фреймворк розташовується в build/bin/iosArm64/debugFramework/. Підключення до Xcode-проєкту виконується через Pods Podfile або додаванням фреймворку в розділ General → Frameworks, Libraries and Embedded Content.
// Збірка release фреймворку для iOS arm64
./gradlew :shared:linkReleaseFrameworkIosArm64
// Збірка універсального фреймворку x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
:shared:linkReleaseFrameworkIosArm64
// Створення XCFramework для App Store
./gradlew :shared:assembleReleaseXCFramework
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/Native | Kotlin/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 — у байт-код, що вимагає встановленої JVM. Kotlin/Native використовується для iOS, вбудованих систем та WebAssembly, Kotlin/JVM — для Android та серверів.
Так, Kotlin/Native можна використовувати як самостійний компілятор для створення консольних застосунків, нативних плагінів або бібліотек для будь-якої підтримуваної платформи. KMM лише спрощує організацію мультиплатформенного коду.
Memory Manager Kotlin/Native використовує підрахунок посилань з автоматичним циклічним детектором. Починаючи з Kotlin 1.7.20, збирач сміття не вимагає анотацій @ThreadLocal та працює без зупинки головного потоку iOS.
Через cinterop доступні всі iOS-фреймворки: Foundation, UIKit, CoreData, CoreBluetooth, MapKit та сотні інших. JetBrains надає готові прив'язки для стандартних iOS-бібліотек у складі Kotlin/Native.
Для налагодження використовується Xcode з підключеним Kotlin/Native фреймворком. Брейкпоїнти в Kotlin-коді працюють при запуску на симуляторі iOS. Для пристрою потрібна Debug-збірка та профіль розробника Apple.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.