MSVC’de constexpr cmath ve LLVM libc: Ne Değişiyor?
C++23 ile birlikte standart kütüphanedeki birçok matematik fonksiyonu derleme zamanında değerlendirilebilir hale geldi. MSVC tarafında bu yeteneğin deneysel uygulaması 14.52 derleme araçları (derleyici sürümü 19.52) için hazırlanıyor. Microsoft, özelliği hayata geçirmek için hem derleme zamanında hem de çalışma zamanında devreye giren yeni bir matematik kütüphanesine, yani LLVM libc’ye yöneldi. Değişikliğin kapsamı da bu yüzden constexpr desteğinin ötesine taşıyor.
Özellik nasıl açılıyor?
Yeni davranış, /std:c++23 (veya daha üstü) ile /Zc:cmath derleyici seçeneklerinin birlikte kullanılmasıyla etkinleşiyor. Özellik başlangıçta deneysel ve varsayılan olarak kapalı geliyor. Uygulama, derleme zamanında ve çalışma zamanında yeni bir matematik kütüphanesinden besleniyor; bu da mevcut programlarda performans ve doğruluk karakteristiklerini değiştirebilir. Microsoft, varsayılan davranışa dair kararı vermeden önce kullanıcı geri bildirimi toplamayı hedefliyor.
Kaynağa göre /Zc:cmath, yeni çalışma zamanını etkinleştirmek için /std:c++23‘ten bağımsız olarak da kullanılabilecek şekilde tasarlandı. Derleme zamanı değerlendirme ise yalnızca C++23 modunda mevcut. Daha eski dil standartlarına yönelik destek (“down-level”) henüz sevk edilmedi, ilgili çalışma dahili olarak birleştirilmiş durumda. Ayrıntılar için microsoft/STL#6425 numaralı pull request takip edilebilir.
Bugünkü tablo: UCRT ve matematik fonksiyonları
2015’ten bu yana <cmath> ve <cstdlib> içindeki matematik fonksiyonları, C çalışma zamanı üzerinden math.h ve stdlib.h ile sağlanıyor, Microsoft da bunları Universal C Runtime (UCRT) kapsamında dağıtıyor. UCRT’nin bakımını ve dağıtımını C++ araç zinciri ekibi değil, Windows işletim sistemi ekibi yapıyor. Böylece C çalışma zamanının kararlı bölümleri işletim sistemi güncellemeleriyle yerinde servis edilebiliyor, araç zincirine bağlı kısımlar ise C++ build tools ile birlikte gönderiliyor. Bu yapının arka planını anlatan 2015 tarihli Introducing the Universal CRT yazısı hala referans niteliğinde.
UCRT’nin matematik fonksiyonlarında ise bilinen matematiksel hassasiyet sorunları var. Kaynak bu konuda Gladman ve arkadaşlarının Accuracy of Mathematical Functions in Single, Double, Double Extended, and Quadruple Precision çalışmasına işaret ediyor. Sapmalar, doğruluğun hesaplama açısından çoğu zaman ulaşılabilir olmadığı dönemlere uzanan eski uygulamalardan kaynaklanıyor. Geriye dönük uyumluluğu korumak adına bu uygulamalar nadiren değiştiriliyor; yine de işletim sistemi grubu zaman zaman doğruluk güncellemeleri yapıyor.
Neden bu bir tutarlılık sorunu?
İşletim sistemi tarafından dağıtılan ve zaman içinde değişebilen matematik fonksiyonları, sonuçları çalıştırıldığı işletim sistemi sürümüne ve donanım mimarisine bağımlı kılıyor. Bir işletim sistemi yükseltmesi ya da programın başka bir mimariye taşınması (örneğin x64’ten arm64’e), bazı UCRT matematik fonksiyonlarının sonuçlarını sessizce ve beklenmedik biçimde değiştirebiliyor.
Neden yeni bir matematik kütüphanesi?
Matematik fonksiyonlarının derleme zamanında değerlendirilmesi, örneğin sonucun bir şablona argüman olarak verilmesi gibi yollarla, uygulamanın ikili arayüzünün (ABI) parçası haline gelebiliyor. Derleme zamanında üretilen bir sayının değişmesi de beklenmedik uyumluluk sonuçları doğurabiliyor. C++23 bağlamında bu tablo sürdürülemez görülmüş.
Ekip, müşterilerin gerçekten önemsediği kriterleri şu dört başlıkta toplamış:
- Doğruluk (Accuracy): Sayısal sonuçlar matematiksel olarak mümkün olduğunca doğru olmalı.
- Kararlılık (Stability): Sonuçlar, uygulama değişiklikleri nedeniyle zaman içinde değişmemeli.
- Tutarlılık (Consistency): Sonuçlar, nerede çalıştırıldığına göre farklılaşmamalı.
- Performans (Performance): Hız gözden çıkarılmamalı.
UCRT bu kriterleri karşılamadığı için alternatifler araştırılmış. Sıfırdan kendi kütüphanelerini yazma fikri gündeme gelmiş, ancak bunun uzun soluklu olduğu ve yoğun bir uzmanlık istediği hızla anlaşılmış, böylece açık kaynak dünyasına yönelinmiş. İlk odak, yalnızca C++23 cmath özelliğinin derleme zamanı tarafını çözmekmiş; çalışma zamanı yürütme UCRT’ye bırakılacakmış, çünkü çalışma zamanında da bu doğruluk seviyesini sunmanın hesaplama açısından uygulanabilir olmadığı düşünülmüş.
LLVM libc tercihinin gerekçesi
İnceleme sırasında LLVM C Library projesinin, C çalışma zamanının matematik bölümlerinde halihazırda önemli bir mesafe kat ettiği görülmüş. Proje, birincil hedef olarak doğruluğu benimsiyor ve tüm yuvarlama modlarında doğru yuvarlamayı (correct rounding) amaçlıyor; Gladman ve arkadaşlarının çalışması da bu hedefe ulaşıldığını teyit ediyor. Doğruluğu hedeflemek aynı zamanda kararlı bir arayüzü fiilen tanımlıyor, uygulama esnekliğine ve optimizasyona alan bırakıyor. Kütüphane aktif olarak bakımda, arkasında sağlıklı bir topluluk var.
Kod tabanına yakından bakıldığında, MSVC ile derlenecek şekilde kolayca uyarlanabilen, derli toplu ve bileşen bazlı bir yapı bulunmuş. Uyarlama tamamlandığında performans ölçümleri çoğu durumda UCRT ile yarışmış. Bu sonuç, kütüphanenin çalışma zamanı için de sevk edilmesini uygulanabilir kılmış. Başlangıçtaki derleme zamanı hedefi böylece genişlemiş; iddia artık, programların çalıştığı her yerde tutarlı, kararlı, doğru ve performanslı sonuç sunmak.
C++26 tarafı ve sırada ne var?
Kaynağa göre işin en büyük kısmı, LLVM libc’yi derlemek ve araç zincirine entegre etmek olmuş. Bu altyapı C++23 için kurulduğundan, C++26 aynı temel üzerine köklü bir değişiklik gerektirmeden inşa edilebilecek. LLVM libc, C++26’da constexpr haline gelen fonksiyonların tamamını henüz uygulamış değil; hazır olanlar için destek ise şimdiden eklenmiş durumda. Kaynakta örnek olarak sin, cos, tan ve pow sayılıyor. Henüz hazır olmayanlara lgamma örnek veriliyor ve bunlar takip ediliyor.
Microsoft, özelliğin nasıl ve ne zaman genel kullanıma açılacağına karar verirken geri bildirimi belirleyici görüyor. Deneysel uygulamayı denemek isteyenler /Zc:cmath bayrağını derlemelerine ekleyip karşılaştıkları sorunları Visual Studio Developer Community üzerinden bildirebiliyor.
Konuyla ilgili bir yazı dizisi de planlanmış durumda: libc bakımcıları tarafından yazılacak ve kütüphanenin arkasındaki araştırma ile mühendisliği ele alacak bir konuk yazı, bir de özelliği sevk edebilmek için C++ build tools tarafında uygulanan yöntemleri anlatan bir yazı.
Pratikte ne anlama geliyor?
Kod tabanınız floating-point sonuçların sürümden sürüme veya mimariden mimariye aynı kalmasına duyarlıysa, bu değişiklik doğrudan ilgi alanınızda. Özellik deneysel ve varsayılan olarak kapalı olduğundan mevcut derlemeleriniz kendiliğinden etkilenmiyor, ama /Zc:cmath ile açtığınızda derleme zamanının yanı sıra çalışma zamanı davranışı da yeni kütüphaneden besleniyor. Sayısal sonuçlara bağımlı testleriniz varsa, bayrağı açtıktan sonra atılacak ilk adım bu testleri gözden geçirmek. Kaynak metin, özelliğin hala rafine edildiğini ve tozun ancak üretim sevkiyatından sonra duracağını açıkça belirtiyor.
Kaynaklar ve İleri Okuma
- MSVC C++23: constexpr cmath with LLVM Libc — Cody Miller, C++ Team Blog
- P0533R9: constexpr for cmath and cstdlib (PDF)
- LLVM C Library projesi ve math başlıkları dokümantasyonu
- microsoft/STL#6425 — ilgili pull request
- Introducing the Universal CRT (2015)
- Accuracy of Mathematical Functions in Single, Double, Double Extended, and Quadruple Precision (PDF)
- Visual Studio Developer Community — C++ geri bildirim kanalı
- C++ Team Blog
- İlgili yazı: MSVC Build Tools Preview Temmuz 2026: v14.52 Notları
- İlgili yazı: MSVC 14.51 ile C++23 Desteği: Sahadan Notlar







4 comments