Keluaran suite pengkompil GCC 9

Selepas setahun pembangunan diterbitkan pelepasan set penyusun percuma GCC 9.1, keluaran utama pertama dalam cawangan GCC 9.x baharu. Sesuai dengan skim baru nombor keluaran, versi 9.0 telah digunakan dalam proses pembangunan, dan tidak lama sebelum keluaran GCC 9.1, cawangan GCC 10.0 telah pun bercabang, atas dasar keluaran penting seterusnya, GCC 10.1, akan dibentuk.

GCC 9.1 terkenal kerana menstabilkan sokongan untuk standard C++17, terus melaksanakan keupayaan standard C++20 masa hadapan (nama kod C++2a), kemasukan dalam bahagian hadapan untuk bahasa D, sokongan separa untuk OpenMP 5.0 , sokongan hampir lengkap untuk OpenACC 2.5, meningkatkan kebolehskalaan pengoptimuman antara prosedur dan pengoptimuman pada peringkat pengikatan, pengembangan alat diagnostik dan penambahan amaran baharu, hujung belakang untuk OpenRISC, C-SKY V2 dan AMD GCN GPU.

Utama perubahan:

  • Sokongan tambahan untuk bahasa pengaturcaraan D. GCC termasuk bahagian hadapan dengan pengkompil GDC (Gnu D Compiler) dan pustaka masa jalan (libphobos), yang membolehkan anda menggunakan GCC standard untuk membina atur cara dalam bahasa pengaturcaraan D. Proses mendayakan sokongan bahasa D dalam GCC bermula kembali pada tahun 2011, tetapi berlarutan disebabkan keperluan untuk membawa kod itu mematuhi keperluan GCC dan masalah dengan pemindahan hak harta intelek kepada Digital Mars, yang sedang membangunkan bahasa pengaturcaraan D;
  • Penambahbaikan telah dibuat pada penjana kod. Sebagai contoh, penggunaan strategi yang berbeza untuk mengembangkan ungkapan Suis (jump table, bit test, decision tree) bergantung pada situasi telah dilaksanakan. Menambahkan keupayaan untuk mengubah fungsi linear yang termasuk ungkapan Suis menggunakan pengoptimuman "-ftree-switch-conversion" (contohnya, set keadaan seperti "kes 2: bagaimana = 205; putus; kes 3: bagaimana = 305; putus ;” akan ditukar kepada "100 * bagaimana + 5";
  • Pengoptimuman antara prosedur yang lebih baik. Tetapan penggunaan sebaris telah disesuaikan untuk pangkalan kod C++ moden dan dikembangkan dengan parameter baharu max-inline-insns-small, max-inline-insns-size, uninline-function-insns, uninlined-function-time, uninlineed-thunk-insns dan uninlined -masa-thunk. Peningkatan ketepatan dan keagresifan pemisahan kod sejuk/panas. Skala yang lebih baik untuk yang sangat besar unit terjemahan (contohnya, apabila menggunakan pengoptimuman pada peringkat memaut ke program besar);
  • Mekanisme pengoptimuman berdasarkan hasil pemprofilan kod (PGO - Pengoptimuman berpandukan Profil) telah dipertingkatkan, yang menjana kod yang lebih optimum berdasarkan analisis ciri-ciri pelaksanaan kod. Pilihan ringkasan "-fprofile-penggunaan" kini termasuk mod pengoptimuman "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" dan "-ftree-loop-distribution". Mengalih keluar kemasukan histogram dengan pembilang dalam fail, yang mengurangkan saiz fail dengan profil (histogram kini dijana dengan cepat apabila melakukan pengoptimuman semasa memaut);
  • Pengoptimuman Masa Pautan Dipertingkat (LTO). Penyederhanaan jenis disediakan sebelum menjana hasil, yang memungkinkan untuk mengurangkan saiz fail objek LTO dengan ketara, mengurangkan penggunaan memori pada peringkat pengikatan, dan menambah baik penyejajaran operasi. Bilangan partition (-param lto-partitions) telah ditingkatkan daripada 32 kepada 128, yang meningkatkan prestasi pada sistem dengan sejumlah besar utas CPU. Parameter telah ditambahkan untuk mengawal bilangan proses pengoptimuman
    "-param lto-max-streaming-parallelism";

    Akibatnya, berbanding dengan GCC 8.3, pengoptimuman yang diperkenalkan dalam GCC 9 dibenarkan mengurangkan masa penyusunan Firefox 5 dan LibreOffice 66 sebanyak kira-kira 6.2.3%. Saiz fail objek berkurangan sebanyak 7%. Masa mengikat pada CPU 8 teras menurun sebanyak 11%. Peringkat pengoptimuman berurutan bagi peringkat pemautan kini 28% lebih pantas dan menggunakan 20% kurang memori. Penggunaan memori setiap pemproses peringkat selari LTO menurun sebanyak 30%;

  • Kebanyakan spesifikasi pengaturcaraan selari dilaksanakan untuk bahasa C, C++ dan Fortran OpenACC 2.5, yang mentakrifkan alatan untuk memunggah operasi pada GPU dan pemproses khusus seperti NVIDIA PTX;
  • Sokongan separa untuk standard telah dilaksanakan untuk C dan C++ Buka MP 5.0 (Pemprosesan Berbilang Terbuka), yang mentakrifkan API dan kaedah menggunakan kaedah pengaturcaraan selari untuk bahasa C, C++ dan Fortran pada sistem berbilang teras dan hibrid (CPU+GPU/DSP) dengan memori kongsi dan unit vektorisasi (SIMD) ;
  • Amaran baharu telah ditambah untuk bahasa C: "-Waddress-of-pack-member" (nilai penunjuk tidak sejajar kepada ahli padat struktur atau kesatuan) dan
    Β«-Nilai-Wabsolut" (apabila mengakses fungsi untuk mengira nilai mutlak, jika terdapat fungsi yang lebih sesuai untuk hujah yang ditentukan, sebagai contoh, fabs(3.14) harus digunakan dan bukannya abs(3.14). Amaran baharu ditambahkan untuk C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" dan "-Wclass-conversion". Banyak amaran yang tersedia sebelum ini telah diperluaskan;

  • Menambahkan sokongan percubaan untuk sebahagian daripada standard bahasa C masa hadapan, dengan nama kod C2x. Untuk mendayakan sokongan C2x, gunakan pilihan "-std=c2x" dan "-std=gnu2x" (untuk mendayakan sambungan GNU). Piawaian masih di peringkat awal pembangunan, oleh itu, keupayaannya, hanya ungkapan _Static_assert dengan satu hujah disokong (_Static_assert dengan dua hujah diseragamkan dalam C11);
  • Sokongan untuk standard C++17 telah diisytiharkan stabil. Di bahagian hadapan, keupayaan bahasa C++17 dilaksanakan sepenuhnya, dan dalam libstdc++, fungsi perpustakaan yang ditakrifkan dalam standard hampir kepada pelaksanaan penuh;
  • Bersambung pelaksanaan elemen piawaian C++2a masa hadapan. Sebagai contoh, keupayaan untuk memasukkan julat semasa pemulaan telah ditambahkan, sambungan untuk ungkapan lambda telah dilaksanakan, sokongan untuk ahli kosong struktur data dan atribut yang berkemungkinan/tidak mungkin telah ditambahkan, keupayaan untuk memanggil fungsi maya dalam ungkapan bersyarat telah disediakan , dan lain-lain.
    Untuk mendayakan sokongan C++2a, gunakan pilihan "-std=c++2a" dan "-std=gnu++2a". Menambah fail pengepala bit dan versi pada libstdc++ untuk C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible dan std::type_identity traits, std::midpoint, std:: , std::bind_front,
    std::visit, std::is_constant_evaluated dan std::assume_aligned, menambah sokongan untuk jenis char8_t, melaksanakan keupayaan untuk menyemak awalan dan akhiran rentetan (starts_with, ends_with);

  • Menambah sokongan untuk pemproses ARM baharu
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE dan Neoverse N1. Sokongan tambahan untuk arahan yang diperkenalkan dalam Armv8.3-A untuk bekerja dengan nombor kompleks, penjanaan nombor pseudo-rawak (rng) dan penandaan memori (memtag), serta arahan untuk menyekat serangan yang berkaitan dengan pelaksanaan spekulatif dan operasi unit ramalan cawangan . Untuk seni bina AArch64, mod perlindungan telah ditambah persimpangan timbunan dan timbunan (β€œ-fstack-clash-protection”). Untuk menggunakan ciri seni bina Armv8.5-A, pilihan "-march=armv8.5-a" telah ditambahkan

  • Ia termasuk bahagian belakang untuk menjana kod untuk GPU AMD berdasarkan seni bina mikro GCN. Pelaksanaan pada masa ini terhad kepada penyusunan aplikasi berbenang tunggal (sokongan untuk menjalankan pengiraan berbilang benang melalui OpenMP dan OpenACC akan ditawarkan kemudian) dan sokongan untuk GPU Fiji dan Vega 10;
  • Menambah bahagian belakang baharu untuk pemproses OpenRISC;
  • Penambahan bahagian belakang untuk pemproses C-SKY V2, dikeluarkan oleh syarikat China dengan nama yang sama untuk pelbagai peranti pengguna;
  • Semua pilihan baris arahan yang mengendalikan nilai bait menyokong akhiran kb, KiB, MB, MiB, GB dan GiB;
  • Dilaksanakan pilihan β€œ-flive-patching=[inline-only-static|inline-clone]” membolehkan anda mencapai kompilasi selamat untuk sistem tampalan langsung kerana kawalan berbilang peringkat ke atas penggunaan antara prosedur (IPA) pengoptimuman;
  • Menambahkan pilihan "--completion" untuk kawalan terperinci penyelesaian pilihan apabila menggunakan bash;
  • Alat diagnostik menyediakan paparan petikan teks sumber yang menunjukkan nombor baris dan maklumat berkaitan penandaan visual, seperti jenis operan. Untuk melumpuhkan paparan nombor baris dan label, pilihan "-fno-diagnostics-show-line-nombors" dan "-fno-diagnostics-show-labels" disediakan;

    Keluaran suite pengkompil GCC 9

  • Dikembangkan alat untuk mendiagnosis ralat dalam kod C++, meningkatkan kebolehbacaan maklumat tentang punca ralat dan menyerlahkan parameter bermasalah;

    Keluaran suite pengkompil GCC 9

  • Menambahkan pilihan "-fdiagnostics-format=json", yang membolehkan menjana output diagnostik dalam format boleh dibaca mesin (JSON);
  • Menambah pilihan pemprofilan baharu "-fprofile-filter-files" dan "-fprofile-exclude-files" untuk memilih fail sumber untuk diproses;
  • AddressSanitizer menyediakan penjanaan kod pengesahan yang lebih padat untuk pembolehubah automatik, yang mengurangkan penggunaan memori fail boleh laku yang disemak;
  • Output yang lebih baik dalam "-fopt-infoΒ» (maklumat terperinci tentang pengoptimuman tambahan). Menambah awalan baharu "dioptimumkan" dan "terlepas", sebagai tambahan kepada awalan "nota" yang tersedia sebelum ini. Menambahkan output maklumat tentang membuat keputusan mengenai pembongkaran sebaris dan pemvektoran kitaran;
  • Menambahkan pilihan "-fsave-optimization-record", apabila dinyatakan, GCC menyimpan fail SRCFILE.opt-record.json.gz dengan perihalan keputusan tentang penggunaan pengoptimuman tertentu. Pilihan baharu berbeza daripada mod "-fopt-info" dengan memasukkan metadata tambahan, seperti maklumat tentang profil dan rantaian sebaris;
  • Menambahkan pilihan "-fipa-stack-alignment" dan "-fipa-reference-addressable" untuk mengawal penjajaran tindanan dan penggunaan mod pengalamatan (tulis sahaja atau baca-tepat) untuk pembolehubah statik semasa pengoptimuman antara prosedur;
  • Fungsi terbina dalam baharu diperkenalkan untuk mengawal pengikatan atribut serta tingkah laku yang berkaitan dengan ramalan cawangan dan pelaksanaan arahan spekulatif: "__dibina_mempunyai_sifatΒ«,Β«__dibina_jangka_dengan_kebarangkalian"Dan"__nilai_spekulasi_terbina_selamat". Atribut baharu telah ditambah untuk fungsi, pembolehubah dan jenis salinan;
  • Sokongan penuh untuk input/output tak segerak telah dilaksanakan untuk bahasa Fortran;
  • Sokongan untuk platform Solaris 10 (*-*-solaris2.10) dan Cell/BE (Cell Broadband Engine SPU) telah ditamatkan dan akan dialih keluar dalam keluaran utama seterusnya. Sokongan untuk seni bina Armv2, Armv3, Armv5 dan Armv5E telah dihentikan. Sokongan untuk Intel MPX (Sambungan Perlindungan Memori) telah dihentikan.

Sumber: opennet.ru

Tambah komen