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 كمشروع — مترجم تجريبي تم دمجه في الفرع الرئيسي لـ Kotlin في عام 2017. في عام 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"
}
}
التفاعل مع كود iOS يعمل في كلا الاتجاهين. يولد Kotlin/Native رؤوس Objective-C لفئات Kotlin، التي تصبح متاحة تلقائيًا من Swift. يتم توفير الاتصال العكسي باستخدام التعليق @ObjCName لتصدير وظائف Kotlin تحت اسم Objective-C محدد. يتم تحويل مجموعات Kotlin تلقائيًا إلى NSArray وNSDictionary، ويتم تغليف coroutines الخاصة بـ Kotlin في ناشري Combine عبر مكتبة 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 لمتجر التطبيقات
./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, مضمن | خوادم، 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. سوف نقدم لك النصح ونقترح أفضل حل.