- C++26 resmen teknik olarak tamamlandı. Reflection, bellek güvenliği güçlendirmeleri, contracts ve
std::execution dahil dört temel özellik içeriyor
- Derleme zamanında reflection, template’lerin tanıtılmasından bu yana C++ tarihindeki en güçlü soyutlama motoru olarak görülüyor; dilin kendisini tanımlayıp kod üretebilmesini sağlıyor
- Mevcut C++ kodunu C++26 ile yalnızca yeniden derlemek bile, başlatılmamış yerel değişkenlerin tanımsız davranışını (UB) ortadan kaldırıyor ve güçlendirilmiş standart kütüphane ile bounds güvenliği sağlanıyor
- Google’daki dağıtım sonuçlarına göre 1.000’den fazla hata düzeltildi ve üretim ortamında segfault oranı %30 azaldı
- GCC’nin reflection ve contracts özelliklerini şimdiden trunk’a birleştirmesi gibi gelişmeler, derleyici implementasyonlarının hızlı benimsenmesine işaret ediyor
C++26 tamamlandı: C++11’den bu yana en önemli sürüm
- Birleşik Krallık’ın Londra kentine bağlı Croydon’da düzenlenen ISO C++ komitesi toplantısında C++26 teknik çalışması nihai olarak tamamlandı
- Yaklaşık 210 kişi katıldı (130 yüz yüze, 80 Zoom üzerinden uzaktan), 24 ülkenin resmî temsilcileri yer aldı
- Toplantının büyük kısmı, yaz aylarında iletilen 411 uluslararası yorumun (CD aşaması) işlenmesine ayrıldı
- Yeni özellik ekleme veya çıkarma yapılmadan, tamamlanma ve cilalama çalışmalarına odaklanıldı
- Bu toplantıda son hâli verilen C++26, uluslararası onay oylaması (DIS) için nihai belge hazırlama aşamasına girdi
C++26’nın 4 temel özelliği
(1) Reflection
- Template’lerin icadından bu yana C++ geliştirme tarihindeki en büyük yükseltme olarak görülüyor; dilin kendisini tanımlayıp kod üretebilmesini sağlıyor
- C++ komitesi, Haziran 2025’te derleme zamanında reflection özelliğini C++26 taslağına dahil ederek dil tarihinde bir dönüm noktasına imza attı
- “Verimli soyutlamaları ifade etmek için en güçlü yeni motor; bu roketin neler yapabildiğini keşfetmek için önümüzdeki 10 yıla ihtiyaç duyacağız” sözleriyle tanıtıldı
(2) Bellek güvenliği güçlendirmeleri
- Yalnızca yeniden derleme ile, mevcut C++ kodunda başlatılmamış yerel değişkenlerin okunmasından kaynaklanan UB (tanımsız davranış) kategorisinin tamamı C++26’da ortadan kaldırılıyor
- Güçlendirilmiş Standart Kütüphane (Hardened Standard Library) standartlaştırıldı;
vector, span, string, string_view gibi temel türlerde bounds güvenliği sağlanıyor
- Performans ek yükü ortalama %0,3 olarak ölçüldü (yani %1’in altında)
- Apple platformlarında ve Google servislerinde yüz milyonlarca satır koda zaten dağıtılmış durumda
- Google dağıtım sonuçları:
- 1.000’den fazla hata düzeltildi
- Yıllık 1.000~2.000 hata önleme etkisi bekleniyor
- Tüm üretim ortamında segfault görülme oranı %30 azaldı
- Google’ın tüm C++ kodu içinde tamamen opt-out olan servis sayısı yalnızca 5, güvenli olmayan erişim API’lerini kullanan yer sayısı ise sadece 7
(3) Contracts: pre, post, contract_assert
- C++26 ile dil seviyesinde contracts özelliği geliyor — fonksiyon bildirimlerinde önkoşul (precondition), sonkoşul (postcondition) ve assertion ifadesi desteği sağlanıyor
- C’nin
assert makrosundan çok daha güçlü bir özellik olarak değerlendiriliyor
- Contracts kabulüne ilişkin oylama sonuçları:
- Şubat 2025 (working draft’a birleştirme): 100 kabul, 14 ret, 12 çekimser
- Mart 2026 (C++26’nın nihai onayı): 114 kabul, 12 ret, 3 çekimser
- Komitedeki bazı uzmanların teknik çekinceleri sürse de, konu üç toplantı ve çok sayıda telekonferansta kapsamlı biçimde tartışıldı
- Kasım 2025’ten önceki toplantılarda geri bildirimler yansıtılarak contracts spesifikasyonundaki 2 hata düzeltildi
(4) std::execution (Sender/Receiver)
- C++ için asenkron model; eşzamanlılık ve paralelliği ifade edip kontrol etmek için birleşik bir çerçeve sunuyor
- Structured concurrency (yaşam döngüleri sıkı biçimde iç içe geçen eşzamanlılık) yazmayı kolaylaştırıyor ve veri yarışını (
data race) yapısal olarak önlemeye yardımcı olan güvenlik özellikleri sağlıyor
- Dikkat: Mevcut durumda dokümantasyon eksik ve “fingers-and-toes” kütüphaneleri yetersiz olduğundan, benimseme zorluğu diğer C++ özelliklerine göre daha yüksek
- Alanı iyi bilen uzmanlardan destek almak ve mevcut asenkron kodla entegrasyon için adapter kütüphaneleri yazmak gerekebilir
C++26’nın neden hızla benimsenmesi bekleniyor
- C++11’den bu yana en çok talep gören özellik seti olarak görülüyor; çoğu C++ geliştiricisinin günlük olarak kullanacağı reflection ve güvenlik güçlendirmelerini içeriyor
- C++17, C++20 ve C++23’teki parallel STL, concepts, coroutines ve modules gibi özelliklerin, tüm C++ geliştiricileri üzerinde C++11 kadar geniş bir etki yaratmadığı değerlendiriliyor
- GCC ve Clang, C++26 geliştirme süreci boyunca özelliklerin üçte ikisini önceden implement etmiş durumda kaldı
- GCC, reflection ve contracts’ı trunk’a zaten birleştirdi ve yayımlanmayı bekliyor
C++29 çalışmaları başladı: bellek güvenliğinde daha da ileri
- Bu toplantıda C++29 takvimi de kabul edildi ve 3 yıllık sürüm döngüsü korunuyor
- C++29’un ana odağının tür ve bellek güvenliğini daha da güçlendirmek olacağı kesinleşti
- Tanımsız davranışı (UB) daha da azaltmaya yönelik öneriler değerlendiriliyor
- SG23 (güvenlik ve emniyet alt grubu), Bjarne Stroustrup’un P3984 type safety profile çalışması ile Gabriel Dos Reis’in genel profil çerçevesi temelinde çalışmalarını sürdürüyor
- Apple’dan Oliver Hunt, P4158R0 "C++ için bellek güvenliğine yönelik alt kümeleme ve kısıtlamalar" başlıklı sunumu yaptı
- WebKit’in 4 milyondan fazla satır kodunda subset-of-superset yaklaşımı uygulandı
- “Birçok zafiyet sınıfını engelliyor ve mevcut politikanın geçmişteki exploit’lerin çoğunu önlemiş olacağı” bildirildi
- Bellek güvenliği konusu, komite çoğunluğunun katıldığı Çarşamba akşamı oturumunda ve yaklaşık 90 kişinin katıldığı Cuma öğleden sonraki EWG özel oturumunda derinlemesine tartışıldı
- Miktarlar ve birimler kütüphanesi (P3045R7 "Quantities and units library"), SG6 ve SG18’den LEWG’ye (ana kütüphane evrim alt grubu) ilerledi
Takvimde sıradaki adımlar
- Sonraki iki toplantı Çekya’nın Brno kentinde (Haziran) ve Brezilya’nın Rio de Janeiro eyaletindeki Búzios’ta (Kasım) düzenlenecek
- Bu iki toplantıda C++29 working draft’ına özellik ekleme çalışmaları başlayacak
- Şimdiden bir sonraki toplantıya kadar yapılacak çok sayıda alt grup telekonferansı takvime alınmış durumda
7 yorum
zzz
Hacker News görüşleri
Contracts özelliğinin C++ standardına alınmış olmasına üzülenler var
Zaten karmaşıklık sınırına ulaşmış bir dile bir katman daha karmaşıklık eklenmiş gibi geliyor
Bjarne Stroustrup da bu özelliği “eksik ve komite usulüyle şişirilmiş bir tasarım” olarak tanımlamış
Özelliğin kendi içinde de çok sayıda riskli kullanım noktası (footgun) olduğu için yeterince haklı bulunmuyor
Ama kimse ilgi göstermedi
İlgili materyaller burada
Ada ve Rust'ta olduğu gibi biçimsel doğrulama (proof assistant) ile bütünleşip test yerine statik doğrulamayı mümkün kılan temel bir unsur
Ada Spark'a bakılabilir
cppreference belgesi içindeki ilk örnek, aslında durumu değiştiren istisnai bir vaka
Sözdizimi de sezgisel değil
Örneğin
asserts_pre(num >= 0)gibi bir biçim,pre(num >= 0)ifadesinden çok daha açık olurduAma anlaşılan öncelik kısalık olmuş
Karmaşıklık eklemekten çok, herkesin ayrı ayrı yaptığı uygulamaları birleştirip birlikte çalışabilirliği artırıyor
Hatta Reflection gibi özelliklerin daha fazla karmaşıklık eklediği düşünülüyor
C# ve Java geliştiricisi olarak merak edilen bir şey var
Bugünlerde C++ ile ne tür uygulamalar geliştirildiğini bilmek istiyorlar
Gerçekte hangi sorunları çözdüğünü duyma fırsatı pek olmuyor
Başlatılmamış değişkenlerde “erroneous behavior” yeniden tanımı ilgi çekici bulunmuş
Standart belgesine göre bunun bir çalışma zamanı maliyeti var ve
[[indeterminate]]niteliği kullanılırsa tekrar undefined behavior durumuna döndürülebiliyorGerçekten başlatmamak istenirse
int x = void;gibi açıkça yazmak gerekiyorBunu yanlışlıkla yazmak neredeyse imkânsız
[[indeterminate]]neden yeniden UB (Undefined Behavior) durumuna dönüyor, bu da sorgulanıyorBazı projeler hâlâ elle başlatmayı tercih edecektir
[[indeterminate]]görecek kişiyi düşünmek bile korkunçSonuçta ya anlamını araştırmak için zaman kaybedecek ya da bir süre sonra tamamen görmezden gelecek
Bu, Rust'ta çok fazla jenerik ve trait yüzünden kod okumayı zor bulma deneyimini hatırlatıyor
90'larda MS'in C++ ekibinde çalışmış biri
O dönemde RTTI'nin C++'ın sahip olabileceği yansıma (reflection) sisteminin sınırı olduğunu düşündüğünü söylüyor
Bugünkü gelişmeler ona şaşırtıcı geliyor
Toplantıyı Croydon'da yapıp imzalar atılana kadar kimseyi çıkarmamaları oldukça kurnaz bir taktik olarak görülmüş
Orada bir daha çalışmak istemeyenler var
GCC ve Clang'ın C++26 uygulama durumu merak ediliyor
GCC, reflection ve contracts desteğini şimdiden trunk'a birleştirmiş, ama Clang'ın ne durumda olduğu soruluyor
GCC sayfasında ise “yes” görünüyor
Bu uygulama şimdiden Compiler Explorer'da kullanılabiliyor ve simdjson'a reflection eklemek için kullanılıyor
Bu standarttaki modül sistemi değişikliklerinin gerçekten daha yaygın kullanım sağlayıp sağlamayacağı sorgulanıyor
Rust'ın Cargo ile C++'ı ezmesinin nedeni tam da bu
cargo addgibi tek satırla bağımlılık eklenememesi yeni nesli uzaklaştırıyorCMake, Clang'ın iki aşamalı derleme modelini benimserse derleme hızı ciddi biçimde artar
Ancak o zaman modüller gerçekten yaygınlaşabilir
Yeni özellikler o kadar fazla ki takip etmek zor
Derleme sistemi dağınık, header dosyaları ise artık ortadan kalkmalı
Konu dışı ama “London Croydon” ifadesi kulağa tuhaf geliyor
Genelde “Croydon, London” denmez mi diye soruluyor
Seyahat planlarken büyük bölgeden küçük bölgeye doğru okumak daha doğal gelebiliyor
“London, Croydon” yazılmasının nedeni muhtemelen “toplantı Londra'da yapıldı” izlenimi vermek
“Croydon, London” ise “Londra'nın dışındaki Croydon'da yapıldı” hissi verdiği için daha az havalı duruyor — yarı şaka bir yorum
“Dil rafa kalkmadan hemen önce çıktı” türünden alaycı tepkiler de var
C++29 yalnızca kalite iyileştirmeleri ve mevcut özelliklerin cilalanmasına odaklanırsa topluluğun çok da şikâyet etmeyeceği düşünülüyor
C++ standardı çıktıktan sonra, sanayide benimsenmeye başlaması için en az 5 yıl geçmesi gerekiyor; ancak o zaman yavaş yavaş benimseniyor gibi bir hava var.. Cazip ama ulaşılmaz bir şey gibi, hıçkıra hıçkıra ağlatıyor
Bellek güvenliği için yeni özellikler eklemek yerine sadece dangling pointer'ları ya da mutable reference'ları engelleseler bile bellek güvenliği artardı; ama bunun yerine özellik ekleyerek sadece kodun karmaşıklığını artırıyorlar.
Zorlanarak Rust'a geçmiştim ama C++26 standart taslağına uzun zamandır beklediğim özelliklerin önemli bir kısmının yansımış olması sevindirici. Ama tekrar C++'a dönmeyeceğim... haha
Paketleme ile ilgili olanlar CMake tarafında da çıkıyor.. https://www.kitware.com/common-package-specification-is-out-the-gate/
contractgerçekten beklediğim bir özellikti, sonunda geldi