Memastikan toolchain Scala terpasang dengan benar via Coursier, menulis dan menjalankan Hello World pertama dengan @main, serta mengenal tiga jalur eksekusi: scala run untuk file tunggal, kompilasi eksplisit dengan scalac, dan eksperimen cepat di REPL.

Setelah memahami arsitektur Scala di episode 2 — bagaimana scalac mengubah source menjadi bytecode JVM — sekarang saatnya praktik nyata pertama. Di episode 0 kita sudah menginstall toolchain; di episode ini kita memastikan semuanya berfungsi dan menulis program Scala pertama kalian.
Mengapa episode ini penting? Karena banyak developer JVM baru gagal di langkah pertama bukan karena bahasa, melainkan karena toolchain yang tidak konsisten — versi JDK salah, PATH tidak terkonfigurasi, atau memakai cara run yang ketinggalan zaman. Setelah episode ini, kalian akan punya alur kerja yang bersih untuk menjalankan kode Scala sepanjang series: cepat, bisa dipercaya, dan mudah di-debug.
Mulai dengan memastikan JDK dan Scala terpasang dengan benar:
java -version
scala -version
scalac -versionTiga perintah ini adalah barometer environment kalian:
java -version → harus 17 atau lebih baru (baseline Scala 3.8).scala -version → harus 3.8.4 (rilis 5 Juni 2026) atau versi 3.8.x lain.scalac -version → compiler tersedia, versi sama dengan scala.Jika scala tidak ditemukan, kemungkinan besar cs setup belum menambahkan ~/.local/share/coursier/bin ke PATH:
export PATH="$PATH:$HOME/.local/share/coursier/bin"Warning
Jangan pernah menjalankan Scala dengan JDK 8 jika memakai Scala 3.8 — baseline resminya JDK 17, dan versi di bawah itu akan menghasilkan error runtime yang membingungkan. Untuk project library yang butuh JDK 8, pakai jalur LTS 3.3.
Di Scala 3, cara paling ringkas mendefinisikan entry point adalah @main:
@main def hello(): Unit = println("Hello, Scala!")Buka folder ~/scala-lab, simpan file di atas sebagai hello.scala, lalu jalankan:
cd ~/scala-lab
scala run hello.scalaOutput-nya harus mencetak Hello, Scala!. Inilah jalur termudah untuk seluruh praktik di dua fase awal series ini.
Mari bedah program di atas baris per baris:
@main — annotation yang memberi tahu compiler: ini entry point. Compiler otomatis membuat class hello dengan method main statis, persis yang dicari JVM.def hello(): Unit — fungsi bernama hello, tanpa parameter, mengembalikan Unit (analog void di Java/C).println("Hello, Scala!") — mencetak string lalu newline.Unit adalah tipe khusus yang berarti "tidak ada nilai yang berguna dikembalikan" — kita akan sering bertemu lagi. Yang menarik: @main menerima parameter sebagai argumen command-line:
@main def hello(name: String, count: Int): Unit =
println(s"Hello, $name!")scala run hello.scala -- Bima 3Ada tiga cara menjalankan kode Scala, masing-masing dengan tempatnya sendiri:
Paling cepat untuk praktik dan prototyping — kita sudah memakainya di atas. Scala CLI mengelola dependensi lewat using directives di bagian atas file:
//> using dep "org.typelevel::cats-core:2.13.0"
@main def run(): Unit = println("pakai cats")Berkat directive ini, file tunggal bisa memakai library eksternal tanpa project sbt. Di episode 9 kita akan memakai ini lebih serius.
Untuk memahami apa yang terjadi di balik layar, kompilasi secara manual:
scalac hello.scala
scala helloscalac menghasilkan file .class (dan .tasty) di direktori kerja, lalu scala hello menjalankan class hello yang dihasilkan @main. Ini persis yang episode 2 bicarakan: .scala → bytecode → JVM.
Ketika ingin mencoba ekspresi tanpa membuat file:
scala
scala> val names = List("Sari", "Budi", "Eka")
scala> names.map(_.toUpperCase)
val res0: List[String] = List(SARI, BUDI, EKA)
scala> :quitREPL berguna untuk menguji sintaks dan melihat tipe hasil secara instan. Di Scala 3.8, REPL terpisah menjadi artifact scala3-repl — jika scala tidak membuka REPL, pastikan artifact tersebut terinstall:
cs install scala3-replTip
Selama dua fase awal series (episode 3-8), scala run dan REPL adalah teman terbaik kalian: cepat, tanpa build step, dan langsung memberi umpan balik. Kita baru benar-benar beralih ke proyek sbt di episode 9.
Untuk latihan yang lebih teratur, buat struktur minimal:
scala-lab/
hello.scala
name.scalaBeberapa file bisa dipakai bersama: scala run hello.scala name.scala mengkompilasi keduanya dalam satu sesi, sehingga definisi di satu file bisa dipakai file lain. Untuk jumlah file lebih dari beberapa, kalian akan ingin project sbt (episode 9).
not found: value ... — fungsi/val dipakai sebelum didefinisikan di file lain yang tidak diikutkan saat scala run. Sertakan semua file yang dibutuhkan.scala dan scalac dari versi berbeda. Cek keduanya dengan scala -version dan scalac -version.Yang sudah kalian lakukan di episode 3:
scala 3.8.x, dan scalac 3.8.x terverifikasi.scala run, dengan anatomi @main, def, dan Unit yang dipahami.scala run, scalac + scala, dan REPL.//> using dep untuk dependency pada file tunggal.Inti yang harus dibawa pulang:
java -version, scala -version, dan scalac -version.@main def; fungsi mengembalikan Unit untuk efek saja.scala run adalah jalur tercepat untuk file tunggal; REPL untuk eksperimen; scalac manual untuk memahami kompilasi.Di episode 4 selanjutnya, kita masuk ke inti sintaks: val dan var — mengapa Scala mendorong val immutable, bagaimana type inference bekerja, dan cara mendefinisikan fungsi dengan parameter, default argumen, serta named arguments. Sampai jumpa di episode 4!