HeadlinesBriefing HeadlinesBriefing.com

Trait di Zig: Abstraksi Waktu Kompilasi

Hacker News •
×

Belakangan ini saya punya lebih banyak waktu untuk menulis kode dengan Zig, dan itu menyegarkan batin saya. Tulisan ini membagikan wawasan tentang abstraksi di Zig, termasuk teknik-teknik yang menurut penulis berguna tetapi jarang digunakan secara luas.

Banyak tulisan telah dibuat tentang antarmuka Zig, dan memang pantas demikian. Meskipun antarmuka bukan fitur bahasa, antarmuka adalah cara de facto untuk mengimplementasikan polimorfisme saat runtime di Zig. Lebih banyak lagi yang dibahas tentang comptime Zig dan bagaimana fitur itu dapat dimanfaatkan untuk menghindari masalah performa dari dynamic dispatch serta menulis kode yang rapi dan berorientasi data.

Polimorfisme di Zig umumnya diperoleh dengan salah satu dari dua cara. Antarmuka dinamis menggunakan opaque pointer, tabel virtual, dan dynamic dispatch untuk mencapai polimorfisme saat runtime. Duck typing saat kompilasi menggunakan refleksi tipe, pernyataan switch, dan monomorfisme pada waktu kompilasi untuk mencapai polimorfisme statis. Kondisi ini terbukti efektif, tetapi tidak lepas dari pertukaran (trade-off). Antarmuka menawarkan kontrak tipe yang familiar dari bahasa lain, tetapi karena bersifat modular saat runtime, antarmuka menciptakan penghalang yang kaku bagi kompilator dan karenanya menimbulkan overhead performa. Untuk kode yang kritis terhadap performa, Zig biasanya mengandalkan duck typing saat kompilasi, yang mendeteksi pelanggaran antarmuka saat kompilasi tetapi tetap memerlukan dokumentasi kontrak yang cermat.

Pengembang yang datang dari trait Rust atau typeclass Haskell mungkin menganggap pengaturan ini terlalu sederhana, dan Zig memang bertujuan untuk tetap sederhana. Penulis berpendapat bahwa dengan sedikit adaptasi, abstraksi serupa atas tipe dimungkinkan di userland Zig. Usulannya adalah konvensi baru untuk mendefinisikan kontrak tipe saat kompilasi sebagai Trait, tanpa memerlukan pustaka atau mekanisme tambahan. Usulan ini terinspirasi oleh pemrograman fungsional secara umum dan OCaml secara khusus.

Sebuah Trait didefinisikan sebagai struct waktu kompilasi yang berisi fungsi-fungsi terkait atas tipe tertentu. Artikel ini mengilustrasikannya dengan trait Reducer untuk folding, di mana sebuah tipe membentuk reducer di bawah nilai kosong dan operasi penggabungan. Trait sum dan product yang terpisah untuk i32 menunjukkan bagaimana logika reduce generik yang sama dapat digunakan kembali, dengan kompilator mampu melakukan inline dan unroll pada loop. Penulis menyimpulkan bahwa trait hanyalah kumpulan kesenangan.

Sumber: Hacker News · Diringkas oleh HeadlinesBriefing