Kotlin/Native — είναι ένας μεταγλωττιστής κώδικα Kotlin απευθείας σε εγγενή κώδικα μηχανής, που λειτουργεί χωρίς εικονική μηχανή. Σε αντίθεση με την έκδοση JVM, το Kotlin/Native χρησιμοποιεί το backend 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, η οποία μεταγλωττίζεται σε κώδικα μηχανής για κάθε πλατφόρμα ξεχωριστά. Αυτό εξασφαλίζει ένα ενοποιημένο frontend μεταγλώττισης για όλα τα backends του Kotlin: JVM, JS και Native.
Μεταγλώττιση Το Kotlin/Native περνά από διάφορα στάδια μετασχηματισμού. Ο πηγαίος κώδικας σε Kotlin πρώτα μετατρέπεται σε εσωτερική αναπαράσταση, στη συνέχεια βελτιστοποιείται και μεταφέρεται στο backend LLVM για τη δημιουργία κώδικα μηχανής. Το τελικό στάδιο είναι η σύνδεση με βιβλιοθήκες χρόνου εκτέλεσης και η δημιουργία εκτελέσιμου αρχείου ή δυναμικής βιβλιοθήκης.
Η αρχιτεκτονική περιλαμβάνει τρία βασικά στοιχεία: frontend (ανάλυση και έλεγχος τύπων), γεννήτρια IR (δημιουργία ενδιάμεσης αναπαράστασης) και backend 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). Κάθε πλατφόρμα απαιτεί ξεχωριστό framework ή βιβλιοθήκη στην έξοδο.
Για iOS, το Kotlin/Native δημιουργεί ένα καθολικό framework (.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 framework που περιέχει όλο τον κοινό κώδικα, το οποίο στη συνέχεια συνδέεται στο έργο Xcode. Το framework υποστηρίζει τόσο στατική όσο και δυναμική σύνδεση. Το Kotlin/Native δημιουργει περιτυλίγματα Objective-C για κλάσεις και συναρτήσεις Kotlin, εξασφαλίζοντας άμεση ενσωμάτωση με κώδικα Swift και Objective-C.
Η ενσωμάτωση με iOS απαιτεί διαμόρφωση του Xcode για τη σύνδεση του παραγόμενου framework. Το Kotlin Multiplatform αυτοματοποιεί αυτή τη διαδικασία με την εργασία embedAndSignAppleFrameworkForXcode που εκτελείται από το Xcode Build Phases. Για αποσφαλμάτωση, το Kotlin/Native υποστηρίζει σημεία διακοπής στον κώδικα της κοινής ενότητας κατά την εκτέλεση της εφαρμογής στον προσομοιωτή iOS.
// Κώδικας Kotlin μεταγλωττισμένος σε iOS framework
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. Για εργασία με frameworks 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 framework χρησιμοποιείται η εργασία Gradle linkDebugFrameworkIosArm64 ή linkReleaseFrameworkIosArm64 για παραγωγή. Μετά την κατασκευή, το framework βρίσκεται στο build/bin/iosArm64/debugFramework/. Η σύνδεση με το έργο Xcode γίνεται μέσω Pods Podfile ή με προσθήκη του framework στην ενότητα General → Frameworks, Libraries and Embedded Content.
// Κατασκευή release framework για iOS arm64
./gradlew :shared:linkReleaseFrameworkIosArm64
// Κατασκευή καθολικού framework x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
:shared:linkReleaseFrameworkIosArm64
// Δημιουργία XCFramework για App Store
./gradlew :shared:assembleReleaseXCFramework
Kotlin/Native και Kotlin/JVM διαφέρουν σε αρχιτεκτονική, απόδοση και τομέα εφαρμογής. Το Kotlin/JVM μεταγλωττίζει κώδικα σε bytecode που εκτελείται σε 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 ms | ~500–1000 ms |
| Οικοσύστημα | Περιορισμένο (Kotlin + Interop) | Πλήρες (Kotlin + Java + Android SDK) |
| Μέγεθος δυαδικού | ~1–5 MB (με χρόνο εκτέλεσης) | ~100–500 KB (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 σε bytecode που απαιτεί εγκατεστημένη JVM. Το Kotlin/Native χρησιμοποιείται για iOS, ενσωματωμένα συστήματα και WebAssembly, το Kotlin/JVM για Android και διακομιστές.
Ναι, το Kotlin/Native μπορεί να χρησιμοποιηθεί ως ανεξάρτητος μεταγλωττιστής για δημιουργία εφαρμογών κονσόλας, εγγενών προσθέτων ή βιβλιοθηκών για οποιαδήποτε υποστηριζόμενη πλατφόρμα. Το KMM απλοποιεί μόνο την οργάνωση πολυπλατφορμικού κώδικα.
Memory Manager Το Kotlin/Native χρησιμοποιεί μέτρηση αναφορών με αυτόματο κυκλικό ανιχνευτή. Από το Kotlin 1.7.20, ο συλλέκτης σκουπιδιών δεν απαιτεί σχολιασμούς @ThreadLocal και λειτουργεί χωρίς διακοπή του κύριου νήματος iOS.
Μέσω του cinterop, όλα τα frameworks iOS είναι διαθέσιμα: Foundation, UIKit, CoreData, CoreBluetooth, MapKit και εκατοντάδες άλλα. Η JetBrains παρέχει έτοιμες δεσμεύσεις για τυπικές βιβλιοθήκες iOS στη σύνθεση του Kotlin/Native.
Για αποσφαλμάτωση χρησιμοποιείται Xcode με συνδεδεμένο Kotlin/Native framework. Τα σημεία διακοπής στον κώδικα Kotlin λειτουργούν κατά την εκτέλεση στον προσομοιωτή iOS. Για συσκευή απαιτείται κατασκευή Debug και προφίλ προγραμματιστή Apple.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης