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 (نمایش میانی) |
| بهینهسازی | ~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 از طریق کتابخانه SKIE در Combine publishers قرار میگیرند. برای کار با فریمورکهای 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 از طریق لفافههای Kotlin به توابع iOS دسترسی فراهم میکند. به عنوان مثال، دریافت 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
// ساخت فریمورک universal 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید