انتقل إلى المحتوى

مُصرّف Kotlin

صرّف Kotlin 2.5 باستخدام elide kotlinc أو ضمن بناء مشروع Elide، مع إضافات مُصرّف مدمجة مثل serialization و Metro، وملفات JAR للواجهة الثنائية (ABI).

في هذه الصفحة

يأتي 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فرض تشغيل إضافة حقن التبعيات Metro أو إيقافها.
--testsتفعيل إضافات الاختبار (power-assert).
--max-errors Nعدد الأخطاء المعروضة؛ 0 يعرضها كلها. تُزال التحذيرات المكررة ولا يُحدّ عددها أبدًا.
--report-used-deps PATHكتابة إدخالات classpath التي يشير إليها الناتج (التبعيات الصارمة في Bazel).
--persistent_workerالعمل كعامل دائم في Bazel (persistent worker)، بنمط singleplex أو multiplex.
--abi-onlyتجريبي: كتابة ملف JAR للواجهة الثنائية فقط في -d.

ملفات JAR للواجهة الثنائية

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

يحتوي ملف JAR على التواقيع العامة والمحمية، و @Metadata، وأجسام inline المؤثرة في الواجهة الثنائية، وقيم const، وعلامات الوسائط الافتراضية. تعطي الواجهة الثنائية التي لم تتغير ملف JAR مطابقًا بايتًا ببايت، فتبقى الوحدات المعتمدة عليه في الذاكرة المؤقتة عند تعديل الأجسام.

يتخطى ELIDE_KOTLINC_ABI_STRIP=1 توليد شيفرة الأجسام. اتركه دون ضبط عندما تتضمن الواجهة الثنائية تصريحات تولّدها الإضافات، مثل $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
metroإضافة حقن التبعيات Metro.defaultPlugins
reflectionkotlin-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>، مرتّبًا حسب المعرّف ثم المفتاح.
  • توضع إضافات الجهات الخارجية في الفئة 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 فيستخدم دائمًا المُصرّف المضمّن.

لا يدعم Elide أداتي KAPT و KSP. يجب أن تحصل شيفرة Kotlin التي تستخدم أنواع Java مُولَّدة عليها من مجموعة مصادر أو مشروع سابق في سلسلة البناء.

أمثلة

ابدأ من قالب:

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

هل كانت هذه الصفحة مفيدة؟