- Zig'in comptime özelliği çok güçlü bir derleme zamanı değerlendirme yeteneği sunar, ancak bilinçli olarak sınırlıdır
- Derleme zamanı kodu çalışırken host bilgilerine erişilemez; bu, çapraz derlemeye uygun bir tasarımdır
- Dinamik kod üretimi, DSL, RTTI, I/O vb. desteklenmez; bunun yerine açık tip tabanlı kod özelleştirmesi kullanılır
- RTTI elle uygulanabilir; yalnızca derleme zamanında var olan tip bilgisi, çalışma zamanında kullanılabilecek şekilde yeniden kurulabilir
- comptime ile yeni tipler oluşturulabilir ancak API genişletilemez; kullanıcı tanımlı yöntemler eklemek mümkün değildir
Zig'in comptime'ının yapmadığı şeyler
- Zig'in comptime'ı generics, koşullu derleme, serileştirme, ORM gibi güçlü özellikler sunsa da bazı yetenekler açıkça sınırlandırılmıştır
- Bu sınırlamalar, tersine, Zig'in tasarımını daha sade ve öngörülebilir hale getirir
-
Host bilgilerine erişim yok (No Host Leakage)
- comptime kodu kodun çalıştığı sistem yerine hedef platformu esas alarak çalışır
- Zig'de derleme zamanında host sistemin endianness'i, pointer boyutu gibi bilgiler kullanılamaz
- Bunun amacı çapraz derlemeyi gözeten güvenliği sağlamaktır
- Örnek kodda BF16 biçimindeki sayının bayt çıktısı hedef platforma göre farklıdır
-
String tabanlı kod üretimi yok (No #eval)
- Zig, C'deki
#include, D dilindeki mixin veya Rust makroları gibi dinamik olarak kod üreten özellikler sunmaz
- Bunun yerine comptime argümanlarına dayalı kısmi değerlendirme (partial evaluation) desteklenir
- Belirli bir argüman derleme zamanında biliniyorsa, yalnızca ilgili dal kalır ve kod optimize edilebilir
-
DSL sözdizimi genişletmesi yok (No DSLs)
- Zig'de Lisp veya Rust'taki gibi kullanıcı tanımlı sözdizimi (syntax) oluşturma özelliği yoktur
- Tüm veriler, Zig sözdizimine uygun değerler (value) biçiminde aktarılır
printf gibi sınırlı DSL'ler yalnızca comptime string'leri ile uygulanabilir
-
Çalışma zamanı tip bilgisi yok (No RTTI)
- Zig, Python gibi dinamik diller gibi davranabilir; ancak tip bilgisi yalnızca comptime'da vardır
- Bunun çalışma zamanında da işlemesi isteniyorsa RTTI struct'larını doğrudan tanımlayıp pointer'larla yönetmek gerekir
- Örnek: struct alan adları ve ofset bilgilerini tutan bir
RTTI struct'ı tanımlayıp pointer ile alanlara erişmek
-
Yeni API üretimi yok (No New API)
- Zig'de comptime ile yeni tipler oluşturulabilir, ancak bu tiplere yöntem eklenemez
- Rust'taki derive macro benzeri şekilde API genişletmesi yapılamaz
- JSON serileştirmesi uygulanırken
.to_json() gibi bir yöntem eklenemez; bunun yerine global bir fonksiyona tip argümanı geçilerek uygulanır
-
Derleme zamanında IO yok (No IO)
- Zig'in comptime'ı dosya sistemi, ağ, veritabanı gibi dış kaynaklara erişimi yasaklar
- Bu sayede yeniden üretilebilirlik, güvenlik ve cache kullanışlılığı artar
- IO gerekiyorsa, build sistemi olan
build.zig kullanılarak önceden üretilmiş Zig kodunu import etme yöntemi kullanılır
-
Özet: El Disco (soyutlama ile sadelik arasındaki denge)
- Zig, güçlü metaprogramlama özellikleri sunarken, oldukça sınırlı bir tasarımla öngörülebilirliği korur
- Bu sınırlamalar sayesinde Zig'in comptime'ı pratik ve anlaşılması kolay bir yapıda kalır
- Karmaşık soyutlamalar olmadan da gerçek kullanımda faydalıdır ve yalnızca tanımlanmış özellikler net biçimde çalışır
1 yorum
Hacker News görüşleri
Zig'in
comptimeözelliği benzersiz nitelikler taşıyorZig'in
comptimeözelliğinin dezavantajları ve çözümlerizig buildile kod üretildikten sonra@importedilerek derleniyorBorges'in hikâyesinden alıntılanan İspanyolca ifade, Norveç tanrılarıyla ilgili
comptimeesnekliğiZig'in
comptimeözelliğinin öne çıkan yönlerieğitici bir blog yazısı
comptime for' ile 'inline for' arasındaki farkı açıklıyorinlinesürümünde uzunluk yalnızcacomptimesırasında bilinebiliyorZig dili ve araçlarına dair olumlu görüşler
Zig'in
comptimeözelliğine dair ilgi çekici noktalarderleme zamanı kod yürütmeye dair kafa karışıklığı