Kotlin tidak hanya berfungsi sebagai bahasa kompilasi penuh untuk aplikasi besar. Bahasa ini juga mendukung mode scripting lewat file .kts yang dieksekusi langsung tanpa langkah kompilasi eksplisit. Mode ini berguna untuk tugas otomasi ringan, build script, prototipe cepat, dan DSL internal. Pada bab ini kita akan mengenal tiga wajah Kotlin Scripting: file .kts yang berdiri sendiri, ekspresi inline via kotlinc -e, dan embed skrip dalam aplikasi via JSR-223. Kita juga akan memetakan use case nyata agar tahu kapan memilih skrip dan kapan tetap memakai project utuh.
Apa Itu Kotlin Scripting #
Kotlin Scripting adalah fitur kompilator yang mengeksekusi file Kotlin sebagai skrip. File .kts berisi pernyataan top-level tanpa boilerplate class atau fun main. Saat dijalankan, kompilator membungkus pernyataan tersebut menjadi sebuah class generated dan memanggil entry point internal.
Tiga wajah eksekusi skrip yang paling sering dipakai:
| Mode | Perintah | Cocok untuk |
|---|---|---|
File .kts | kotlinc -script halo.kts | Skrip satu file dengan dependensi |
| Inline | kotlinc -e "println(42)" | Ekspresi cepat, pengganti REPL |
| JSR-223 | ScriptEngine dari aplikasi Java/Kotlin | Embed skrip pengguna, DSL runtime |
File .kts mendukung sebagian besar fitur Kotlin biasa: data class, extension function, coroutines. Yang membedakan adalah tidak perlu membungkus kode dalam fun main().
Anatomi Skrip Sederhana #
Skrip Kotlin paling sederhana hanya berisi beberapa baris pernyataan top-level. Variabel, pemanggilan function, dan println langsung ditulis tanpa deklarasi class.
// Demo konsep Kotlin Scripting: bagaimana compiler memproses .kts
// Simulasi inline: menampilkan kode sumber skrip yang setara, lalu
// menunjukkan output yang dihasilkan saat skrip dijalankan.
fun main() {
println("=== Konsep Kotlin Scripting ===")
println()
// Skrip Kotlin memungkinkan pernyataan top-level tanpa class wrapper.
val skripSumber = """
|// file: halo.kts
|val nama = "Budi"
|val tahun = 2026
|println("Halo, " + nama + "! Selamat datang di tahun " + tahun)
""".trimMargin()
println("Sumber skrip (halo.kts):")
println(skripSumber)
println()
// Simulasi output: kompilator menjalankan skrip seolah-olah dibungkus
// dalam function main() dengan args yang mungkin.
val nama = "Budi"
val tahun = 2026
println("Output yang setara saat .kts dijalankan:")
println("Halo, $nama! Selamat datang di tahun $tahun")
println()
// Tiga mode eksekusi yang didukung Kotlin
val mode = listOf(
Triple("kotlinc -script halo.kts", "Langsung dari file .kts", "Skrip satu file"),
Triple("kotlinc -e 'println(42)'", "Ekspresi inline via -e", "REPL cepat"),
Triple("JSR-223 ScriptEngine", "Dipanggil dari aplikasi Java/Kotlin", "Embed skrip dalam app")
)
println("Mode eksekusi yang didukung:")
for ((perintah, keterangan, cocok) in mode) {
println(" $perintah")
println(" $keterangan")
println(" Cocok untuk: $cocok")
}
}Output yang Dihasilkan:
=== Konsep Kotlin Scripting ===
Sumber skrip (halo.kts):
// file: halo.kts
val nama = "Budi"
val tahun = 2026
println("Halo, " + nama + "! Selamat datang di tahun " + tahun)
Output yang setara saat .kts dijalankan:
Halo, Budi! Selamat datang di tahun 2026
Mode eksekusi yang didukung:
kotlinc -script halo.kts
Langsung dari file .kts
Cocok untuk: Skrip satu file
kotlinc -e 'println(42)'
Ekspresi inline via -e
Cocok untuk: REPL cepat
JSR-223 ScriptEngine
Dipanggil dari aplikasi Java/Kotlin
Cocok untuk: Embed skrip dalam appMari kita amati baris-baris kunci pada kode di atas:
- Blok
skripSumber: string multi-baris dengantrimMargin()menampilkan sumber.ktsseolah-olah dibaca dari file. Tanda|di awal baris dipakai olehtrimMarginsebagai penanda indentasi yang akan dipangkas. - Variabel top-level simulasi
namadantahun: meskipun berada di dalammain(), blok ini merepresentasikan pernyataan top-level yang ada di file.ktsasli. Pada skrip nyata, kedua baris ini akan muncul tanpa pembungkus function. - Daftar
mode: daftarTriplememetakan tiga mode eksekusi skrip beserta keterangan singkat dan contoh use case yang paling cocok.
Use Case Nyata #
Skrip Kotlin paling sering dipakai dalam empat skenario: build script (Gradle Kotlin DSL adalah contoh terbesar), REPL dan eksperimen cepat, otomasi operasi file dan CI, serta DSL internal untuk domain spesifik.
plugins {
kotlin("jvm") version "2.0.21"
application
}
application {
mainClass.set("com.example.App")
}
dependencies {
implementation(kotlin("stdlib"))
testImplementation(kotlin("test"))
}Gradle memilih Kotlin DSL karena skrip bisa memiliki type-safety penuh, IDE autocomplete, dan refactor support — hal yang sulit didapat dari Groovy. Konsep serupa dipakai oleh JetBrains untuk mendefinisikan build script dan project template.
JSR-223 untuk Embed Skrip #
JSR-223 adalah standar Java untuk menjalankan bahasa skrip dalam JVM. Kotlin menyediakan implementasi ScriptEngine yang memungkinkan aplikasi Java/Kotlin menerima skrip dari pengguna pada runtime. Skrip ini bisa berisi konfigurasi dinamis, rumus matematika, atau aturan bisnis yang berubah tanpa recompile aplikasi utama.
import javax.script.ScriptEngineManager
val engine = ScriptEngineManager().getEngineByExtension("kts")
val hasil = engine.eval("val x = 40\nx + 2")
println(hasil) // 42ScriptEngine mengompilasi skrip sekali, lalu mengeksekusinya dalam konteks terisolasi. Cocok untuk plugin system, formula engine, atau aturan validasi dinamis. Biaya startup relatif tinggi (sekitar 100-300 ms per kompilasi skrip), jadi cache CompiledScript bila skrip yang sama dipakai berulang.
Kapan Memilih Skrip vs Project Utuh #
Skrip unggul untuk tugas satu file, sekali jalan, dan iterasi cepat. Project utuh lebih baik untuk kode yang dipakai jangka panjang, membutuhkan testing formal, atau memiliki banyak dependensi yang harus direproduksi. Tabel ringkas berikut membantu memilih:
| Kriteria | Pilih Skrip | Pilih Project |
|---|---|---|
| Jumlah file | Satu file | Banyak file |
| Siklus hidup | Sekali jalan, lalu buang | Dipelihara, di-test, di-version |
| Dependensi | Stdlib saja | Multi-library dengan Gradle |
| Tim | Penulis tunggal | Kolaborasi, code review |
Referensi Lanjutan #
- Kotlin Scripting
— dokumentasi resmi Kotlin Scripting untuk
kotlinscript dan JSR-223 - kotlin-main-kts
— halaman GitHub
kotlin-main-ktsuntuk skrip.main.kts
Selanjutnya #
Setelah memahami konsep Kotlin Scripting, langkah berikutnya adalah membedah anatomi file .kts lebih dalam — top-level statement, akses args, dan shebang untuk pemanggilan langsung. Materi tersebut akan kita bahas pada chapter Kotlin Script Files.