Banyak bahasa pemrograman hanya berjalan di satu platform utama. Kotlin berbeda: kode yang kita tulis bisa dikompilasi ke lima target berbeda. Fleksibilitas ini bukan sekadar fitur pemasaran — keputusan target kompilasi menentukan di mana aplikasi kita bisa berjalan, library mana yang bisa dipakai, dan bagaimana proyek distrukturkan. Pada chapter ini kita akan memetakan kelima target utama Kotlin, menggambar diagram alur kompilasinya, dan membahas cara memilih target yang tepat.

Target Kompilasi Utama #

Kotlin mendukung lima target kompilasi resmi:

TargetOutputRuntime utamaKegunaan
Kotlin/JVMBytecode .class / .jarJava Virtual MachineServer-side, desktop, Android (sebagai backend JVM)
Kotlin/JSJavaScript / UMDBrowser, Node.jsAplikasi web front-end
Kotlin/NativeBiner asli via LLVMNative executableiOS, embedded, CLI cepat
AndroidDEX via Android Gradle PluginAndroid Runtime (ART)Aplikasi Android
WebAssembly (Wasm).wasmBrowser Wasm runtimeKomputasi berat di web

Diagram Alur Kompilasi #

Diagram berikut menggambarkan bagaimana kode Kotlin yang sama bisa diarahkan ke beberapa target melalui backend yang berbeda:

Alur di atas menunjukkan satu sumber kode Kotlin, lima jalur kompilasi, dan empat jenis output akhir. Untuk proyek Kotlin Multiplatform, satu kode di commonMain bisa mengalir ke beberapa target sekaligus.

Cara Memilih Target #

Pemilihan target kompilasi sebaiknya dipandu oleh kebutuhan proyek, bukan preferensi pribadi. Beberapa pertanyaan yang membantu:

  • Apakah aplikasi berjalan di server, browser, mobile, atau platform tertanam?
  • Apakah kita perlu memakai library Java yang sudah ada? Jika ya, pilih JVM.
  • Apakah targetnya iOS? Jika ya, pilih Native (atau KMP dengan target iOS).
  • Apakah kita butuh startup time sangat cepat di CLI? Native seringkali lebih cocok daripada JVM.

One Codebase, Multiple Platforms #

Dengan Kotlin Multiplatform, kita bisa menulis logika bisnis sekali di commonMain, lalu menyediakan implementasi spesifik per platform di iosMain, androidMain, jvmMain, dan seterusnya. Mekanisme expect/actual memungkinkan kita mendeklarasikan kontrak di kode umum dan mengisinya di kode platform. Kita akan membahasnya secara mendalam pada chapter Kotlin Multiplatform.

Memeriksa Target Aktif dari Dalam Program #

Kompilator Kotlin menyimpan informasi versi di dalam stdlib. Kita bisa mengeceknya saat runtime menggunakan KotlinVersion. Program berikut mencetak versi kompilator dan daftar target yang didukung:

kotlin
fun main() {
    val v = KotlinVersion.CURRENT
    println("Versi kompilator Kotlin: $v")
    println("  Mayor : ${v.major}")
    println("  Minor : ${v.minor}")
    println("  Patch : ${v.patch}")

    val targetKompilasi = listOf("JVM", "JS", "Native (LLVM)", "Android", "Wasm")
    println("Target kompilasi yang didukung Kotlin:")
    targetKompilasi.forEachIndexed { i, t ->
        println("  ${i + 1}. $t")
    }
}

Output yang Dihasilkan:

text
Versi kompilator Kotlin: 2.0.21
  Mayor : 2
  Minor : 0
  Patch : 21
Target kompilasi yang didukung Kotlin:
  1. JVM
  2. JS
  3. Native (LLVM)
  4. Android
  5. Wasm

Mari kita perhatikan bagian pentingnya:

  1. KotlinVersion.CURRENT: objek bawaan stdlib yang menyimpan versi kompilator saat runtime. Nilai ini ditentukan oleh kompilator, bukan dari sistem operasi.
  2. v.major, v.minor, v.patch: property pada KotlinVersion yang memudahkan kita membandingkan versi secara terprogram.
  3. forEachIndexed { i, t -> }: lambda menerima index dan elemen sekaligus, berguna saat kita butuh penomoran.

Referensi #

Referensi Lanjutan #

Selanjutnya #

Kelima target di atas memberi kita gambaran tentang jangkauan Kotlin. Pada chapter Kotlin/JVM berikutnya, kita akan membedah target paling matang dan paling banyak dipakai: bagaimana kode Kotlin berubah menjadi bytecode, dibungkus menjadi jar, dan berinteraksi langsung dengan library Java di runtime JVM.