Setiap program Odin memiliki bentuk awal yang sama, yaitu berkas sumber yang dideklarasikan sebagai package, memuat impor pustaka yang dibutuhkan, dan menempatkan titik masuk eksekusi pada proc main. Topik ini membahas struktur minimal sebuah berkas Odin, dua mode perintah odin run, cara membangun binari dengan perintah odin build, serta satu kesalahan umum ketika deklarasi package dilupakan. Setelah topik ini dibaca, program sederhana dapat ditulis, dijalankan dari dua mode perintah, dan dibangun menjadi berkas binari.
Struktur berkas Odin#
Setiap berkas sumber Odin wajib diawali deklarasi package pada baris pertama. Package adalah unit kompilasi, yakni kumpulan berkas yang diperlakukan sebagai satu kesatuan ketika program dibangun. Deklarasi package main memiliki makna khusus karena hanya package bernama main yang boleh memuat main :: proc(), proc yang menjadi entry point, yaitu titik ketika eksekusi program dimulai. Program tanpa proc main tidak dapat dijalankan karena tidak memiliki titik awal.
Baris berikutnya berisi impor pustaka yang dibutuhkan. Odin menyediakan pustaka standar bernama core, dan import "core:fmt" membuka akses ke pustaka format teks miliknya. Seluruh proc core:fmt diakses melalui nama package asalnya, sehingga pencetakan teks ditulis sebagai fmt.println dan bukan println langsung. Aturan ini membuat asal setiap proc terlihat di tempatnya dipanggil.
Kata kunci proc, kependekan dari procedure, adalah cara Odin menyebut fungsi. Deklarasi main :: proc() mendefinisikan proc bernama main tanpa parameter dan tanpa nilai kembalian. Isi proc ditulis di antara pasangan kurung kurawal, dan pernyataan di dalamnya dijalankan secara berurutan dari atas ke bawah.
Ketiga bagian tersebut terlihat lengkap pada program pertama di bawah ini, yang dipakai sepanjang topik.
package main
import "core:fmt"
main :: proc() {
fmt.println("Halo, Odin!")
}Menjalankan dengan odin run#
Perintah odin run mengompilasi program lalu langsung menjalankan hasilnya tanpa menyimpan binari di direktori proyek. Perintah ini mempunyai dua mode pemanggilan, yaitu mode berkas tunggal dan mode direktori. Pada proyek yang hanya berisi satu berkas sumber, kedua mode menghasilkan program dan keluaran yang sama.
Mode berkas tunggal menyebut berkas sumber secara langsung, diikuti opsi -file. Mode ini paling praktis untuk menguji satu berkas kecil.
# mengompilasi dan menjalankan satu berkas sumber
odin run main.odin -fileHalo, Odin!Mode direktori menyebut direktori alih-alih berkas sumbernya. Odin lalu memperlakukan seluruh berkas .odin di dalam direktori tersebut sebagai satu package dan mengompilasinya bersama-sama, sedangkan berkas lain seperti index.md diabaikan. Perintahnya dijalankan dari dalam direktori proyek, yaitu direktori tempat main.odin berada, dan titik pada akhir perintah menunjuk direktori kerja saat ini.
# mengompilasi dan menjalankan package di direktori kerja
odin run .Halo, Odin!Kedua perintah mencetak teks yang sama karena programnya sama pula. Teks Halo, Odin! tidak dihasilkan oleh perintah odin, melainkan oleh fmt.println("Halo, Odin!") yang dipanggil di dalam proc main. Perintah odin hanya mengubah kode sumber menjadi program yang berjalan, sedangkan isi program menentukan apa yang dicetak. Proc println dari pustaka fmt mencetak argumennya diikuti satu baris baru, sehingga setiap pemanggilan fmt.println menghasilkan satu baris keluaran.
Membangun binari dengan odin build#
Perintah odin build mengompilasi program dan menyimpan hasilnya sebagai berkas binari (binary) tanpa menjalankannya. Binari yang tersimpan dapat dijalankan berulang kali atau dipindahkan ke mesin lain yang arsitektur dan sistem operasinya sama. Nama binari ditetapkan lewat opsi -out:, sedangkan tanpa opsi itu, Odin menggunakan nama direktori package sebagai nama binarinya.
Bangun binari dari dalam direktori proyek, lalu jalankan berkas yang dihasilkan.
# membangun binari bernama halo dari package di direktori kerja
odin build . -out:halo
# menjalankan binari hasil build
./haloHalo, Odin!Perintah odin build tidak mencetak pesan apa pun ketika prosesnya berhasil, sehingga bukti keberhasilannya adalah keberadaan berkas halo di direktori proyek. Eksekusi ./halo kemudian menjalankan proc main di dalam binari dan mencetak keluaran yang sama dengan odin run. Kedua perintah juga menerima opsi tingkat optimasi, seperti -o:speed untuk mengutamakan kecepatan program dan -o:size untuk mengutamakan ukuran binari.
Kedua jalur tersebut dirangkum pada diagram berikut.
Kesalahan umum: deklarasi package yang dilupakan#
Kesalahan yang paling sering muncul saat pertama kali menulis kode Odin adalah melupakan deklarasi package pada baris pertama, misalnya karena berkas langsung diawali dengan impor. Deklarasi ini bukan formalitas, melainkan penentu identitas berkas di dalam package. Kesalahan ini biasanya muncul ketika potongan kode disalin tanpa baris pertamanya, atau ketika berkas baru dibuat dari templat kosong. Compiler menolak berkas seperti itu dan menampilkan error sintaks sebelum program sempat dijalankan. Berkas rusak berikut dibuat, dijalankan, lalu dihapus untuk menunjukkan perilakunya.
# membuat berkas rusak tanpa deklarasi package pada baris pertama
cat > rusak.odin <<'EOF'
import "core:fmt"
main :: proc() {
fmt.println("Halo, Odin!")
}
EOF
# mencoba menjalankan berkas rusak, lalu menghapusnya
odin run rusak.odin -file
rm rusak.odin/home/kal/my-project/content/odin/langkah-pertama/hello-package-main/rusak.odin(1:1) Syntax Error: Expected a package declaration at the beginning of the file
import "core:fmt"
^Pesan error menyebut posisi kesalahannya, yaitu baris 1 kolom 1, serta menyatakan apa yang diharapkan compiler, yaitu Expected a package declaration at the beginning of the file. Perbaikannya mengikuti pesan tersebut, yakni menambahkan package main sebagai baris pertama berkas sebelum baris impor. Error ini terjadi saat kompilasi, bukan saat program berjalan, sehingga tidak ada keluaran program yang muncul sama sekali. Setelah deklarasi ditambahkan, perintah odin run kembali bekerja, baik pada mode berkas tunggal maupun mode direktori.
Ringkasan#
- Setiap berkas Odin diawali deklarasi package, dan package bernama main memuat
main :: proc()sebagai entry point program. - Pustaka standar diimpor seperti
import "core:fmt", lalu procnya dipanggil melalui nama package asalnya, misalnyafmt.println. odin run main.odin -filemenjalankan satu berkas sumber, sedangkanodin run .mengompilasi seluruh package di dalam direktori kerja.odin build . -out:halomenyimpan binari yang siap dijalankan, sedangkan pesanExpected a package declarationmenandai baris pertama yang kehilangan deklarasi package.
Referensi#
- Odin Documentation Overview — odin-lang.org — Dokumentasi resmi Odin yang menjelaskan deklarasi package, import, dan proc main.
- package fmt — pkg.odin-lang.org — Dokumentasi pustaka core:fmt yang menyediakan proc pencetakan teks seperti println.
- absolute_beginners — pkg.odin-lang.org — Contoh resmi program Odin sederhana untuk pemula.