Konstanta compile-time memberi nama tetap bagi nilai yang sudah diketahui ketika compiler bekerja, misalnya lebar vektor atau tipe SIMD yang dipakai berulang di seluruh berkas. Topik ini membahas deklarasi comptime pada tingkat modul dan di dalam fungsi, penamaan tipe dengan konstanta compile-time, serta pemetaan dari kata kunci alias era pra-1.0 ke comptime. Setelah topik ini dibaca, lebar dan tipe dapat diberi nama sekali di satu tempat lalu dipakai konsisten tanpa menyentuh nilai runtime.
Konstanta compile-time dan deklarasi comptime#
Konstanta compile-time adalah nama yang nilainya ditetapkan saat proses kompilasi, bukan saat program berjalan. Deklarasinya memakai kata kunci comptime, misalnya comptime LEBAR = 4 yang membuat nama LEBAR bernilai 4 untuk seluruh berkas. Compiler memperlakukan nama tersebut sama seperti angka yang ditulis langsung, sehingga LEBAR sah dipakai di tempat yang menuntut nilai tetap, misalnya parameter lebar pada tipe SIMD[DType.float64, LEBAR].
Konstanta compile-time berbeda dari variabel yang dideklarasikan dengan var. Variabel hidup di memori ketika program berjalan dan nilainya baru diketahui pada saat itu, sedangkan konstanta compile-time hanya ada pada fase kompilasi dan tidak menempati memori apa pun saat program berjalan. Penamaan dengan huruf kapital, seperti LEBAR, membantu membedakan konstanta dari variabel biasa pada pembacaan cepat. Kebiasaan ini bukan kaidah bahasa, melainkan pilihan praktis yang diikuti secara konsisten di jalur ini.
Konstanta compile-time juga dapat menamai tipe, bukan hanya angka. Deklarasi comptime Vec64 = SIMD[DType.float64, 4] membuat Vec64 menjadi nama tipe yang dapat dipakai pada anotasi parameter, pada tipe variabel, dan pada pemanggilan konstruktornya. Kemampuan ini berguna ketika tipe SIMD yang dipakai berulang memiliki penulisan yang panjang.
Deklarasi di tingkat modul dan di dalam fungsi#
Deklarasi comptime pada tingkat modul terletak di luar fungsi dan terlihat oleh seluruh fungsi di berkas itu. Sebuah konstanta boleh merujuk konstanta lain, sehingga rantai nama dapat dibangun dari nilai yang paling dasar. Program berikut menetapkan lebar vektor, menamai tipe vektornya, dan memakai konstanta di dalam fungsi main.
comptime LEBAR = 4
comptime Vec64 = SIMD[DType.float64, LEBAR]
def jumlahkan(v: Vec64) -> Float64:
return v.reduce_add()
def main():
var v = Vec64(1.0, 2.0, 3.0, 4.0)
print(jumlahkan(v))
comptime BATAS = 10
print(BATAS * LEBAR)# jalankan program konstanta compile-time
mojo run konstanta.mojo10.0
40Nama LEBAR dideklarasikan lebih dahulu, kemudian Vec64 merujuk LEBAR pada penulisan tipenya. Fungsi jumlahkan hanya menuliskan Vec64 pada parameternya, tanpa mengulang penulisan SIMD yang panjang. Di dalam main, konstanta BATAS dideklarasikan dengan comptime pada lingkup fungsi, dan print(BATAS * LEBAR) mencetak 40 karena BATAS bernilai 10 dan LEBAR bernilai 4. Keluaran 10.0 berasal dari reduce_add() pada vektor berisi 1.0 sampai 4.0.
Pemetaan dari alias ke comptime#
Kata kunci alias pada era pra-1.0 memegang peran yang kini dipegang comptime, yaitu mendeklarasikan konstanta dan nama tipe compile-time. Mojo 1.0 menghapus alias, dan peran tersebut dipindahkan seluruhnya ke comptime. Compiler 1.2.0 tidak lagi mengenali alias sebagai kata kunci, sehingga baris deklarasi lama dibaca sebagai ekspresi biasa dan ditolak. Berkas berikut memuat deklarasi era lama tersebut untuk menunjukkan reaksi compilernya.
alias LEBAR = 4
def main():
print(LEBAR)# deklarasi alias era pra-1.0 ditolak compiler
mojo run alias-lama.mojo/home/kal/my-project/content/mojo/parameter-compile-time/konstanta-alias/alias-lama.mojo:1:1: error: expressions must not appear at file scope; move this into a function body
alias LEBAR = 4
^
/home/kal/my-project/content/mojo/parameter-compile-time/konstanta-alias/alias-lama.mojo:1:7: error: statements must start at the beginning of a line
alias LEBAR = 4
^
/home/kal/.pixi/envs/mojo/bin/mojo: error: failed to parse the provided Mojo source modulePesan error menyatakan bahwa ekspresi tidak boleh muncul pada lingkup berkas, karena baris alias LEBAR = 4 tidak lagi diurai sebagai deklarasi. Perbaikannya adalah mengganti kata kuncinya dengan comptime. Tabel berikut merangkum pemetaan bentuk lama ke bentuk 1.2.0.
| Deklarasi era pra-1.0 | Padanan pada Mojo 1.2.0 |
|---|---|
alias LEBAR = 4 | comptime LEBAR = 4 |
alias Vec4 = SIMD[DType.float64, 4] | comptime Vec4 = SIMD[DType.float64, 4] |
Pemetaan ini berlaku untuk konstanta angka maupun nama tipe tanpa perubahan nilai. Ketika kode lama bertemu compiler 1.2.0, setiap baris alias diganti comptime dan sisanya dibiarkan apa adanya. Kata kunci yang sama juga digunakan untuk alur kontrol compile-time, sehingga satu kata kunci melayani konstanta, nama tipe, percabangan, dan perulangan compile-time.
Kesalahan umum#
- Menuliskan
aliaspada compiler 1.2.0. Deklarasialias LEBAR = 4ditolak dengan pesanexpressions must not appear at file scope; move this into a function bodysebagaimana diperlihatkan pada bagian Pemetaan dari alias ke comptime. Perbaikannya adalah kata kuncicomptimedengan nilai yang sama. - Mengisi konstanta compile-time dengan nilai dinamis. Deklarasi
comptime b = a * 2yang merujuk variabeladitolak dengan pesancannot use a dynamic value in comptime initializerkarena nilainya baru ada saat program berjalan. Perbaikannya adalah menyimpan hasil hitungan itu dalamvarbila hasil runtime yang dibutuhkan, atau merujuk konstanta comptime lain bila nilai tetap yang diinginkan. - Mendeklarasikan
varpada tingkat berkas untuk menyimpan konstanta. Deklarasivar LEBAR = 4di luar fungsi ditolak dengan pesanglobal variables are not supported; move this into a function body or use 'comptime' to declare a constant. Pesan itu sekaligus menunjukkan perbaikannya, yaitu menggantivardengancomptimekarena nilai yang dimaksud memang konstanta compile-time.
Ringkasan#
comptimemendeklarasikan konstanta compile-time untuk angka maupun nama tipe, pada tingkat modul dan di dalam fungsi.- Sebuah konstanta boleh merujuk konstanta lain, dan nilainya sah dalam ekspresi runtime sebagaimana angka langsung.
- Kata kunci
aliasera pra-1.0 sudah dihapus sejak Mojo 1.0 dan padanannya kinicomptime. - Konstanta comptime tidak boleh mengambil nilai dari variabel runtime.
Referensi#
- Mojo Manual — Modular — Panduan resmi bahasa Mojo yang menjadi rujukan deklarasi konstanta compile-time.
- Mojo standard library — Modular — Dokumentasi pustaka standar berisi tipe SIMD yang dipakai pada contoh konstanta tipe.