Kotlin/JVM adalah target kompilasi paling tua, paling matang, dan paling banyak dipakai di proyek nyata. Hampir semua library Kotlin yang ada di Maven Central berasal dari kompilasi target ini. Pada chapter ini kita akan membahas apa itu Kotlin/JVM, bagaimana kode Kotlin diubah menjadi bytecode, dibungkus menjadi jar, dan bagaimana semua itu tetap berinteraksi mulus dengan library Java.
Apa itu Kotlin/JVM #
Kotlin/JVM adalah backend kompilator yang mengubah kode sumber Kotlin menjadi bytecode Java — instruksi biner yang dijalankan oleh Java Virtual Machine. Outputnya sama persis formatnya dengan output javac: file .class yang bisa dimuat langsung oleh JVM.
Karena outputnya berupa bytecode standar Java, Kotlin sering disebut sebagai “bahasa JVM” bersama Java, Scala, dan Groovy. Setiap file .kt yang kita kompilasi akan menghasilkan satu atau lebih file .class dengan struktur internal identik dengan class Java.
Kompilasi ke Bytecode #
Proses kompilasi Kotlin/JVM terdiri dari empat tahap utama:
- Lexing & Parsing: kode sumber dipecah menjadi token, lalu dibentuk menjadi Abstract Syntax Tree (AST).
- Semantic Analysis: kompilator memeriksa tipe, resolusi function, dan validasi null-safety.
- IR (Intermediate Representation): sejak Kotlin 1.5, kompilator menggunakan IR sebagai representasi tengah — hal ini juga yang menjadi fondasi K2 compiler.
- Code Generation: IR diturunkan menjadi bytecode
.classoleh backend JVM.
Hasil akhirnya adalah file .class yang sepenuhnya kompatibel dengan JVM 8 ke atas (bisa dikonfigurasi hingga JVM 21).
Jar Packaging #
Untuk mendistribusikan aplikasi Kotlin/JVM, kita biasanya membungkus semua file .class ke dalam satu file .jar (Java Archive). Kompilator kotlinc bisa membuat jar berisi runtime Kotlin sekaligus dengan opsi -include-runtime:
kotlinc Halo.kt -include-runtime -d halo.jar
java -jar halo.jarHasil perintah di atas adalah file halo.jar yang bisa dijalankan di mesin mana pun selama JVM terpasang, tanpa perlu library Kotlin terpisah.
Bahasa JVM #
Sebagai bahasa JVM, Kotlin memanfaatkan ekosistem yang sudah puluhan tahun matang:
- Garbage Collection: memori dikelola otomatis oleh JVM (G1, ZGC, Shenandoah, dll).
- Tooling: profiler seperti VisualVM dan async-profiler bisa dipakai langsung.
- Library: Spring, Hibernate, JUnit, Jackson, dan ribuan library lain bisa dipakai tanpa wrapper.
- Deployment: format jar/kusiner sesuai container Docker dan layanan cloud standar.
Interoperabilitas dengan Library Java #
Interoperabilitas adalah kekuatan utama Kotlin/JVM. Kode Kotlin bisa langsung memakai class Java apa pun, termasuk seluruh Java Standard Library (java.util, java.io, java.time, dan seterusnya). Sebagai contoh, kode Kotlin berikut memakai java.util.TreeMap persis seperti di Java:
import java.util.TreeMap
fun main() {
val buah = TreeMap<String, Int>()
buah["apel"] = 12
buah["jeruk"] = 8
buah["mangga"] = 5
println("Daftar buah (urutan TreeMap):")
buah.forEach { (nama, jumlah) ->
println(" $nama: $jumlah")
}
val total = buah.values.sum()
println("Total buah: $total")
val kelas = buah::class.simpleName
println("Tipe koleksi: $kelas (berasal dari java.util)")
}Output yang Dihasilkan:
Daftar buah (urutan TreeMap):
apel: 12
jeruk: 8
mangga: 5
Total buah: 25
Tipe koleksi: TreeMap (berasal dari java.util)Beberapa hal yang perlu kita perhatikan dari kode di atas:
import java.util.TreeMap: import class Java langsung tanpa wrapper. Tidak ada perbedaan sintaks antara memakai class Java dan class Kotlin.buah["apel"] = 12: notasi index assignment ini diterjemahkan menjadi pemanggilanbuah.put("apel", 12)di bytecode — operator overloadingsetmemetakan ke methodputmilikMap.buah.forEach { (nama, jumlah) -> ... }: lambda Kotlin dijalankan di atasforEachJava yang menerimaBiConsumer. Kompilator menyusun adapter secara otomatis.buah::class.simpleName: reflection Kotlin membungkusjava.lang.Class, sehinggasimpleNamemengembalikan nama class sederhana.
Karakteristik Runtime Kotlin/JVM #
Runtime Kotlin (stdlib) berukuran sekitar 1-2 MB dan otomatis disertakan saat kita memakai -include-runtime. Runtime ini berisi:
- Function stdlib seperti
println,listOf,mapOf - Implementasi
kotlin.collectionsyang sebagian besar membungkusjava.utildengan API yang konsisten - Dukungan coroutines (
kotlinx.coroutinesperlu ditambahkan terpisah) - Reflection API Kotlin (
kotlin-reflect)
Referensi #
Referensi Lanjutan #
- Kotlin server-side overview — ringkasan Kotlin untuk backend JVM yang menjelaskan keunggulan kompilasi ke bytecode
- Kotlin documentation home — halaman utama dokumentasi Kotlin sebagai rujukan target JVM
Selanjutnya #
Kotlin/JVM unggul di server dan desktop, tetapi bagaimana jika kita ingin berbagi kode antara Android dan iOS, atau antara server dan web? Chapter Kotlin Multiplatform akan menjawab dengan memperkenalkan struktur source set commonMain dan mekanisme expect/actual yang menjadi inti strategi lintas platform Kotlin.