GCC 15 derleyici paketinin yayınlanması

Bir yıllık geliştirmenin ardından, yeni GCC 15.1.x dalındaki ilk büyük sürüm olan ücretsiz GCC derleyici paketi GCC 15 yayınlandı. Sürüm numaralandırma şemasına göre, geliştirme sırasında 15.0 sürümü kullanıldı ve GCC 15.1'in yayınlanmasından kısa bir süre önce, bir sonraki büyük sürüm olan GCC 16.0'in temelini oluşturacak olan GCC 16.1'ın bir dalı zaten çatallanmıştı.

Ana değişiklikler:

  • C programları derlenirken, varsayılan olarak GNU uzantılı ("-std=gnu23") C23 standardı (Değişiklik Özeti) kullanılır. Daha önce varsayılan olarak C17 standardı kullanılıyordu (-std=gnu17). Bu değişiklik, nullptr sabitinin, _BitInt(n) tipinin ve bool, true ve false anahtar sözcüklerinin dahil edilmesi nedeniyle mevcut projeler oluşturulurken potansiyel olarak sorunlara yol açabilir; bu da uygulamalarda tanımlanmış benzer adlı tanımlayıcılarla çakışabilir.
  • C23 standardının aşağıdaki yetenekleri uygulanmıştır:
    • "#embed" yönergesi ikili kaynakların koda gömülmesi için tasarlanmıştır.
    • Sonucun yürütme sırasına bağlı olmadığını belirten "unsequenced" niteliği.
    • "Yeniden üretilebilir" niteliği, fonksiyonun aynı girdi verildiğinde her zaman aynı sonucu döndürdüğünü, yani diğer faktörlere bağlı olmadığını gösterir.
  • Gelecekteki C2Y standardının unsurları uygulandı (-std=c2y ve -std=gnu2y):
    • "if (int x = get ()) {...}" gibi "if" ifadeleri ile değişkenleri bildirme yeteneği.
    • Kodda bunlara atıfta bulunmak için döngüleri adlandırma desteği. dış: int i = 0; i < IK; ++ i için { anahtar (i) { durum 1: kır; // CONT1 durumuna atlar durum 2: break outer; // CONT2'ye atlar } // CONT1 } // CONT2
    • "case 1...10:" gibi, case ifadelerinde tam sayı değer aralıklarının belirtilmesine yönelik destek.
    • Karmaşık sayılarda sanal kısmı belirtmek için kullanılan "i" ve "j" ekleri.
    • Karmaşık sayılarda "++" ve "—" operatörlerinin kullanılabilmesi.
    • İşlenen türüne göre bir ifade seçmek için "_Generic(type, expr1, expr2, …)" yapısı.
    • Yapılar ve birleşimler gibi diğer nesne türleri gibi bayt dizilerine erişim desteği.
    • "alignof" operatörünün eksik dizilere (örneğin "int a[]" gibi boyut belirtilmeden bildirilenler) uygulanması için destek.
    • Sekizli, onaltılı ve evrensel karakter kaçış dizileri için yeni sözdizimi eklendi. “\u”, “\x” ve “\nnn” dizileri yerine, herhangi bir sayıda rakamın belirtilebildiği “\u{}”, “\o{}” ve “\x{}” dizileri önerilmektedir.
    • Yerleşik işlevler "__builtin_stdc_rotate_left" ve "__builtin_stdc_rotate_right".
    • NULL işaretçiler üzerinde sıfır uzunluklu işlemlere izin verilir (örn. "sizeof(*p)").
  • C++ dilinin ön yüzü, gelecekteki C++26 standardı için geliştirilen özellikleri uygular:
    • Varyasyonel operatör "arkadaş" ("arkadaş Ts...").
    • Derleme zamanında bir nesneyi önceden ayrılmış belleğe yerleştirmek için constexpr anahtar sözcüğünü yeni operatörün bir çeşidiyle (placement new) kullanma yeteneği.
    • Eksik bir türe ait işaretçi silindiğinde hata çıktısı.
    • Önünde virgül olmadan üç nokta bulunan değişkenli parametreleri tanımlama sözdizimi (örneğin, "void e(int, …)" yerine "void e(int…)" belirtildiğinde) kullanımdan kaldırılmıştır.
    • Şablonlarda bir parametre paketinin indekslenmesi.
    • Yapılandırılmış bağlamalar için nitelikler;
    • Sözdizimi '= delete("neden")';
    • Temel karakter setine "@", "$" ve "`" işaretlerinin eklenmesi.
    • Modülleri bildirmek için makroların kullanılması yasaktır.
    • If ve switch ifadelerinde koşul olarak yapılandırılmış bağlamayı kullanabilme yeteneği.
    • Doğrudan dizi karşılaştırması desteği (örn. "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") sonlandırıldı.
    • İkili kaynakların gömülmesi için "#embed" mekanizması.
    • is_trivial şablon sınıfı kullanım dışı bırakıldı.
  • C++23 özellikleri eklendi:
    • "Export" yönergesinin bazı kullanımlarına izin verilmemeli ve "export {}" kullanımına izin verilmelidir.
    • Aralıklar üzerinde yineleme yapan for döngülerinde geçici nesnelerin ömrünü uzatma desteği.
  • libstdc++ kütüphanesi std ve std.compat modülleri için deneysel desteği uygular.
  • C ve C++ kodlarında birleşimler için "{0}" başlatıcısının kullanılması artık tüm içeriklerin temizlenmesini garantilemiyor, bunun yerine birleşimlerin ilk öğesinin sıfırlanmasıyla sonuçlanıyor. Tüm birleşimi temizlemek için, C23 spesifikasyonunda tanımlanan "{}" ifadesini kullanın veya eski davranışı geri yüklemek için "-fzero-init-padding-bits=unions" seçeneğini belirtin.
  • Garantili tail çağrıları için "musttail" niteliğine ([[gnu::musttail]] ve [[clang::musttail]]) yönelik destek uygulandı. Bu özellik, geçerli fonksiyona yinelemeli çağrı yapan return ifadeleri için geçerlidir ve böyle bir çağrının, yığında ek bellek ayırmayan kuyruk yinelemesini kullanmasını sağlar (çok sayıda çağrıyla belleğin tükenmesi riskini ortadan kaldırır).
  • Sayımlara, içeriklerin bit düzeyinde işlemlerde kullanıldığını belirtmek için flag_enum niteliğine ([[gnu::flag_enum]] ve [[clang::flag_enum]]) yönelik destek uygulandı (-Wswitch modunda uyarıları önler).
  • Esnek bir diziyle eleman sayısını belirleyen bir yapıdaki alanı belirtmek için kullanılabilen "counted_by" özniteliğine destek eklendi. Bu özellik, arabellek taşması denetimlerinin verimliliğini artırmak için kullanılabilir.
  • Fonksiyonlara, işaretçileri olan bazı fonksiyon parametrelerinin yalnızca başka bir parametre sıfır olduğunda NULL olabileceğini belirten "nonnull_if_nonzero" özniteliği eklendi.
  • "asm(….)" ifadesinin fonksiyonların dışında genişletilmiş derleyici içine yerleştirilmesine izin verilir. Derleyici eklemelerinde, yığının kırmızı bölgesindeki (yığının en üstündeki alan) belleğin üzerine yazılmasına izin verilir.
  • Geliştirilmiş şablon karma özelliği sayesinde C++ kodunun derlenmesi daha hızlıdır.
  • Yeni optimizasyonlar eklendi. Derleme zamanında boyutu bilinmeyen dinamik olarak tahsis edilmiş dizileri veya tamponları işleyen bu tür döngüler için, erken çıkış (örneğin, bir break veya return çağrısı yoluyla) için kod içeren vektörleştirme döngüleri için destek uygulandı. -O2 seçeneği belirtildiğinde, tripcount bilgisi bulunmayan bazı kolayca vektörleştirilebilen döngülerin vektörleştirilmesi etkinleştirilir.
  • Bağlantı aşamasında (LTO, Bağlantı Zamanı Optimizasyonu) artımlı optimizasyon modu eklendi; bu, kodda küçük değişiklikler yapıldığı durumlarda (bir fonksiyon düzenlendi) LTO kullanıldığında yeniden derleme süresini önemli ölçüde azaltır. Artımlı modu etkinleştirmek için "-flto-incremental" seçeneği önerilir.
  • Çok büyük giriş dosyalarının derlenmesi iyileştirildi. 4096'dan büyük sütun numaralarının izlenmesi uygulandı. Çok büyük dosyalarda hataların ve uyarıların yerini gösterme doğruluğu artırıldı.
  • Sorunları teşhis ederken raporların görünürlüğü iyileştirildi. Örneğin, sorunun yeri “⚠️” simgesiyle vurgulandı, C++ şablonlarındaki hatalara ilişkin çıktı düzeni değiştirildi, C23 standardına geçişi kolaylaştıracak ipuçları eklendi ve renk şeması yeniden tasarlandı. Tanılamaların Sarif formatında (-fdiagnostics-format=sarif-file) çıktısını alma yeteneği eklendi.
  • GCC'nin tanılama mesajlarının tasarımıyla ilgili yeteneklerini projelerinize entegre etmenize olanak sağlayan libgdiagnostics kütüphanesi uygulandı (örneğin, alıntılama, vurgulama ve düzeltme ipuçlarını kullanabilirsiniz).
  • Satır sonlarında kalan boşlukları ve satır başlarındaki ekstra boşlukları tespit etmek için "-Wtrailing-whitespace" ve "-Wleading-whitespace" uyarıları eklendi.
  • Başlık dosyasının tekrar eklenmesini engelleyen başlık koruma makrolarındaki sorunları bildirmek için "-Wheader-guard" uyarısı eklendi.
  • D dili için önyüz 2.111.0 sürümüne güncellendi.
  • Fortran ön yüzüne işaretsiz tamsayılar için destek eklendi.
  • Pakette COBOL dili için bir derleyici olan gcobol yer alıyor. Bu derleyici x86-64 ve AArch64 platformlarını destekliyor ve 32 bit sistemlerde kullanılmak üzere tasarlanmamış. Derleyici ISO/IEC 1989:2023 spesifikasyonunu uygular ve NIST CCVS/85 testlerinin çoğunu geçer.
  • Paylaşımlı bellek ve vektörleştirme birimlerine (SIMD) sahip çok çekirdekli ve hibrit (CPU+GPU/DSP) sistemlerde paralel programlama yöntemlerinin uygulanmasına yönelik API ve yöntemleri tanımlayan OpenMP 5.0, 5.1, 5.2 ve 6.0 (Açık Çoklu İşlem) standartlarının uygulanmasına devam edilmiştir. Meta yönergeler ve döşeme, açma, birlikte çalışma ve gönderme yapıları için destek eklendi. Bazı AMD ve NVIDIA GPU'ları için, birleşik paylaşımlı bellek desteği eklendi ("requires" yönergesinde unified_shared_memory belirtilerek etkinleştirildi). "self_maps" ifadesi için destek eklendi.
  • AArch64 mimarisinin arka ucu MinGW platformunu (aarch64-w64-mingw32) destekleyecek şekilde güncellendi. 20'den fazla ARM8 uzantısı uygulandı ve ACLE (Arm C Language Extensions) uzantısına yönelik destek iyileştirildi. Kod üretecinde çok sayıda iyileştirme yapıldı. CPU desteği eklendi:
    • Elma A12 (elma-a12)
    • Elma M1 (elma-m1)
    • Elma M2 (elma-m2)
    • Elma M3 (elma-m3)
    • Kol Korteks-A520AE (korteks-a520ae)
    • Kol Korteks-A720AE (korteks-a720ae)
    • Kol Korteks-A725 (korteks-a725)
    • Kol Korteks-R82AE (korteks-r82ae)
    • Kol Korteks-X925 (korteks-x925)
    • Kol Neoverse N3 (neoverse-n3)
    • Kol Neoverse V3 (neoverse-v3)
    • Neoverse V3AE'yi Kollayın (neoverse-v3ae)
    • FUJITSU-MONAKA (fujitsu-monaka)
    • NVIDIA Zarafeti
    • NVIDIA Olympus (olympus)
    • Qualcomm Oryon-1 (Oryon-1)
  • AMD Radeon GPU (GCN) kod oluşturma arka ucu libstdc++ kütüphanesini destekleyecek şekilde güncellendi ve gfx9-generic, gfx10-3-generic ve gfx11-generic aygıt serileri için deneysel kod oluşturma desteği eklendi.
  • x86 arka ucu artık Intel komut seti mimarisi uzantıları AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS'yi destekliyor. Intel Diamond Rapids ve Xeon Phi CPU'lar için destek eklendi.
  • LoongArch ve AVR platformları için genişletilmiş arka uç yetenekleri.
  • Nios II işlemcilerde kullanılan nios2 hedef mimarisine yönelik destek kaldırıldı. AArch32 portunda ILP32 ABI (-mabi=ilp64) desteği kullanımdan kaldırıldı ve bir sonraki büyük sürümde kaldırılacak.

Kaynak: opennet.ru

Yorum ekle