Konstanta alias

Memberi nama compile-time untuk lebar dan tipe dengan deklarasi comptime.

Daftar isi

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.

mojo konstanta.mojo
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)
bash
# jalankan program konstanta compile-time
mojo run konstanta.mojo
text Keluaran
10.0
40

Nama 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.

mojo alias-lama.mojo
alias LEBAR = 4

def main():
    print(LEBAR)
bash
# deklarasi alias era pra-1.0 ditolak compiler
mojo run alias-lama.mojo
text Keluaran
/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 module

Pesan 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.0Padanan pada Mojo 1.2.0
alias LEBAR = 4comptime 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 alias pada compiler 1.2.0. Deklarasi alias LEBAR = 4 ditolak dengan pesan expressions must not appear at file scope; move this into a function body sebagaimana diperlihatkan pada bagian Pemetaan dari alias ke comptime. Perbaikannya adalah kata kunci comptime dengan nilai yang sama.
  • Mengisi konstanta compile-time dengan nilai dinamis. Deklarasi comptime b = a * 2 yang merujuk variabel a ditolak dengan pesan cannot use a dynamic value in comptime initializer karena nilainya baru ada saat program berjalan. Perbaikannya adalah menyimpan hasil hitungan itu dalam var bila hasil runtime yang dibutuhkan, atau merujuk konstanta comptime lain bila nilai tetap yang diinginkan.
  • Mendeklarasikan var pada tingkat berkas untuk menyimpan konstanta. Deklarasi var LEBAR = 4 di luar fungsi ditolak dengan pesan global variables are not supported; move this into a function body or use 'comptime' to declare a constant. Pesan itu sekaligus menunjukkan perbaikannya, yaitu mengganti var dengan comptime karena nilai yang dimaksud memang konstanta compile-time.

Ringkasan#

  • comptime mendeklarasikan 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 alias era pra-1.0 sudah dihapus sejak Mojo 1.0 dan padanannya kini comptime.
  • Konstanta comptime tidak boleh mengambil nilai dari variabel runtime.

Referensi#