Kotlin/Native — nó là gì, trình biên dịch mã gốc và tính năng

Tác giả: IT Sectr Đã đăng: 2026-06-05 Thời gian đọc: 8 phút

Kotlin/Native là trình biên dịch dịch mã Kotlin trực tiếp thành mã máy gốc, hoạt động không cần máy ảo. Không giống như phiên bản JVM, Kotlin/Native sử dụng backend LLVM để tạo tệp thực thi cho iOS, Android NDK, macOS, Windows, Linux và WebAssembly. Công nghệ này là nền tảng của Kotlin Multiplatform và cho phép thực thi mã dùng chung trên các nền tảng không có JVM. Theo JetBrains, 2025, Kotlin/Native hỗ trợ 13 nền tảng mục tiêu và cho phép tái sử dụng tới 90% mã trong các dự án KMM.

Những điểm chính

  • Kotlin/Native là trình biên dịch dịch mã Kotlin thành mã máy gốc mà không sử dụng JVM.
  • LLVM là backend của trình biên dịch chịu trách nhiệm tạo mã máy cho mỗi nền tảng mục tiêu.
  • KMM — Kotlin Multiplatform Mobile sử dụng Kotlin/Native để thực thi mã dùng chung trên các thiết bị iOS.
  • Memory Manager là bộ thu gom rác tự động dựa trên đếm tham chiếu mà không dừng luồng.
  • Interop là cơ chế tương tác hai chiều với các thư viện gốc Objective-C, Swift và C.

Kotlin/Native là gì?

Kotlin/Native là công nghệ biên dịch mã Kotlin thành mã máy gốc, được phát triển bởi JetBrains. Sự khác biệt chính so với Kotlin/JVM là không cần máy ảo — tệp thực thi kết quả chỉ chứa mã máy và thời gian chạy tối thiểu. Điều này cho phép chạy các ứng dụng Kotlin trên các thiết bị và hệ thống không hỗ trợ JVM, bao gồm iPhone, Apple Watch và hệ thống nhúng.

Lịch sử của Kotlin/Native bắt đầu với một dự án — một trình biên dịch thử nghiệm được tích hợp vào nhánh chính của Kotlin vào năm 2017. Năm 2019, tại KotlinConf, hỗ trợ cho iOS như một nền tảng mục tiêu đã được công bố, trở thành bước ngoặt cho phát triển di động. Kể từ Kotlin 1.9.20, trình biên dịch Kotlin/Native đã đạt được sự ổn định và được bao gồm trong Kotlin Multiplatform theo mặc định.

Tính năng chính của Kotlin/Native là sử dụng biểu diễn trung gian chung IR, được biên dịch thành mã máy cho mỗi nền tảng riêng biệt. Điều này cung cấp một frontend biên dịch thống nhất cho tất cả các backend của Kotlin: JVM, JS và Native.

Trình biên dịch Kotlin/Native hoạt động như thế nào

Biên dịch trong Kotlin/Native trải qua nhiều giai đoạn chuyển đổi. Mã nguồn Kotlin trước tiên được chuyển đổi thành biểu diễn nội bộ, sau đó được tối ưu hóa và chuyển đến backend LLVM để tạo mã máy. Giai đoạn cuối cùng là liên kết với các thư viện thời gian chạy và tạo tệp thực thi hoặc thư viện động.

Kiến trúc bao gồm ba thành phần chính: frontend (phân tích và kiểm tra kiểu), trình tạo IR (xây dựng biểu diễn trung gian) và backend LLVM (tạo mã máy). Sơ đồ này tương tự như cách tiếp cận được sử dụng trong trình biên dịch Clang cho C++ và Rust.

kotlin
// Biên dịch Kotlin/Native qua dòng lệnh
kotlinc-native hello.kt -o hello -opt

// Xây dựng cho iOS arm64 qua Kotlin Multiplatform
./gradlew :shared:linkDebugFrameworkIosArm64

Để quản lý bộ nhớ, Kotlin/Native sử dụng Memory Manager riêng, dựa trên đếm tham chiếu với bộ phát hiện chu trình. Kể từ Kotlin 1.7.20, trình quản lý bộ nhớ mới hoạt động theo mặc định và không yêu cầu chú thích @ThreadLocal hoặc @SharedImmutable. Bộ thu gom rác hoạt động mà không dừng luồng, điều này rất quan trọng đối với iOS, nơi hệ thống có thể buộc kết thúc ứng dụng trong thời gian chặn kéo dài luồng chính.

Các giai đoạn biên dịch Kotlin/Native

Quá trình biên dịch được chia thành năm giai đoạn: phân tích cú pháp (phân tích mã nguồn), phân tích ngữ nghĩa (kiểm tra kiểu và giải quyết tên), tạo IR (xây dựng biểu diễn trung gian), tối ưu hóa (đơn giản hóa và loại bỏ mã chết) và tạo mã qua LLVM. Mỗi giai đoạn có thể được thực thi song song cho các mô-đun khác nhau, giúp tăng tốc độ xây dựng các dự án lớn.

Giai đoạnThời lượngKết quả
Phân tích cú pháp~10% thời gianCây AST của mã nguồn
Phân tích ngữ nghĩa~20% thời gianAST đã định kiểu
Tạo IR~15% thời gianKotlin IR (Biểu diễn trung gian)
Tối ưu hóa~25% thời gianIR đã tối ưu hóa
Tạo mã LLVM~30% thời gianMã máy + tệp thực thi

Các nền tảng được Kotlin/Native hỗ trợ

Kotlin/Native hỗ trợ 13 nền tảng mục tiêu, được chia thành các danh mục. Cho phát triển di động, iOS (arm64), Android (arm32, arm64, x86_64)watchOS có sẵn. Các nền tảng máy tính để bàn bao gồm macOS (x64, arm64), Windows (mingw x64) và Linux (x64, arm64, arm32). Cho phát triển máy chủ và nhúng, WebAssembly và Kotlin/Native trên LLVM không có hệ điều hành (standalone) có sẵn. Mỗi nền tảng yêu cầu một framework hoặc thư viện riêng biệt làm đầu ra.

Nền tảng phát triển di động

Đối với iOS, Kotlin/Native tạo một framework phổ quát (.framework) có thể được kết nối với dự án Xcode. Đối với Android NDK, các thư viện gốc .so được tạo ra có thể gọi qua JNI. watchOS được hỗ trợ từ Kotlin 1.6.0 và tvOS từ phiên bản 1.7.0. Mỗi kiến trúc yêu cầu một bản dựng riêng, nhưng Kotlin Multiplatform tự động hóa quy trình này thông qua plugin Gradle.

Nền tảng máy tính để bàn và máy chủ

macOSLinux được sử dụng để phát triển ứng dụng máy tính để bàn gốc bằng Kotlin với framework Compose Multiplatform. Windows (MinGW) được hỗ trợ từ Kotlin 1.3.70 và cho phép tạo ứng dụng Windows mà không cần cài đặt JVM. Cho phát triển máy chủ, Kotlin/Native có thể được sử dụng trong môi trường không có JVM, như container Docker với hình ảnh tối thiểu dựa trên scratch hoặc Alpine.

Danh mụcNền tảngKiến trúc
Di độngiOSarm64, trình mô phỏng (x64, arm64)
Di độngAndroid NDKarm32, arm64, x86, x86_64
Đeo đượcwatchOSarm64, trình mô phỏng (x64)
Máy tính để bànmacOSx64, arm64
Máy tính để bànWindowsmingw x64
Máy tính để bànLinuxx64, arm64, arm32

Kotlin/Native cho phát triển iOS

iOS là nền tảng mục tiêu chính của Kotlin/Native trong bối cảnh KMM. Trình biên dịch tạo một framework iOS chứa tất cả mã dùng chung, sau đó được kết nối với dự án Xcode. Framework hỗ trợ cả liên kết tĩnh và động. Kotlin/Native tạo các wrapper Objective-C cho các lớp và hàm Kotlin, cung cấp tích hợp trực tiếp với mã Swift và Objective-C.

Tích hợp với iOS yêu cầu cấu hình Xcode để kết nối framework đã tạo. Kotlin Multiplatform tự động hóa quy trình này bằng tác vụ embedAndSignAppleFrameworkForXcode, được gọi từ Xcode Build Phases. Để gỡ lỗi, Kotlin/Native hỗ trợ các điểm dừng trong mã mô-đun dùng chung khi chạy ứng dụng trên trình mô phỏng iOS.

kotlin
// Mã Kotlin được biên dịch thành framework 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 với Objective-C và Swift

Interop với mã iOS hoạt động theo cả hai hướng. Kotlin/Native tạo các tiêu đề Objective-C cho các lớp Kotlin, tự động có thể truy cập từ Swift. Giao tiếp ngược được cung cấp bằng chú thích @ObjCName để xuất các hàm Kotlin dưới tên Objective-C được chỉ định. Bộ sưu tập Kotlin tự động được chuyển đổi thành NSArray và NSDictionary, và coroutine Kotlin được bọc trong các publisher Combine qua thư viện SKIE. Để làm việc với các framework iOS từ Kotlin, cinterop được sử dụng — một công cụ tạo ràng buộc Kotlin cho các tiêu đề Objective-C.

Ví dụ mã: thiết lập và biên dịch

Để bắt đầu với Kotlin/Native, cần cấu hình build.gradle.kts với plugin Kotlin Multiplatform và các nền tảng mục tiêu. Hãy xem cấu hình tối thiểu cho dự án KMM hỗ trợ iOS và Android.

kotlin
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")
        }
    }
}

Sau khi thiết lập bản dựng, có thể thêm mã dành riêng cho nền tảng. Kotlin/Native cung cấp quyền truy cập vào các hàm iOS thông qua wrapper Kotlin. Ví dụ: lấy UUID thiết bị trên iOS yêu cầu gọi NSUUID từ Foundation.

kotlin
import platform.Foundation.NSUUID

fun getDeviceId(): String {
    return NSUUID().UUIDString()
}

fun currentTimestampMillis(): Long {
    return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}

Xây dựng framework iOS

Để tạo framework iOS, tác vụ Gradle linkDebugFrameworkIosArm64 hoặc linkReleaseFrameworkIosArm64 cho sản xuất được sử dụng. Sau khi xây dựng, framework nằm trong build/bin/iosArm64/debugFramework/. Kết nối với dự án Xcode được thực hiện qua Pods Podfile hoặc thêm framework vào General → Frameworks, Libraries and Embedded Content.

kotlin
// Xây dựng framework release cho iOS arm64
./gradlew :shared:linkReleaseFrameworkIosArm64

// Xây dựng framework phổ quát x86_64 + arm64
./gradlew :shared:linkReleaseFrameworkIosX64 \
    :shared:linkReleaseFrameworkIosArm64

// Tạo XCFramework cho App Store
./gradlew :shared:assembleReleaseXCFramework

Kotlin/Native vs Kotlin/JVM: so sánh

Kotlin/Native và Kotlin/JVM khác nhau về kiến trúc, hiệu suất và phạm vi ứng dụng. Kotlin/JVM biên dịch mã thành bytecode chạy trên JVM, cung cấp quyền truy cập vào hệ sinh thái thư viện Java rộng lớn, nhưng yêu cầu máy ảo đã cài đặt. Kotlin/Native tạo tệp thực thi không có phụ thuộc bên ngoài, nhưng với hệ sinh thái thư viện hạn chế hơn.

Hiệu suất thời gian khởi động cao hơn ở Kotlin/Native vì không cần tải JVM. Theo điểm chuẩn của JetBrains, ứng dụng Hello World trên Kotlin/Native khởi động trong 0,003 giây, trong khi Kotlin/JVM cần 0,5–1 giây để tải máy ảo. Tuy nhiên, kích thước tệp thực thi của Kotlin/Native có thể lớn hơn 2–3 lần do thời gian chạy được bao gồm.

Đặc điểmKotlin/NativeKotlin/JVM
Nền tảng mục tiêuiOS, macOS, Windows, Linux, WebAssembly, nhúngMáy chủ, Android, máy tính để bàn (JVM)
Phụ thuộcKhông có thời gian chạy (tự chứa)Yêu cầu JVM (JDK/JRE)
Thời gian khởi động~3 ms~500–1000 ms
Hệ sinh tháiHạn chế (Kotlin + Interop)Đầy đủ (Kotlin + Java + Android SDK)
Kích thước tệp nhị phân~1–5 MB (có thời gian chạy)~100–500 KB (JAR)

Sự lựa chọn giữa Kotlin/Native và Kotlin/JVM phụ thuộc vào nền tảng mục tiêu. Nếu dự án nhắm đến iOS hoặc yêu cầu tiêu thụ tài nguyên tối thiểu, Kotlin/Native là lựa chọn duy nhất. Đối với phát triển Android, Kotlin/JVM vẫn là tiêu chuẩn, mặc dù Kotlin/Native được sử dụng cho các thành phần NDK nơi cần hiệu suất gốc. Trong các dự án đa nền tảng, Kotlin Multiplatform kết hợp cả hai cách tiếp cận: mã dùng chung được biên dịch qua Kotlin/Native cho iOS và qua Kotlin/JVM cho Android.

Câu hỏi thường gặp

Kotlin/Native khác Kotlin/JVM như thế nào?

Kotlin/Native biên dịch mã thành mã máy gốc không cần máy ảo, trong khi Kotlin/JVM biên dịch thành bytecode yêu cầu JVM đã cài đặt. Kotlin/Native được sử dụng cho iOS, hệ thống nhúng và WebAssembly, còn Kotlin/JVM được sử dụng cho Android và máy chủ.

Có thể sử dụng Kotlin/Native mà không cần KMM không?

Có, Kotlin/Native có thể được sử dụng như một trình biên dịch độc lập để tạo ứng dụng console, plugin gốc hoặc thư viện cho bất kỳ nền tảng được hỗ trợ nào. KMM chỉ đơn giản hóa việc tổ chức mã đa nền tảng.

Kotlin/Native quản lý bộ nhớ trên iOS như thế nào?

Memory Manager của Kotlin/Native sử dụng đếm tham chiếu với bộ phát hiện chu trình tự động. Kể từ Kotlin 1.7.20, bộ thu gom rác không yêu cầu chú thích @ThreadLocal và hoạt động mà không dừng luồng chính iOS.

Những thư viện iOS nào có thể truy cập từ Kotlin/Native?

Thông qua cinterop, tất cả các framework iOS đều có thể truy cập: Foundation, UIKit, CoreData, CoreBluetooth, MapKit và hàng trăm framework khác. JetBrains cung cấp các ràng buộc có sẵn cho các thư viện iOS tiêu chuẩn như một phần của Kotlin/Native.

Làm thế nào để gỡ lỗi mã Kotlin/Native trên iOS?

Việc gỡ lỗi được thực hiện bằng Xcode với framework Kotlin/Native được kết nối. Các điểm dừng trong mã Kotlin hoạt động khi chạy trên trình mô phỏng iOS. Đối với thiết bị thật, cần có bản dựng Debug và hồ sơ nhà phát triển Apple.

Tổng kết

  • Kotlin/Native là trình biên dịch Kotlin sang mã gốc, nền tảng của Kotlin Multiplatform Mobile.
  • Backend LLVM cung cấp khả năng tạo mã máy cho 13 nền tảng mục tiêu, bao gồm iOS, Android NDK, macOS và Windows.
  • Memory Manager với đếm tham chiếu hoạt động không dừng luồng, rất quan trọng cho các nền tảng di động.
  • Framework iOS được tạo tự động và kết nối với dự án Xcode qua embedAndSignAppleFrameworkForXcode.
  • Interop Objective-C và Swift cung cấp tích hợp hai chiều với mã iOS gốc qua cinterop và @ObjCName.
  • Hiệu suất khởi động của Kotlin/Native cao hơn đáng kể so với phiên bản JVM — lên tới 0,003 giây thay vì 0,5–1 giây.
  • Sử dụng Kotlin/Native cho iOS, hệ thống nhúng và WebAssembly nơi JVM không có sẵn hoặc không mong muốn.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm