Перейти до вмісту

Компілятор Kotlin

Компілюйте Kotlin 2.5 за допомогою elide kotlinc або під час збирання проєкту Elide з вбудованими плагінами компілятора, як-от serialization і Metro, та створюйте ABI JAR.

На цій сторінці

Elide містить Kotlin 2.5.0-Beta1. Дистрибутив лише із середовищем виконання повідомляє, що kotlinc потребує повного дистрибутива.

Компіляція вихідних файлів

// Hello.kt
fun main() = println("Hello!")
elide kotlinc -- -d out Hello.kt
elide java -- -cp out HelloKt
0:12 / 0:12

Параметри kotlinc вказуються після --, параметри Elide — перед ним. elide kotlinc --help виводить параметри Elide, elide kotlinc -- -help — параметри kotlinc.

elide java не додає стандартну бібліотеку Kotlin, тому код, який її викликає (listOf, joinToString), там завершується помилкою:

fun main() = println(listOf("Hello", "Kotlin").joinToString(" "))
КомандаРезультат
elide kotlinc -- -d out Hello.kt, потім elide java -- -cp out HelloKtNoClassDefFoundError: kotlin/collections/CollectionsKt
elide kotlinc -- -include-runtime -d hello.jar Hello.ktКомпіляція завершується помилкою
elide run Hello.ktHello Kotlin
elide build з артефактом Jvm.JvmApplicationСкрипт запуску зі стандартною бібліотекою в lib/

Параметри Elide

ПараметрПризначення
--incrementalЗберігати інкрементальний стан у .dev/artifacts/kotlinc/incremental/ з ключем за шляхом результату.
--incremental-cache-dir DIRЗберігати інкрементальний стан у DIR.
--plugins LISTУвімкнути саме ці вбудовані плагіни: metro, serialization, atomicfu, power-assert.
--metro, --no-metroПримусово ввімкнути або вимкнути DI-плагін Metro.
--testsУвімкнути тестові плагіни (power-assert).
--max-errors NСкільки помилок показати; 0 показує всі. Попередження дедуплікуються й ніколи не обмежуються.
--report-used-deps PATHЗаписати елементи classpath, на які посилається результат (strict deps у Bazel).
--persistent_workerПрацювати як постійний воркер Bazel (persistent worker) у режимі singleplex або multiplex.
--abi-onlyЕкспериментально: записати в -d лише ABI JAR.

ABI JAR

elide kotlinc --abi-only -- -d header.jar src/**/*.kt

JAR містить публічні й захищені сигнатури, @Metadata, значущі для ABI тіла inline, значення const і маркери аргументів за замовчуванням. Незмінений ABI дає побайтово ідентичний JAR, тож зміни в тілах функцій зберігають залежні модулі в кеші.

ELIDE_KOTLINC_ABI_STRIP=1 пропускає генерацію коду тіл. Не задавайте цю змінну, якщо ABI містить оголошення, згенеровані плагінами, як-от $serializer з kotlinx.serialization. Воркери приймають її для кожного запиту.

Збирання проєктів

elide build компілює набори вихідних файлів Kotlin, знайдені за домовленістю або оголошені в elide.pkl.

kotlin {
  apiLevel = "auto"
  languageLevel = "auto"
  compilerOptions {
    allWarningsAsErrors = true
    optIn { "kotlin.time.ExperimentalTime" }
    freeCompilerArgs { "-Xcontext-parameters" }
  }
}
ВластивістьПризначенняЗа замовчуванням
kotlin.apiLevel, kotlin.languageLevel"1.9" … "2.5", "latest" або "stable"."auto"
compilerOptions.optInМаркери, що передаються як -opt-in.немає
compilerOptions.progressiveMode, .extraWarnings, .allWarningsAsErrors, .suppressWarnings, .verboseВідповідні перемикачі kotlinc.false
compilerOptions.freeCompilerArgsДодаткові аргументи компілятора.немає
compilerOptions.apiVersion, .languageVersion, .jvmTargetВерсії для окремої компіляції; "auto" відповідає проєкту."auto"
compilerOptions.javaParametersГенерувати метадані параметрів для рефлексії Java.false
compilerOptions.jvmTargetValidationMode"ERROR", "WARNING" або "IGNORE" у разі розбіжності цільових версій Kotlin і Java."ERROR"
compilerOptions.noStdlib, .noJdkПрибрати стандартну бібліотеку або JDK з classpath.false
compilerOptions.includeRuntimeНе підтримується: true спричиняє помилку компіляції Kotlin. Пакуйте за допомогою артефакту Jvm.JvmApplication.false
compilerOptions.incrementalІнкрементальне збирання проєкту.true

Кожна компіляція записує свої аргументи в kotlinc.args поруч із результатом.

Плагіни та функції

kotlin.featuresДіяЗа замовчуванням
kotlinxБібліотеки KotlinX у коренях залежностей Kotlin.true
defaultPluginsНабір вбудованих плагінів.true
serializationПлагін і середовище виконання kotlinx.serialization.kotlinx && defaultPlugins
coroutinesСередовище виконання kotlinx.coroutines.kotlinx
atomicfuПлагін і середовище виконання kotlinx.atomicfu.kotlinx && defaultPlugins
powerAssertПлагін Power Assert.defaultPlugins
metroDI-плагін Metro.defaultPlugins
reflectionНеявний kotlin-reflect.true
testingТестові бібліотеки Kotlin у тестових наборах.true
kotlin {
  features {
    metro = false
  }
  plugins {
    ["org.jetbrains.kotlinx.serialization"] {
      ["mode"] = "json"
    }
  }
}

dependencies {
  maven {
    kotlinPlugins { "com.example:my-compiler-plugin:1.0.0" }
  }
}
  • Кожен запис plugins перетворюється на -P plugin:<id>:<key>=<value>, із сортуванням за id і ключем.
  • Сторонні плагіни вказуються в групі kotlinPlugins і потребують ManagedKotlinToolchain або CustomKotlinToolchain. Вбудований компілятор видає попередження Custom Kotlin compiler plugins are not supported when using the embedded compiler, plugins will not be applied і компілює без них.
  • Вбудований плагін, якого немає в дистрибутиві, пропускається разом із його параметрами, з попередженням.
  • Неявні бібліотеки Kotlin додаються лише до коренів залежностей із вихідними файлами Kotlin. reflection = false прибирає kotlin-reflect; compilerOptions.noStdlib = true прибирає його й стандартну бібліотеку. Оголошені залежності залишаються.
  • project("core").friend() відкриває internal-оголошення сусіднього проєкту; див. Робочі простори.
  • Набір вихідних файлів бачить internal-оголошення наборів, від яких він залежить у тому самому проєкті: кожного набору, указаного в його dependsOn (main для тестового набору, де його не вказано), а також наборів, від яких залежать вони.

Вибір інструментарію

import "elide:Kotlin.pkl" as Kotlin

kotlin {
  toolchain = "embedded"                                       // the default
  // toolchain = new Kotlin.ManagedKotlinToolchain { version = "2.4.0" }
  // toolchain = new Kotlin.CustomKotlinToolchain { path = "/opt/kotlinc" }
}
ІнструментарійПоведінка
"embedded"Kotlin, що входить до Elide.
ManagedKotlinToolchainЗавантажує вказану версію (зокрема попередні випуски) з її стандартною бібліотекою, reflect, тестовими бібліотеками й плагінами Kotlin. Версії KotlinX, Metro та інших сторонніх компонентів не змінюються; перевірте, що вони сумісні.
CustomKotlinToolchainЛокальний дистрибутив Kotlin; вбудовані плагіни, яких у ньому немає, пропускаються.

Інструментарій застосовується до збирання проєктів; elide kotlinc завжди використовує вбудований компілятор.

KAPT і KSP не підтримуються. Код на Kotlin, що використовує згенеровані типи Java, має отримувати їх із попереднього набору вихідних файлів або проєкту.

Приклади

Почніть із шаблону:

elide init --template ktjvm       # Kotlin app with a test

Чи була ця сторінка корисною?