การเปิดตัวชุดคอมไพเลอร์ GCC 9

หลังจากหนึ่งปีของการพัฒนา การตีพิมพ์ การเปิดตัวชุดคอมไพเลอร์ฟรี GCC 9.1ซึ่งเป็นการเปิดตัวครั้งใหญ่ครั้งแรกในสาขา GCC 9.x ใหม่ ตาม โครงการใหม่ หมายเลขรุ่น เวอร์ชัน 9.0 ถูกนำมาใช้ในกระบวนการพัฒนา และไม่นานก่อนการเปิดตัว GCC 9.1 สาขา GCC 10.0 ได้แตกแขนงออกไปแล้ว โดยขึ้นอยู่กับการเปิดตัว GCC 10.1 ที่สำคัญครั้งต่อไป

GCC 9.1 มีความโดดเด่นในด้านการรักษาเสถียรภาพการรองรับมาตรฐาน C++17, การใช้ความสามารถของมาตรฐาน C++20 ในอนาคตอย่างต่อเนื่อง (ชื่อรหัส C++2a), การรวมอยู่ในส่วนหน้าสำหรับภาษา D, การรองรับบางส่วนสำหรับ OpenMP 5.0 เกือบจะรองรับ OpenACC 2.5 ได้เกือบสมบูรณ์แล้ว เพิ่มความสามารถในการปรับขนาดของการเพิ่มประสิทธิภาพระหว่างโพรซีเดอร์และการเพิ่มประสิทธิภาพในขั้นตอนการรวม การขยายเครื่องมือวินิจฉัยและการเพิ่มคำเตือนใหม่ แบ็กเอนด์สำหรับ OpenRISC, C-SKY V2 และ AMD GCN GPU

หลัก การเปลี่ยนแปลง:

  • เพิ่มการรองรับภาษาการเขียนโปรแกรม D GCC มีส่วนหน้าพร้อมคอมไพเลอร์ GDC (Gnu D Compiler) และไลบรารีรันไทม์ (libphobos) ซึ่งทำให้คุณสามารถใช้ GCC มาตรฐานเพื่อสร้างโปรแกรมในภาษาการเขียนโปรแกรม D กระบวนการเปิดใช้งานการรองรับภาษา D ใน GCC เริ่มต้น ย้อนกลับไปในปี 2011 แต่ ลากไป เนื่องจากจำเป็นต้องนำโค้ดมาปฏิบัติตามข้อกำหนด GCC และปัญหาในการโอนสิทธิ์ในทรัพย์สินทางปัญญาไปยัง Digital Mars ซึ่งกำลังพัฒนาภาษาโปรแกรม D
  • มีการปรับปรุงตัวสร้างโค้ด ตัวอย่างเช่น การใช้กลยุทธ์ที่แตกต่างกันในการขยายนิพจน์สวิตช์ (ตารางกระโดด การทดสอบบิต แผนผังการตัดสินใจ) ขึ้นอยู่กับสถานการณ์ได้ถูกนำมาใช้ เพิ่มความสามารถในการแปลงฟังก์ชันเชิงเส้นที่มีนิพจน์สวิตช์โดยใช้การปรับให้เหมาะสม “-ftree-switch-conversion” (ตัวอย่างเช่น ชุดเงื่อนไขเช่น “กรณีที่ 2: วิธี = 205; หยุด; กรณีที่ 3: วิธี = 305; หยุด ;” จะถูกแปลงเป็น "100 * อย่างไร + 5";
  • ปรับปรุงการเพิ่มประสิทธิภาพระหว่างโพรซีเดอร์แล้ว การตั้งค่าการใช้งานแบบอินไลน์ได้รับการปรับให้เหมาะกับโค้ดเบส C++ สมัยใหม่ และขยายด้วยพารามิเตอร์ใหม่ max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns และ uninlined -ทันเวลา ปรับปรุงความแม่นยำและความเข้มงวดของการแยกรหัสเย็น/ร้อน ปรับปรุงความสามารถในการปรับขนาดสำหรับขนาดใหญ่มาก หน่วยการแปล (ตัวอย่างเช่น เมื่อใช้การปรับให้เหมาะสมในขั้นตอนการเชื่อมโยงกับโปรแกรมขนาดใหญ่)
  • กลไกการปรับให้เหมาะสมที่สุดตามผลลัพธ์ของโปรไฟล์โค้ด (PGO - การเพิ่มประสิทธิภาพที่แนะนำโดยโปรไฟล์) ได้รับการปรับปรุง ซึ่งสร้างโค้ดที่เหมาะสมที่สุดมากขึ้นโดยอาศัยการวิเคราะห์ลักษณะของการเรียกใช้โค้ด ตัวเลือกสรุป "-fprofile-ใช้" ตอนนี้รวมโหมดการปรับให้เหมาะสม "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" และ "-ftree-loop-distribution" ลบการรวมฮิสโตแกรมพร้อมตัวนับในไฟล์ ซึ่งจะลดขนาดของไฟล์ที่มีโปรไฟล์ (ตอนนี้ฮิสโตแกรมจะถูกสร้างขึ้นทันทีเมื่อดำเนินการปรับให้เหมาะสมระหว่างการเชื่อมโยง)
  • การเพิ่มประสิทธิภาพเวลาการเชื่อมโยงที่ได้รับการปรับปรุง (LTO) มีการจัดเตรียมประเภทให้ง่ายขึ้นก่อนที่จะสร้างผลลัพธ์ ซึ่งทำให้สามารถลดขนาดของไฟล์อ็อบเจ็กต์ LTO ได้อย่างมาก ลดการใช้หน่วยความจำในขั้นตอนการรวม และปรับปรุงการดำเนินการแบบขนาน จำนวนพาร์ติชัน (-param lto-partitions) เพิ่มขึ้นจาก 32 เป็น 128 ซึ่งปรับปรุงประสิทธิภาพบนระบบที่มีเธรด CPU จำนวนมาก มีการเพิ่มพารามิเตอร์เพื่อควบคุมจำนวนกระบวนการเพิ่มประสิทธิภาพ
    "-param lto-max-streaming-parallelism";

    ด้วยเหตุนี้ เมื่อเปรียบเทียบกับ GCC 8.3 การเพิ่มประสิทธิภาพที่นำมาใช้ใน GCC 9 อนุญาต ลดเวลาในการคอมไพล์ของ Firefox 5 และ LibreOffice 66 ลงประมาณ 6.2.3% ขนาดของไฟล์วัตถุลดลง 7% เวลาในการเชื่อมโยงบน CPU 8-core ลดลง 11% ขั้นตอนการเพิ่มประสิทธิภาพตามลำดับของขั้นตอนการเชื่อมโยงเร็วขึ้น 28% และใช้หน่วยความจำน้อยลง 20% การใช้หน่วยความจำของโปรเซสเซอร์แต่ละตัวของ LTO แบบขนานลดลง 30%

  • ข้อกำหนดการเขียนโปรแกรมแบบขนานส่วนใหญ่นำไปใช้กับภาษา C, C++ และ Fortran OpenACC2.5ซึ่งกำหนดเครื่องมือสำหรับการลดภาระการดำเนินการบน GPU และโปรเซสเซอร์พิเศษ เช่น NVIDIA PTX
  • มีการรองรับมาตรฐานบางส่วนสำหรับ C และ C++ เปิด MP 5.0 (Open Multi-Processing) ซึ่งกำหนด API และวิธีการใช้วิธีการเขียนโปรแกรมแบบขนานสำหรับภาษา C, C++ และ Fortran บนระบบ multi-core และ hybrid (CPU+GPU/DSP) พร้อมด้วยหน่วยความจำที่ใช้ร่วมกันและหน่วย vectorization (SIMD) ;
  • มีการเพิ่มคำเตือนใหม่สำหรับภาษา C: "-Waddress ของสมาชิกที่อัดแน่น" (ค่าตัวชี้ที่ไม่ได้จัดแนวไปยังสมาชิกที่อัดแน่นของโครงสร้างหรือสหภาพ) และ
    «-Wabsolute ค่า" (เมื่อเข้าถึงฟังก์ชันเพื่อคำนวณค่าสัมบูรณ์ หากมีฟังก์ชันที่เหมาะสมกว่าสำหรับอาร์กิวเมนต์ที่ระบุ เช่น ควรใช้ fabs(3.14) แทน abs(3.14) เพิ่มคำเตือนใหม่สำหรับ C ++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" และ "-Wclass-conversion" มีการขยายคำเตือนที่มีอยู่ก่อนหน้านี้จำนวนมาก

  • เพิ่มการสนับสนุนการทดลองสำหรับส่วนหนึ่งของมาตรฐานภาษา C ในอนาคต ชื่อรหัส C2x หากต้องการเปิดใช้งานการสนับสนุน C2x ให้ใช้ตัวเลือก "-std=c2x" และ "-std=gnu2x" (เพื่อเปิดใช้งานส่วนขยาย GNU) มาตรฐานยังอยู่ในช่วงเริ่มต้นของการพัฒนา ดังนั้น ในด้านความสามารถแล้ว รองรับเฉพาะนิพจน์ _Static_assert ที่มีหนึ่งอาร์กิวเมนต์เท่านั้น (_Static_assert ที่มีสองอาร์กิวเมนต์เป็นมาตรฐานใน C11)
  • การสนับสนุนมาตรฐาน C ++ 17 ได้รับการประกาศว่ามีเสถียรภาพ ในส่วนหน้า ความสามารถด้านภาษาของ C++17 ได้รับการปรับใช้อย่างสมบูรณ์ และใน libstdc++ ฟังก์ชันไลบรารีที่กำหนดไว้ในมาตรฐานนั้นใกล้เคียงกับการใช้งานเต็มรูปแบบแล้ว
  • ต่อ การดำเนินงาน องค์ประกอบของมาตรฐาน C++2a ในอนาคต ตัวอย่างเช่น มีการเพิ่มความสามารถในการรวมช่วงในระหว่างการเริ่มต้น ส่วนขยายสำหรับนิพจน์แลมบ์ดาได้ถูกนำมาใช้ การรองรับสมาชิกที่ว่างเปล่าของโครงสร้างข้อมูล และเพิ่มคุณลักษณะที่มีแนวโน้ม/ไม่น่าจะเป็นไปได้ ความสามารถในการเรียกใช้ฟังก์ชันเสมือนในนิพจน์แบบมีเงื่อนไขได้จัดเตรียมไว้แล้ว ฯลฯ
    หากต้องการเปิดใช้งานการสนับสนุน C++2a ให้ใช้ตัวเลือก "-std=c++2a" และ "-std=gnu++2a" เพิ่มไฟล์ส่วนหัวบิตและเวอร์ชันให้กับ libstdc++ สำหรับ C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible และ std::type_identity ลักษณะ, std::midpoint, std::lerp , มาตรฐาน::bind_front,
    std::visit, std::is_constant_evaluated และ std::assume_aligned เพิ่มการรองรับสำหรับประเภท char8_t ใช้ความสามารถในการตรวจสอบคำนำหน้าและคำต่อท้ายของสตริง (starts_with,ends_with);

  • เพิ่มการรองรับโปรเซสเซอร์ ARM ใหม่
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE และ Neoverse N1 เพิ่มการรองรับคำแนะนำที่แนะนำใน Armv8.3-A สำหรับการทำงานกับจำนวนเชิงซ้อน การสร้างตัวเลขสุ่มหลอก (rng) และการแท็กหน่วยความจำ (memtag) รวมถึงคำแนะนำในการบล็อกการโจมตีที่เกี่ยวข้องกับการดำเนินการเชิงคาดเดาและการทำงานของหน่วยการทำนายสาขา . สำหรับสถาปัตยกรรม AArch64 มีการเพิ่มโหมดการป้องกัน จุดตัดของสแต็กและฮีป (“-fstack-clash-protection”) หากต้องการใช้คุณสมบัติของสถาปัตยกรรม Armv8.5-A ได้มีการเพิ่มตัวเลือก “-march=armv8.5-a” แล้ว

  • ประกอบด้วยแบ็กเอนด์สำหรับสร้างโค้ดสำหรับ AMD GPU ตาม GCN microarchitecture ขณะนี้การใช้งานถูกจำกัดอยู่ที่การรวบรวมแอปพลิเคชันแบบเธรดเดียว (รองรับการคำนวณแบบมัลติเธรดผ่าน OpenMP และ OpenACC ในภายหลัง) และรองรับ GPU Fiji และ Vega 10
  • เพิ่มแบ็กเอนด์ใหม่สำหรับโปรเซสเซอร์ OpenRISC;
  • เพิ่มแบ็กเอนด์สำหรับโปรเซสเซอร์ ซี-สกาย V2ผลิตโดย บริษัท จีนที่มีชื่อเดียวกันสำหรับอุปกรณ์ผู้บริโภคต่างๆ
  • ตัวเลือกบรรทัดคำสั่งทั้งหมดที่ทำงานด้วยค่าไบต์รองรับส่วนต่อท้าย kb, KiB, MB, MiB, GB และ GiB;
  • ดำเนินการแล้ว ตัวเลือก “-flive-patching=[inline-only-static|inline-clone]” ช่วยให้คุณสามารถคอมไพล์อย่างปลอดภัยสำหรับระบบ live-patching เนื่องจากการควบคุมหลายระดับเหนือการใช้ระหว่างขั้นตอน (IPA) การเพิ่มประสิทธิภาพ;
  • เพิ่มตัวเลือก "--completion" สำหรับการควบคุมตัวเลือกอย่างละเอียดเมื่อใช้ bash
  • เครื่องมือวินิจฉัยจะแสดงข้อความที่ตัดตอนมาจากต้นฉบับซึ่งระบุหมายเลขบรรทัดและทำเครื่องหมายข้อมูลที่เกี่ยวข้องด้วยภาพ เช่น ประเภทตัวถูกดำเนินการ หากต้องการปิดใช้งานการแสดงหมายเลขบรรทัดและป้ายกำกับ จะมีการจัดเตรียมตัวเลือก "-fno-diagnostics-show-line-numbers" และ "-fno-diagnostics-show-labels"

    การเปิดตัวชุดคอมไพเลอร์ GCC 9

  • ขยายแล้ว เครื่องมือสำหรับการวินิจฉัยข้อผิดพลาดในโค้ด C++ ปรับปรุงความสามารถในการอ่านข้อมูลเกี่ยวกับสาเหตุของข้อผิดพลาด และการเน้นพารามิเตอร์ที่เป็นปัญหา

    การเปิดตัวชุดคอมไพเลอร์ GCC 9

  • เพิ่มตัวเลือก “-fdiagnostics-format=json” ซึ่งอนุญาตให้สร้างเอาต์พุตการวินิจฉัยในรูปแบบที่เครื่องอ่านได้ (JSON)
  • เพิ่มตัวเลือกการทำโปรไฟล์ใหม่ “-fprofile-filter-files” และ “-fprofile-exclude-files” เพื่อเลือกไฟล์ต้นฉบับที่จะประมวลผล
  • AddressSanitizer ให้การสร้างรหัสยืนยันที่มีขนาดกะทัดรัดมากขึ้นสำหรับตัวแปรอัตโนมัติ ซึ่งช่วยลดการใช้หน่วยความจำของไฟล์ปฏิบัติการที่กำลังตรวจสอบ
  • ปรับปรุงเอาต์พุตใน "-fopt-ข้อมูล» (ข้อมูลโดยละเอียดเกี่ยวกับการเพิ่มประสิทธิภาพที่เพิ่มเข้ามา) เพิ่มคำนำหน้าใหม่ "เพิ่มประสิทธิภาพ" และ "พลาด" นอกเหนือจากคำนำหน้า "บันทึก" ที่มีอยู่ก่อนหน้านี้ เพิ่มเอาต์พุตข้อมูลเกี่ยวกับการตัดสินใจเกี่ยวกับการคลี่แบบอินไลน์และการทำให้เป็นเวกเตอร์ของวงจร
  • เพิ่มตัวเลือก “-fsave-optimization-record” เมื่อระบุ GCC จะบันทึกไฟล์ SRCFILE.opt-record.json.gz พร้อมคำอธิบายการตัดสินใจเกี่ยวกับการใช้การเพิ่มประสิทธิภาพบางอย่าง ตัวเลือกใหม่แตกต่างจากโหมด "-fopt-info" โดยรวมข้อมูลเมตาเพิ่มเติม เช่น ข้อมูลเกี่ยวกับโปรไฟล์และสายโซ่แบบอินไลน์
  • เพิ่มตัวเลือก “-fipa-stack-alignment” และ “-fipa-reference-addressable” เพื่อควบคุมการจัดตำแหน่งสแต็กและการใช้โหมดการกำหนดที่อยู่ (เขียนอย่างเดียวหรืออ่านอย่างเดียว) สำหรับตัวแปรคงที่ระหว่างการปรับให้เหมาะสมระหว่างโพรซีเดอร์
  • มีการแนะนำฟังก์ชันในตัวใหม่เพื่อควบคุมการเชื่อมโยงแอตทริบิวต์ตลอดจนพฤติกรรมที่เกี่ยวข้องกับการทำนายสาขาและการดำเนินการคำสั่งเชิงคาดเดา: "__ในตัว_has_attribute""__ในตัว_คาดหวัง_กับ_ความน่าจะเป็น" และ "__builtin_speculation_safe_value". มีการเพิ่มคุณลักษณะใหม่สำหรับฟังก์ชัน ตัวแปร และประเภท สำเนา;
  • มีการรองรับอินพุต/เอาท์พุตแบบอะซิงโครนัสอย่างสมบูรณ์สำหรับภาษา Fortran
  • การสนับสนุนแพลตฟอร์ม Solaris 10 (*-*-solaris2.10) และ Cell/BE (Cell Broadband Engine SPU) เลิกใช้แล้ว และจะถูกลบออกในรุ่นหลักถัดไป การสนับสนุนสถาปัตยกรรม Armv2, Armv3, Armv5 และ Armv5E ถูกยกเลิกแล้ว การสนับสนุน Intel MPX (ส่วนขยายการป้องกันหน่วยความจำ) ถูกยกเลิกแล้ว

ที่มา: opennet.ru

เพิ่มความคิดเห็น