6 puan yazan GN⁺ 2025-04-21 | 1 yorum | WhatsApp'ta paylaş
  • 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

 
GN⁺ 2025-04-21
Hacker News görüşleri
  • Zig'in comptime özelliği benzersiz nitelikler taşıyor

    • diğer dillerdeki çeşitli özelliklerin yerini alıyor
    • referans şeffaflığı sayesinde anlaşılması kolay
    • introspection aracılığıyla güçlü yetenekler sunuyor
    • Lisp'ten farklı bir yaklaşımla basit ama güçlü kod yazmayı mümkün kılıyor
    • yeni tasarım ve yaklaşım sunan diller nadir görülüyor
  • Zig'in comptime özelliğinin dezavantajları ve çözümleri

    • zig build ile kod üretildikten sonra @import edilerek derleniyor
    • daha fazla özgürlük ve sınırsız yürütme süresi sağlıyor, ancak mevcut derlemede Zig türlerini değer olarak üretme özgürlüğü yok
    • geçmişte Perl ve Tcl'yi C'ye bağlama deneyimine benziyor
    • Zig topluluğunun öz eleştirel tavrı zaman zaman şaşırtıcı olabiliyor
  • Borges'in hikâyesinden alıntılanan İspanyolca ifade, Norveç tanrılarıyla ilgili

  • comptime esnekliği

    • çalışma sırasında tür bilgisine ihtiyaç duyulduğunda fonksiyon parametresine eklenebiliyor
    • belirli durumlarda tür sağlamanın mümkün olmadığı yerde tasarım sorununun çözülmesi gerekiyor
  • Zig'in comptime özelliğinin öne çıkan yönleri

    • generics, koşullu derleme, alt tipleme, serialization, ORM gibi çeşitli işlevler sağlıyor
    • diğer dillerde de benzer derleme zamanı değerlendirme özellikleri bulunuyor
  • eğitici bir blog yazısı

    • 'comptime for' ile 'inline for' arasındaki farkı açıklıyor
    • inline sürümünde uzunluk yalnızca comptime sırasında bilinebiliyor
  • Zig dili ve araçlarına dair olumlu görüşler

    • Rust'taki gibi bir güvenli mod olsaydı iyi olurdu
    • C/C++'a kıyasla çok daha ileri bir aşamada
    • Zig derleyicisi derin bir etki bırakıyor
  • Zig'in comptime özelliğine dair ilgi çekici noktalar

    • türleri derleme zamanında değer olarak ifade edebilme yeteneği
    • çalışma zamanı ek yükü olmadan dinamik dillere veya runtime reflection'a yakın çözümler kurulabilmesini sağlıyor
  • derleme zamanı kod yürütmeye dair kafa karışıklığı

    • derleme zamanı kodunun gerçekten yerel ana makinede mi çalıştığına dair soru işaretleri
    • Zig'in neden ana platformu gizlediğine dair merak
    • Zig'in cross-compile özelliğine yönelik olumlu görüşler