deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (hnrss.org)

C++ std::meta, Zig comptime ve C3 macro'ları: compile-time reflection karşılaştırması

Hacker News'te paylaşılan bir blog yazısı, C++'ın gelecekteki std::meta reflection özelliğini Zig'in comptime'ı ve C3'ün macro'ları ile enum-to-string, struct introspection ve attribute tabanlı doğrulama üzerinden karşılaştırıyor.

C++ std::meta, Zig comptime ve C3 macro'ları: compile-time reflection karşılaştırması

Hacker News'in ana sayfasına ulaşan kişisel bir blog yazısı, C++, Zig ve C3'ün compile-time reflection olanaklarını yan yana koyuyor ve her dilde aynı üç problemi çözüyor: enum değerlerini string'e dönüştürmek, struct alanlarını yazdırmak ve tip üyelerine eklenen veriler aracılığıyla yapılandırma doğrulamak.

Üç dil, tek compile-time fikri

Yazıya göre üç dil de reflection'ı run time yerine compile time'a yerleştiriyor; böylece bir program, tipler, enumerator'lar ve struct üyeleri üzerinde herhangi bir runtime maliyeti olmadan akıl yürütebiliyor. Mekanizmalar ise belirgin biçimde farklı. C++, reflection'ı std::meta kütüphanesi üzerinden kazanıyor — örnekler std::meta::enumerators_of ve std::meta::identifier_of gibi fonksiyonları çağırıyor, ardından [: ... :] splice'ı kullanarak reflection sonuçlarını yeniden sıradan koda dönüştürüyor. Zig, comptime modeline yaslanıyor; @typeInfo bir tipin yerleşimini generic fonksiyonlara açıyor. Yazarın okunabilir, hızlı ve minimal kalmayı amaçlayan, C ve C++ programcılarına tanıdık hissettiren daha yeni bir dil olarak tanımladığı C3 ise çöp toplayıcı, exception, RAII veya ağır bir runtime olmadan geliyor ve C ABI'yi kutudan çıktığı gibi destekliyor. Her compile-time değişkenini ve kontrol akışı yapısını $ ile önekliyor — bu, okuyucunun hangi kodun derleme sırasında çalıştığını bir bakışta görebilmesi için bilinçli bir tercih. C preprocessor'ünün yerine konumlandırılan macro'ları ise sabit katlama üzerine kurulu compile-time değerlendirme ekliyor.

Enum-to-string dönüşümü

C++'ta yazar, std::meta::enumerators_of üzerinden herhangi bir enum tipinin enumerator'ları arasında dolaşan ve eşleşme için std::meta::identifier_of değerini döndüren tek bir generic fonksiyon yazıyor. Zig için yazıda bir karşılık yok: yazarın işe yarar bulduğu tek yaklaşım, her enum'a tek tek eklenen, switch içeren elle yazılmış bir metot; yazar derin bir Zig uzmanı olmadığını belirtip düzeltmeleri açıkça davet ediyor. C3 görevi, enum değerleri arasında dolaşan ve her birinin açıklamasını okuyan bir macro ile çözüyor. Yazı burada C3 kolaylıklarını da vurguluyor: bir enum değerini yazdırmak tam sayısını değil kaynak kod düzeyindeki adını çıkarıyor, .ordinal özelliği veya bir cast temeldeki değeri veriyor ve tek tek enumerator'lar, kodun doğrudan okuyabileceği rastgele tiplerde ilişkili değerler taşıyabiliyor.

Struct introspection

Üç dil de bir struct'ın alanları üzerinde generic biçimde dolaşabiliyor. C++ sürümü std::meta::nonstatic_data_members_of üzerinde iterasyon yapıyor ve her üyeye obj.[:member:] splice'ı üzerinden erişiyor. Zig sürümü, @typeInfo'ın bildirdiği struct alanları üzerinde inline for ve değerleri isimle okumak için @field builtin'ini kullanıyor. C3'ün macro'su tipin üyeleri arasında dolaşıyor ve bunları dinamik olarak dereference ediyor. Yazar ayrıca bir C3 contract'ı — burada girdinin bir struct olmasını gerektiren, isteğe bağlı bir ön koşul — gösteriyor; bu, mümkün olduğunda compile time'da, aksi halde runtime'da kontrol ediliyor.

Alan düzeyinde attribute'lar ve doğrulama

En keskin ayrışma, struct üyelerine veri eklerken ortaya çıkıyor. C++ örneği, Config alanlarına [[=Range{1, 65535}]] gibi annotation'lar yerleştiriyor ve doğrulayan bir fonksiyon şablonu bunları std::meta annotation sorguları üzerinden geri okuyup sınırları çıkarıyor; böylece aralık dışı bir yapılandırma üzerindeki static_assert basitçe derlenemiyor. Yazara göre Zig'de attribute ya da bunun yerine geçebilecek herhangi bir mekanizma hiç yok. C3, bir attribute'u attrdef ile tanımlıyor, alanları @Range ile etiketliyor ve ardından iki yol sunuyor: compile-time değerler için compile-time doğrulayan bir macro ve sıradan değerler için aynı kontrolleri runtime'da yapan neredeyse özdeş bir macro.

Neden önemli

Reflection, C++'a doğru ilerleyen en önemli yeteneklerden biri ve soyut önerileri değerlendirmek zor. Aynı küçük problemleri üç dilde çözerek yazı, std::meta'nın pratikte nasıl hissettireceğine dair elle tutulur bir önizleme sunuyor — generic ve güçlü, ama söz dizimsel olarak yoğun — buna karşılık Zig'in comptime'ı esnek ama şu an generic enum yazdırma ve alan başına metadata için bir cevabı yok; C3'ün açıkça işaretlenmiş macro sistemi ise açık okunuyor ve attribute'ları doğal olarak destekliyor ama çok daha genç bir ekosisteme ait. Karşılaştırma tek bir yazarın perspektifini yansıtıyor ve yazar kendi Zig deneyimiyle ilgili açık bir uyarı veriyor; ancak bu dillerde compile-time metaprogramming'in yöneldiği noktanın bir anlık görüntüsü olarak Hacker News kitlesiyle açıkça rezonans oldu.

  • #cpp
  • #zig
  • #c3
  • #reflection
  • #compile-time