
LLVM เป็นเฟรมเวิร์กสำหรับการพัฒนาคอมไพเลอร์รวมถึงช่วยสร้างภาษาโปรแกรมใหม่และปรับปรุงภาษาที่มีอยู่
หลังจากการพัฒนาเพียงหกเดือน การเปิดตัว เวอร์ชันใหม่ของโครงการ LLVM 16.0เวอร์ชันที่มีการดำเนินการเปลี่ยนแปลงและปรับปรุงจำนวนมาก
สำหรับผู้ที่ไม่คุ้นเคยกับ LLVM คุณควรรู้ว่าสิ่งนี้ เป็นคอมไพเลอร์ที่เข้ากันได้กับ GCC (คอมไพเลอร์ ออปติไมเซอร์ และเครื่องกำเนิดโค้ด) ที่คอมไพล์โปรแกรมเป็นบิตโค้ดขั้นกลางเหมือนคำสั่งเสมือน RISC (เครื่องเสมือนระดับต่ำที่มีระบบการปรับให้เหมาะสมหลายระดับ)
pseudocode ที่สร้างขึ้นสามารถแปลงโดยคอมไพเลอร์ JIT เป็นคำสั่งเครื่องในเวลาที่โปรแกรมดำเนินการ
คุณสมบัติใหม่ที่สำคัญของ LLVM 16.0
ในเวอร์ชันใหม่ที่นำเสนอนี้ เราสามารถพบการปรับปรุงที่สำคัญหลายประการ ในเสียงดังกราว 16.0 ซึ่งมาตรฐาน C++/ObjC++ ที่เป็นค่าดีฟอลต์โดดเด่นกว่า ซึ่ง ถูกตั้งค่าเป็น gnu++17 (เดิมคือ gnu++14) ซึ่ง หมายถึงการรองรับฟีเจอร์ C++17 พร้อมส่วนขยาย GNU ตามค่าเริ่มต้น. อนุญาตให้ใช้องค์ประกอบที่กำหนดในมาตรฐาน C++17 ในรหัส LLVM
การเปลี่ยนแปลงที่โดดเด่นอีกอย่างคือมันถูกเพิ่มเข้ามา รองรับซีพียู Cortex-A715, Cortex-X3 และ Neoverse ส่วนขยาย V2, Armv8.3 และฟีเจอร์หลายเวอร์ชันสำหรับแบ็กเอนด์ AArch64
La ความเข้ากันได้ของแพลตฟอร์ม Armv2, Armv2A, Armv3 และ Armv3M ถูกยกเลิกแล้ว ในแบ็กเอนด์สถาปัตยกรรม ARM ซึ่งไม่รับประกันการสร้างรหัสที่ถูกต้อง เพิ่มความสามารถในการสร้างรหัสสำหรับคำแนะนำในการทำงานกับจำนวนเชิงซ้อนและเพิ่ม รองรับสถาปัตยกรรม ของชุดคำสั่ง (ISA) AMX-FP16, CMPCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT เป็นแบ็กเอนด์ X86
นอกเหนือจากนั้น, ข้อกำหนดสำหรับการสร้าง LLVM ได้เพิ่มขึ้น นอกจากนี้ บิลด์ควรเข้ากันได้กับมาตรฐาน C++17 เช่น บิลด์ต้องการอย่างน้อย GCC 7.1, Clang 5.0, Apple Clang 10.0 หรือ Visual Studio 2019 16.7
อีกด้านก็ยังเน้น แบ็กเอนด์ที่ได้รับการปรับปรุงสำหรับสถาปัตยกรรม MIPS, PowerPC และ RISC-Vเช่นเดียวกับการสนับสนุนการดีบักไฟล์ปฏิบัติการ 64 บิตสำหรับสถาปัตยกรรม LoongArch ไปจนถึงดีบักเกอร์ LLDB และการจัดการสัญลักษณ์การดีบัก COFF ที่ได้รับการปรับปรุง
จากการเปลี่ยนแปลงอื่น ๆ ที่โดดเด่น:
- ในไลบรารี Libc++ งานหลักมุ่งเน้นไปที่การรองรับคุณสมบัติใหม่ของมาตรฐาน C++20 และ C++23
- เวลาในการเชื่อมโยงลดลงอย่างมากในตัวเชื่อมโยง LDD โดยการทำให้การสแกนการย้ายตำแหน่งที่อยู่ขนานกันและการดำเนินการเริ่มต้นส่วน เพิ่มการรองรับการบีบอัดส่วนโดยใช้อัลกอริทึม ZSTD
- ฟังก์ชันขั้นสูงที่ใช้กับมาตรฐาน C++20 ก็เน้นเช่นกัน
- จับลิงก์ที่มีโครงสร้างในฟังก์ชันแลมบ์ดา
- ตัวดำเนินการความเท่าเทียมกันภายในนิพจน์
- ความสามารถในการไม่ระบุคีย์เวิร์ด typename ในบางบริบท
- เพิ่มความสามารถในการเริ่มต้นระหว่างวงเล็บ ("Aggr(val1, val2)")
- ฟังก์ชันการใช้งานที่กำหนดไว้ในมาตรฐาน C++2b ในอนาคต
- รองรับประเภท char8_t
- ขยายช่วงของอักขระที่อนุญาตให้ใช้ใน "\N{…}",
- เพิ่มความสามารถในการใช้ตัวแปรที่ประกาศเป็น "static constexpr" ในฟังก์ชันที่ประกาศเป็น constexpr
- ฟังก์ชั่นการใช้งานที่กำหนดไว้ในมาตรฐาน C2x C ในอนาคต:
- เพิ่มการรองรับสำหรับการโหลดไฟล์การกำหนดค่าหลายไฟล์ (ไฟล์การกำหนดค่าเริ่มต้นจะถูกโหลดก่อน จากนั้นไฟล์ที่ระบุผ่านแฟล็ก “–config=” ซึ่งขณะนี้สามารถระบุได้หลายครั้ง)
- เปลี่ยนลำดับการโหลดของไฟล์กำหนดค่าเริ่มต้น: เสียงดังกราวพยายามโหลดไฟล์ก่อน - .cfg และหากหาไม่พบก็จะพยายามโหลดสองไฟล์ .cfg และ .cfg
- เพิ่มแฟล็กการสร้างใหม่ "-fcoro-aligned-allocation" สำหรับการกระจายการจัดแนวเฟรมแบบรูทีน
- เพิ่มแฟล็ก "-fmodule-output" เพื่อเปิดใช้งานโมเดลการสร้างเฟสเดียวของโมดูล C++ มาตรฐาน
- เพิ่มโหมด "-Rpass-analysis=stack-frame-layout" เพื่อวินิจฉัยปัญหาเกี่ยวกับเค้าโครงเฟรมสแต็ก
- เพิ่มแอตทริบิวต์ __attribute__((target_version("cpu_features"))) ใหม่และขยายการทำงานของแอตทริบิวต์ __attribute__((target_clones("cpu_features1″,"cpu_features2",...))) เพื่อเลือกเวอร์ชันเฉพาะของคุณลักษณะที่มีให้โดย CPU AArch64 .
- เครื่องมือวินิจฉัยขั้นสูง:
- เพิ่มคำเตือน "-Wsingle-bit-bitfield-constant-conversion" เพื่อจับการตัดทอนโดยปริยายเมื่อกำหนดหนึ่งบิตให้กับบิตฟิลด์ที่มีลายเซ็นหนึ่งบิต
- การวินิจฉัยเพิ่มเติมสำหรับตัวแปร constexpr ที่ไม่ได้กำหนดค่าเริ่มต้น
- เพิ่มคำเตือน "-Wcast-function-type-strict" และ "-Wincompatible-function-pointer-types-strict" เพื่อตรวจจับปัญหาที่อาจเกิดขึ้นเมื่อส่งประเภทฟังก์ชัน
ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติม คุณสามารถตรวจสอบรายละเอียดในไฟล์ ลิงค์ต่อไปนี้