Setiap proyek latihan dimulai dari satu keputusan yang menentukan sisa pengerjaannya, yaitu jenis proyek yang dipilih. Topik ini membahas tiga jenis proyek yang cocok untuk melatih Odin, yaitu simulasi, alat command line, dan game kecil, beserta latihan memori dan data yang diperoleh dari masing-masing jenis. Perbandingan ketiganya dirangkum dalam satu tabel, kriteria pemilihannya dinyatakan secara eksplisit, dan satu program simulasi kecil dibangun serta dijalankan sampai keluaran aslinya dapat diperiksa.
Tiga jenis proyek yang cocok untuk Odin#
Ketiga jenis berikut dipilih karena masing-masing melatih bagian bahasa yang berbeda sementara tetap cukup kecil untuk diselesaikan oleh satu orang. Simulasi menghitung perkembangan sebuah sistem dari waktu ke waktu, misalnya pertumbuhan populasi kelinci, gerak jatuh benda dengan fisika sederhana, atau antrean tiket di loket. Alat command line mengubah berkas masuk menjadi keluaran teks, misalnya pengolah CSV nilai ujian, pencatat keuangan pribadi, atau pemeriksa kepatuhan tata letak berkas. Game kecil menampilkan dunia yang bergerak secara langsung, misalnya tetris mini, ular, atau pong.
Tabel berikut membandingkan ketiga jenis dari empat sisi, yaitu latihan bahasa yang dominan, latihan memori dan data, risiko lingkup yang melebar, serta ukuran data yang wajar.
| Jenis | Latihan bahasa yang dominan | Latihan memori dan data | Risiko lingkup melebar | Ukuran data yang wajar |
|---|---|---|---|---|
| Simulasi | struct, slice, perulangan, core:fmt | iterasi array besar, pemilihan alokator, pemrofilan | model yang terus ditambah variabel dan aturan | ribuan hingga jutaan angka dalam slice |
| Alat command line | core:os, core:strings, parsing | dynamic array, map frekuensi, masa hidup string | opsi, format berkas, dan laporan tambahan | berkas teks ratusan kilobyte hingga puluhan megabyte |
| Game kecil | raylib, game loop, input | data entitas per frame, tata letak ramah cache | konten visual seperti level, animasi, dan menu | puluhan hingga ribuan entitas aktif |
Perbandingan pada tabel bukan batasan mutlak, karena setiap jenis tetap dapat diperluas ke arah yang lain. Satu baris tabel hanya menyatakan latihan yang paling alami muncul ketika proyek jenis itu dikerjakan sampai selesai. Bagian berikut membahas ketiga jenis secara berurutan, dengan program contoh utuh pada jenis pertama.
Simulasi: murni data dan mudah diukur#
Seluruh pekerjaan simulasi berupa transformasi angka. Program membaca keadaan awal, menerapkan aturan perubahan dalam perulangan, lalu mencatat hasilnya dalam bentuk tabel di terminal, tanpa jendela, tanpa masukan selama berjalan, dan tanpa pustaka grafis. Karena itu, kode yang ditulis hampir seluruhnya berupa struct, slice, dan perulangan, yaitu bagian bahasa yang sama dengan program pemrosesan data pada umumnya.
Latihan memori yang diperoleh dapat diukur secara langsung. Data simulasi berupa slice berisi ribuan hingga jutaan nilai yang diiterasi berulang, sehingga pilihan alokator, pola akses cache, dan biaya per elemen langsung terlihat pada durasi yang dicatat timer. Keluaran yang deterministik, yakni sama pada setiap eksekusi, membuat hasil pengukuran tidak terganggu variasi angka acak, sehingga perubahan performa setelah revisi kode segera terlihat.
Risiko utama jenis ini adalah lingkup yang melebar pada sisi model, yaitu model pertumbuhan sederhana yang kemudian ditambahi predator, musim, atau lapisan makhluk baru. Batas yang wajar adalah satu model dengan beberapa variabel dan keluaran tabel di terminal. Apabila grafika mulai terasa lebih penting daripada angkanya, proyek tersebut sudah berpindah jenis dan lebih tepat diperlakukan sebagai game kecil.
Program berikut adalah berkas pertama proyek simulasi pertumbuhan populasi kelinci. Populasinya diperbarui dengan model logistik diskret, yaitu model pertumbuhan yang melambat ketika jumlah populasi mendekati daya dukung lingkungan. Konstanta laju menyatakan kecepatan pertumbuhan, sedangkan daya_dukung menyatakan batas lingkungan dalam satuan ekor.
package main
import "core:fmt"
// Simulasi pertumbuhan populasi kelinci dengan model logistik diskret.
// Pertumbuhan melambat ketika populasi mendekati daya dukung lingkungan.
main :: proc() {
laju :: 2.7
daya_dukung := 1000.0
populasi := 20.0
fmt.println("tahun populasi")
for tahun in 0 ..< 10 {
fmt.printf("% 5d % 8.1f\n", tahun, populasi)
populasi += laju * populasi * (1.0 - populasi / daya_dukung)
}
}# jalankan simulasi dari direktori topik
odin run simulasi.odin -filetahun populasi
0 20.0
1 72.9
2 255.4
3 769.0
4 1248.6
5 410.4
6 1063.7
7 880.7
8 1164.4
9 647.6Keluarannya menunjukkan populasi yang mendekati 1000 ekor melalui osilasi, yaitu pola khas model logistik dengan laju pertumbuhan di atas 2. Nilai pada tahun ke-4 melampaui daya dukung lalu turun tajam pada tahun ke-5, karena faktor 1.0 - populasi / daya_dukung berubah negatif apabila populasi telah melampaui batasnya. Seluruh baris dapat dihitung ulang dengan kalkulator karena program tidak memakai angka acak.
Alat command line: pemrosesan berkas teks#
Alat command line mengerjakan satu tugas yang jelas, yaitu membaca berkas masuk dan menulis keluaran teks, tanpa jendela dan tanpa interaksi selama proses berjalan. Pada pengolah CSV nilai ujian, keluarannya berupa rata-rata per kelas, sedangkan pada pencatat keuangan pribadi, keluarannya berupa rangkuman transaksi dalam satu berkas. Latihan bahasanya berat di sisi yang jarang disentuh simulasi, yaitu core:os untuk argumen proses dan pembacaan berkas, core:strings untuk pemotongan baris, serta parsing manual, yakni penguraian teks menjadi data terstruktur.
Latihan memori dan datanya berpusat pada masa hidup data teks. Setiap baris berkas dialokasikan sebagai string, dipotong-potong saat parsing, lalu dibuang, sehingga dynamic array, map frekuensi, dan pembebasan memori terlatih secara alami. Ukuran datanya juga lebih besar daripada data simulasi kecil, karena berkas teks ratusan kilobyte hingga puluhan megabyte tetap nyaman dibaca sekaligus dengan os.read_entire_file.
Risiko lingkup melebar pada jenis ini berbentuk fitur, bukan model, yaitu opsi baris perintah baru, format berkas tambahan, dan ekspor laporan yang saling menumpuk. Batas yang wajar adalah satu format masuk, satu keluaran, dan paling banyak dua opsi. Berkas pertama proyek semacam ini tetap kecil, misalnya program yang membaca satu berkas CSV lalu mencetak jumlah baris dan rata-rata satu kolomnya, tanpa opsi apa pun.
Game kecil: game loop dan raylib#
Game kecil adalah proyek dengan keluaran visual yang diperbarui puluhan kali per detik. Pustaka raylib yang dibundel pada koleksi vendor menyediakan jendela, input, dan gambar primitif, sedangkan program mengatur game loop, yaitu perulangan utama yang memeriksa input, memperbarui keadaan entitas, dan menggambar satu frame pada setiap putarannya. Contoh yang paling ringan adalah ular dan pong, yang seluruh keadaannya muat dalam beberapa struct.
Latihan data yang khas adalah menjaga biaya per frame tetap rendah. Keadaan game berupa puluhan hingga ribuan entitas yang seluruhnya diperbarui pada setiap frame, sehingga tata letak yang ramah cache dan alokasi yang tidak terjadi di tengah frame langsung terasa pada kehalusan gerakan. Ukuran data yang wajar untuk game kecil relatif kecil di antara ketiga jenis, tetapi syarat latensinya paling ketat, karena total waktu satu frame harus tetap jauh di bawah sekitar 16 milidetik.
Risiko lingkup melebar paling besar juga berada pada jenis ini, karena konten visual mudah terus ditambah, mulai dari level baru, animasi, suara, hingga menu. Batas yang wajar adalah satu layar, satu mekanik inti, dan tanpa menu. Perlu dicatat pula bahwa program berjendela memerlukan lingkungan dengan tampilan, sehingga pengujian di lingkungan tanpa tampilan terbatas pada pembangunan dan pemeriksaan statis programnya.
Kriteria pemilihan#
Ketiga jenis di atas dapat dipilih dengan tiga pertimbangan yang dijalankan secara berurutan. Setiap pertimbangan meniadakan satu pilihan, sehingga di akhir langkah tersisa satu jenis yang langsung dapat dimulai.
- Nilai kepentingan data terhadap grafika. Apabila bagian yang menarik dari proyek berupa angka, agregasi, atau perilaku sistem, simulasi dan alat command line memberikan latihan yang lebih padat, sedangkan game kecil dipilih apabila umpan balik visual menjadi inti proyeknya.
- Nilai kebutuhan interop C, yaitu pemanggilan pustaka yang ditulis dalam bahasa C. Simulasi murni dapat diselesaikan tanpa pustaka C sama sekali, sedangkan alat yang memanggil pustaka C yang sudah ada dan game dengan raylib melatih deklarasi
foreignserta penyesuaian tipe C. - Tetapkan target waktu selesai. Satu atau dua sesi untuk simulasi kecil, dua sampai empat sesi untuk alat command line, serta empat sampai delapan sesi untuk game kecil merupakan titik awal yang realistis.
Apa pun jenis yang terpilih, urutan pekerjaannya sama, yaitu merancang data lebih dahulu sebelum kode pertama ditulis. Simulasi menetapkan struct populasi dan rentang waktunya, alat command line menetapkan struktur baris berkas, dan game kecil menetapkan struct entitas beserta tata letak datanya. Langkah perancangan data tersebut diperdalam dengan struct, kepemilikan, dan pilihan alokator.
Ringkasan#
- Tiga jenis proyek yang cocok untuk melatih Odin adalah simulasi, alat command line, dan game kecil, dengan latihan inti berupa data yang dihitung, berkas yang diolah, dan frame yang digambar.
- Simulasi merupakan pilihan paling langsung untuk proyek pertama karena murni data, berjalan tanpa tampilan, dan keluarannya deterministik sehingga mudah diukur serta diprofil.
- Pemilihan jenis dipertegas dengan tiga pertimbangan, yaitu kepentingan data terhadap grafika, kebutuhan interop C, dan target waktu selesai.
- Lingkup dijaga dengan batas awal yang tertulis, karena penambahan model, fitur, atau konten visual merupakan penyebab utama proyek latihan yang tidak selesai.
Referensi#
- Overview — Odin Language — Ikhtisar resmi bahasa Odin yang meliputi proc, struct, slice, dan perulangan yang dipakai ketiga jenis proyek.
- Absolute beginners — Odin Language — Contoh resmi menulis dan menjalankan program kecil pertama dengan Odin.
- package os — pkg.odin-lang.org — Dokumentasi resmi core:os untuk argumen proses dan pembacaan berkas pada alat command line.
- raylib — GitHub — Repositori resmi pustaka raylib yang dibundel pada koleksi vendor Odin untuk proyek game kecil.