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:

ModePerintahCocok untuk
File .ktskotlinc -script halo.ktsSkrip satu file dengan dependensi
Inlinekotlinc -e "println(42)"Ekspresi cepat, pengganti REPL
JSR-223ScriptEngine dari aplikasi Java/KotlinEmbed 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.

kotlin
// 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:

text
=== 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 app

Mari kita amati baris-baris kunci pada kode di atas:

  1. Blok skripSumber: string multi-baris dengan trimMargin() menampilkan sumber .kts seolah-olah dibaca dari file. Tanda | di awal baris dipakai oleh trimMargin sebagai penanda indentasi yang akan dipangkas.
  2. Variabel top-level simulasi nama dan tahun: meskipun berada di dalam main(), blok ini merepresentasikan pernyataan top-level yang ada di file .kts asli. Pada skrip nyata, kedua baris ini akan muncul tanpa pembungkus function.
  3. Daftar mode: daftar Triple memetakan 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.

kotlin Contoh: Gradle Kotlin DSL (build.gradle.kts)
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.

kotlin Konsep JSR-223 dengan Kotlin ScriptEngine
import javax.script.ScriptEngineManager

val engine = ScriptEngineManager().getEngineByExtension("kts")
val hasil = engine.eval("val x = 40\nx + 2")
println(hasil)  // 42

ScriptEngine 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:

KriteriaPilih SkripPilih Project
Jumlah fileSatu fileBanyak file
Siklus hidupSekali jalan, lalu buangDipelihara, di-test, di-version
DependensiStdlib sajaMulti-library dengan Gradle
TimPenulis tunggalKolaborasi, code review

Referensi Lanjutan #

  • Kotlin Scripting — dokumentasi resmi Kotlin Scripting untuk kotlin script dan JSR-223
  • kotlin-main-kts — halaman GitHub kotlin-main-kts untuk 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.