Ne oldu?
C++ standardını ISO’daki WG21 komitesi yazıyor. Ama bir taslağın resmî standart olması için son adımda ülkelerin ulusal standart kuruluşları oy veriyor. Bu aşamanın adı DIS (Draft International Standard) oylaması. Geçmek için iki şart var: Oy veren tam üyelerin üçte ikisi “evet” demeli ve verilen oyların en fazla dörtte biri “hayır” olmalı.
C++26 oylaması 23 Ekim’de kapandı. Polonya ulusal kuruluşunun üyesi Mateusz Pusz’un derlediği sonuçlara göre taslak iki şartı da karşılamadı: Tam üyelerden 20 oyun 12’si “evet” (%60, gereken 14’tü). Toplam 22 oyun 9’u “hayır” (%41). Hayır diyenler Danimarka, Finlandiya, İran, İtalya, Japonya, Lüksemburg, Romanya, İspanya ve İsveç. Resmî sonuç belgesi henüz kamuya açık değil. Sayılar, sonucu duyuran C komitesi başkanı Robert Seacord’un paylaşımından geliyor. Ülkelerin yorumları da henüz yayımlanmadı, ama tartışmanın tek bir özellikte toplandığı açık.
Contracts nedir?
Contracts, bir fonksiyonun beklentilerini kodun içine yazmanın yolu:
pre: Ön koşul. Fonksiyon çalışmadan önce girdiler kontrol ediliyor.post: Son koşul. Sonuç kontrol ediliyor, örneğinpost (r : r >= 0.0).contract_assert: Fonksiyonun içinde bir kontrol.
İlk bakışta yerleşik assert gibi duruyor. Asıl tartışma, bu kontrollerin nasıl çalışacağında. Taslakta dört davranış var: ignore (hiç çalıştırma), observe (çalıştır, hatayı bildir, devam et), enforce (hata varsa programı durdur) ve quick_enforce. Hangisinin kullanılacağına kodu yazan değil, derleme ayarları karar veriyor.
Karşı çıkanlar ne diyor?
Ağustos’ta Stroustrup ve dört komite üyesi P4334R0 adlı bir makale yayımladı. Onlara göre bu tasarım C++ için “varoluşsal bir tehdit”. Gerekçeleri kısaca şöyle:
- Üretimde kapanan kontrol, güvenlik sağlamaz. Eiffel’de, C’nin
assert’ünde, Microsoft’un C# Code Contracts’ında aynı model denendi: Testte aç, üretimde kapat. Makaleye göre bu 1980’lerin yaklaşımı. Bugünün cevabı her zaman açık kalan, sertleştirilmiş standart kütüphaneler ve statik analiz. - Eksik ve denenmemiş. Taslakta yaklaşık 56 sayfa metin var. Sanal fonksiyonlarda contracts gibi gündelik kullanım için gereken parçalar C++29’a bırakıldı. Makale yazıldığında GCC 16 desteği deneyseldi, Clang’da yoktu.
- Yeni hata yolları açıyor. Aynı başlık dosyasındaki bir fonksiyon, bir dosyada kontrol açık, diğerinde kapalı derlenirse ihlal fark edilmeyebiliyor.
Makalenin yazarları, contracts fikrine değil bu tasarıma karşı olduklarını ve C++26’nın geri kalanıyla sorunları olmadığını söylüyor. Bir dilekçe de ülkeleri “hayır” oyu vermeye çağırdı.
Destekleyenler ne diyor?
Tasarımın yazarlarından Timur Doumler ve 15 kişi, oylama kapandığı gün P4433R0’ı yayımladı. Onlara göre bu itirazların hepsi komitede defalarca dinlendi ve oylandı. Contracts, WG21 genel kurulunda 100’e 14 oyla kabul edilmişti, taslak da 114’e 12 oyla oylamaya gönderilmişti. Küçük bir grubun komitede kazanamadığını ulusal kuruluşlarda kazanmaya çalıştığını yazıyorlar. Contracts’ı çıkarmanın da birkaç aylık bir gecikme olmayacağını, 2019’da C++20’den çıkarıldıktan sonra yeniden toparlanmasının altı yıl sürdüğünü hatırlatıyorlar.
Sırada ne var?
ISO kurallarına göre seçenekler belli: Düzeltilmiş bir taslakla yeni bir oylama, yorumlar için yeni bir komite taslağı, standart yerine teknik şartname (TS) ya da C++26’yı tamamen iptal etmek. Kararı SC22 başkanı veriyor, WG21 öneride bulunuyor. Komite 16–21 Kasım’da Brezilya’nın Búzios kentinde toplanacak. Pusz’un aktardığına göre bazı üyeler takvim 2027’ye kayarsa adın “C++27” olmasının mantıklı olacağını düşünüyor.
Düşün
- Kendi kodunda kontrolleri test sırasında açıp üretimde kapatıyor musun? Üretimde bir girdi beklediğin gibi değilse ne oluyor?
- Bir özellik komitede büyük çoğunlukla kabul edildiyse, azınlığın itirazı son oylamada belirleyici olmalı mı?
Videoyu izle
Kaynaklar (5, İngilizce)
- Better Stack (short): C++26 Just Got Rejected... Here's Why. (yeni sekmede açılır)
- Mateusz Pusz: The result of the C++26 DIS ballot (yeni sekmede açılır)
- WG21 P4334R0: P2900 Contracts' fundamental flaws (Stroustrup, García, Falco, Spicer, Voutilainen) (yeni sekmede açılır)
- WG21 P4433R0: Do not remove Contracts from C++26 (Doumler, Berne ve diğerleri) (yeni sekmede açılır)
- WG21 P2900: Contracts for C++ (yeni sekmede açılır)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.