- Chromium projesi, kod tutarlılığı ve güvenliğini korumak için modern C++ standart özelliklerinin kullanım kapsamını ve yasaklı öğeleri açıkça tanımlar
- C++11~C++23 arasındaki her standart için izinli, yasaklı ve incelemede (TBD) durumları ayrılır; Abseil kütüphanesi de aynı ölçütlere tabidir
- Yasaklanan özellikler arasında std::shared_ptr, std::function, std::regex, std::filesystem, std::byte, char8_t, modules bulunur
- İzin verilen özellikler arasında concepts, spaceship operatörü, designated initializer, std::to_underlying, std::ranges algoritmaları yer alır
- Bu kılavuz Chromium ve tüm alt projelere uygulanır; kod kararlılığı ve derleme uyumluluğunu sağlamak için temel bir ölçüt olarak çalışır
Chromium'un Modern C++ kullanım politikası
- Chromium, modern C++ standartlarını hemen benimsemek yerine, toolchain desteği yeterince sağlandıktan sonra bunları “ilk desteklenen (initially supported)” durumuna alır
- Ardından özellikler bazında izinli (allowed), yasaklı (banned) ve incelemede (TBD) olarak sınıflandırılır
- Yeni özelliklerin durum değişikliği cxx@chromium.org posta listesi üzerinden önerilebilir
- İlk destekten 2 yıl sonra, açık bir değerlendirme sürecinin ardından ilgili özellik izinli ya da yasaklı listesine taşınır
C++11'de yasaklanan özellikler
- Dil özellikleri: inline namespace, long long, kullanıcı tanımlı sabitler (user-defined literals)
- Kütüphane özellikleri:
<chrono>, <regex>, <random> motorları, <exception>, <ratio>, <thread> vb.
- İstisnalar (exception) tamamen devre dışıdır; yalnızca
noexcept kullanımı serbesttir
std::bind, std::function, std::shared_ptr, std::weak_ptr yerine base::Bind, base::Callback, base::RefCounted kullanılır
C++17'de yasaklanan özellikler
- UTF-8 karakter sabiti (u8) yasaktır; nedeni
char8_t ile uyumluluk sorunlarıdır
- Yasaklı kütüphane öğeleri:
- matematiksel özel fonksiyonlar, paralel algoritmalar (parallel algorithms),
std::any, std::byte, std::filesystem, std::pmr bellek kaynakları vb.
- Paralel algoritmalar, libc++ desteğinin olmaması ve Chrome'un thread modeliyle çakışma riski nedeniyle yasaktır
C++20'de izin verilen ve yasaklanan özellikler
- İzin verilen dil özellikleri:
- concepts, consteval, designated initializers, spaceship operatörü, [[likely]], range-for başlatma sözdizimi
- İzin verilen kütüphane özellikleri:
<bit>, <compare>, <concepts>, <numbers>, std::erase_if, std::ranges::subrange, std::to_underlying vb.
- Yasaklanan özellikler:
- char8_t, modules, [[no_unique_address]],
std::bit_cast, <span>, std::bind_front, std::ranges::view_interface
- İncelemede (TBD): coroutine,
<format>, <source_location>, std::u8string
C++23'te izin verilen ve incelenen özellikler
- İzin verilen dil özellikleri:
#elifdef, if consteval, static operator
- İzin verilen kütüphane özellikleri:
std::byteswap, std::basic_string::contains, std::to_underlying, genişletilmiş std::ranges algoritmaları
- İncelemede olan özellikler:
std::expected, std::mdspan, std::generator, std::stacktrace, std::print, [[assume]], #warning vb.
Abseil kütüphanesi politikası
- Yasaklanan Abseil bileşenleri:
absl::any, absl::optional, absl::StatusOr, absl::Span, absl::FunctionRef, absl::Mutex, absl::Time, absl::btree_* vb.
- Bunların çoğu Chromium'un base namespace uygulamalarıyla değiştirilir (
base::span, base::expected, base::Bind vb.)
- İncelemede (TBD):
absl::linked_hash_set, absl::linked_hash_map
Genel anlamı
- Chromium, standart C++ özelliklerini koşulsuz kabul etmez; derleme kararlılığı, güvenlik, performans ve kod tutarlılığı ölçütlerine göre seçerek uygular
- Yasaklanan özelliklerin büyük bölümü, yinelenen uygulamalar (base::) veya toolchain/ABI uyumluluğu sorunları nedeniyle dışarıda bırakılmıştır
- Bu kılavuz, Chromium ekosisteminde C++ kod kalitesi yönetimi için temel bir referans olup açık kaynak iş birliğinde mutlaka bakılması gereken bir belge işlevi görür
3 yorum
C++'ın geriye dönük uyumluluk uğruna dilin giderek şişmeye devam etmesi üzücü..
Gerçekten de HN yorumundaki gibi devasa bir dil C++ ...
Hacker News yorumları
Özellikle göze çarpan bir şey yok ama çoğu, “bizim kullanımımıza uygun kurum içinde geliştirilmiş kütüphaneleri kullanalım” yaklaşımında
Geri kalanı da locale sorunlarından kaçınmak gibi makul noktalar. Standart kütüphanenin pürüzlü taraflarını düzelten seçenekler de var, bu yüzden anlaşılır geliyor
chronoyoktu, bu yüzden kendi zaman tiplerini yaptılar; STL istikrara kavuşmadan önce de kendi container'larını kullanıyorlardıBugün yeni bir proje başlatsanız bu kuralların çoğunun anlamı kalmaz gibi görünüyor
char8_t'nin yasaklanma gerekçesi ilginç. UTF-8 dışındaki encoding'ler neredeyse yok vechar8_t*,char*ile uyumlu değil; bu yüzden her yere saçılan cast'leri önlemek içinstd::stringya dastd::string_viewkullanılması öneriliyorEski kod konusu açılınca Chromium'un ilk çıktığı zamanları hatırladım
Bu kod tabanının tam 20 yıl önce başlatılmış olması şimdi düşününce gerçekten şaşırtıcı
<regex>'in yasaklanması iyi karar. UTF-8'i düzgün işleyemediği için kullanılamıyordu. Böyle kusurlu bir tasarımın standartlaştırılmış olması şaşırtıcıÜst dizinde daha ilginç belgeler var
Chromium C++ stil kılavuzu bakmaya değer
Exception'lar yasak ama Windows için istisna var
Yani exception'lar felsefi olarak reddedilmemiş; pratik nedenlerle yasaklanmış. Baştan başlasalardı farklı yapacaklarını söylüyorlar
[[no_unique_address]]ile ilgili bir ifade çıktı, sanırım şakayı kaçırmışımYasaklı özellik listesi o kadar uzun ki C'nin tüm özelliklerinden bile fazla gibi görünüyor. Bunaltıcı
u8"..."literal'inin yasaklanması iyi bir tercih. Kaynağın kendisini UTF-8 yazarsanız ayrıca önek gerekmezBu tür literal'ler sorundan önce çözüm üretilmiş bir durum gibi
Yasaklı özellikler için hangi alternatiflerin önerildiğini görmek istiyorum. Örneğin
<filesystem>için test desteğinin yetersiz ve güvenlik açıklarının olduğu söyleniyor<filesystem>bunun istisnasıbase/fileskullanılıyorModules yasak. Keşke onun yerine D dilinin modül sistemi kopyalansaydı
Yasak listesi, “en yeni özelliklerden çok bağlamın daha önemli olduğunu” gösteriyor. Küçük uygulamalarda sorun olmayabilir ama büyük projelerde riskli
Farklı platformlar arasında taşınabilirlik de gözetiliyor