Topik ini membahas kedudukan template di samping checked generics Carbon, yaitu dua model parameterisasi waktu kompilasi yang dirancang berdampingan dalam satu bahasa. Pembahasan mencakup perbedaan keduanya pada saat pemeriksaan, bentuk parameter yang dieksekusi Explorer hari ini, dan status dokumen desain template di repositori. Setelah membacanya, alasan Carbon menyediakan kedua model sekaligus dapat dijelaskan dengan bukti eksekusi dan rujukan desainnya.
Dua model parameter waktu kompilasi#
Generics Carbon berarti parameterisasi konstruksi bahasa pada waktu kompilasi, dan setiap parameter dapat dibedakan menurut modelnya. Parameter checked diperiksa sejak definisi dengan kontrak yang dituliskan persis pada tipe parameternya, sedangkan parameter template diperiksa pada saat instansiasi mengikuti pendekatan duck typing C++, yaitu kecocokan dinilai dari penggunaannya dan bukan dari deklarasinya. Dokumen terminologi generics menetapkan pembagian ini secara per parameter, bukan per fungsi, sehingga satu fungsi boleh mencampur parameter runtime, checked, dan template dalam satu tanda kurung.
| Aspek | Parameter checked | Parameter template |
|---|---|---|
| Model | bounded parametric polymorphism | duck typing waktu kompilasi |
| Kontrak | wajib melalui interface | opsional |
| Pemeriksaan definisi | lengkap dan mandiri | dapat tertunda sampai instansiasi |
| Penggunaan yang diarahkan | batas API publik | interop C++ dan metaprogramming |
Tabel di atas disarikan dari dokumen terminologi generics pada trunk. Kedua model dipertahankan bersamaan karena sasarannya berbeda. Checked generics memberikan pesan error yang lebih awal dan lebih jelas, mempercepat build, serta mendukung dispatch statis maupun dinamis, sedangkan template memudahkan interop dan migrasi karena kode C++ yang ada penuh dengan template. Dokumen goals generics menyebutkan bahwa template Carbon akan serupa dengan template C++ dengan beberapa pembatasan, misalnya mekanisme pemilihan instansiasi yang berbeda agar diagnostik tetap berkualitas.
Binding checked dan deduksi tipe#
Bentuk parameter yang berjalan di Explorer hari ini menggunakan binding pattern, yaitu pola pengikatan pada daftar parameter, dengan tanda :!. Program berikut memperlihatkan fungsi generik paling ringkas, yaitu fungsi identitas yang tipe parameternya ditentukan pemanggil.
package sample api;
fn Identitas[T:! type](x: T) -> T {
return x;
}
fn Main() -> i32 {
Print("{0}", Identitas(42));
return 0;
}42
result: 0Pemanggilan Identitas(42) mendeduksi T menjadi i32 tanpa argumen eksplisit, dan fungsi yang sama dapat dipanggil dengan argumen lain yang didukung interpreter. Tulisan [T:! type] menyatakan bahwa T adalah parameter waktu kompilasi yang tipe-parameternya ditulis type, sehingga T dapat digunakan sebagai tipe pada parameter x dan pada tipe kembalian. Nilai T selalu ditentukan dari pemanggilan, karena argumen yang dideduksi memang tidak dapat diberikan secara eksplisit pada tanda kurung pemanggilan.
Ejaan tersebut sedang digantikan pada tingkat desain. Proposal #7254 pada trunk menghapus :! dan menetapkan kata kunci generic, template, serta runtime beserta default kontekstual, sehingga parameter di dalam tanda kurung siku menjadi checked secara bawaan. Dokumen desain pada trunk sudah menulis contoh seperti fn AddAndScaleGeneric[T: Vector] tanpa :!, sedangkan interpreter Explorer masih mengeksekusi bentuk :! yang lebih lama dan menolak bentuk baru dengan pesan sintaks. Dua ejaan itu perlu dibedakan setiap kali membaca sumber Carbon.
Template dalam desain dan di Explorer#
Penanda template sudah dikenali interpreter Explorer pada binding. Program berikut menandai T sebagai parameter template sembari tetap membatasinya dengan interface Luas, dan eksekusinya berjalan seperti padanan checked-nya.
package sample api;
interface Luas {
fn Hitung(self: Self) -> i32;
}
class Persegi {
var sisi: i32;
}
impl Persegi as Luas {
fn Hitung(self: Self) -> i32 {
return self.sisi * self.sisi;
}
}
fn CetakLuas[template T:! Luas](bentuk: T) {
Print("Luas = {0}", T.Hitung(bentuk));
}
fn Main() -> i32 {
var p: Persegi = {.sisi = 5};
CetakLuas(p);
return 0;
}Luas = 25
result: 0Eksperimen berikut menyentuh inti duck typing, yaitu mengakses anggota tipe yang tidak dibatasi interface apa pun. Rancangan template memungkinkan akses semacam ini karena pemeriksaan menunggu instansiasi, tetapi interpreter menolaknya pada waktu kompilasi.
package sample api;
class Titik {
var x: i32;
var y: i32;
}
fn CetakX[template T:! type](p: T) {
Print("x = {0}", p.x);
}
fn Main() -> i32 {
var t: Titik = {.x = 7, .y = 9};
CetakX(t);
return 0;
}COMPILATION ERROR: <source>:9: member access in unconstrained typeStatus desain template juga perlu dibaca secara jujur. Dokumen templates pada trunk menyebut dirinya skeletal design, yaitu kerangka yang ditambahkan untuk mendukung dokumen tinjauan umum generics dan belum menjadi keputusan tim inti, sehingga isinya boleh berubah besar. Rancangan tertulisnya sudah mengatur kelas dengan parameter template, fungsi dengan parameter template yang dideduksi maupun eksplisit, dan kemungkinan membatasi template dengan interface yang sama seperti checked generics. Implementasi Explorer baru mengenali penandanya, sedangkan perilaku duck typing penuh belum dapat diamati di sana.
Ringkasan#
- Carbon merancang checked generics dan template berdampingan, dan satu fungsi boleh mencampur parameter runtime, checked, dan template.
- Parameter checked diperiksa sekali pada definisi melalui kontrak interface, sedangkan parameter template mengikuti duck typing pada instansiasi.
- Explorer mengeksekusi binding
[T:! type]dan penandatemplate, tetapi menolak akses anggota pada parameter tanpa batasan serta ejaan desain baru. - Proposal #7254 menetapkan kata kunci
generic,template, danruntimesebagai ejaan masa depan, sedangkan dokumen templates masih berstatus kerangka.
Referensi#
- Generics: Terminology — Proyek Carbon Language — Menetapkan perbedaan parameter checked, template, dan runtime beserta tabel perbandingannya.
- Templates — Proyek Carbon Language — Kerangka desain template Carbon, termasuk catatan bahwa dokumennya belum menjadi keputusan tim inti.
- Replace
:!and:?with keywords and contextual defaults — Proyek Carbon Language — Proposal yang menghapus:!dan menetapkan kata kuncigeneric,template, sertaruntime. - README — Proyek Carbon Language — Menyatakan sistem generics modern dengan definisi terperiksa dan dukungan template untuk interop C++.
- Compiler Explorer — godbolt.org — Layanan tempat seluruh program Carbon pada topik ini dieksekusi.