انتشار مجموعه کامپایلر GCC 15

پس از یک سال توسعه، مجموعه رایگان کامپایلر GCC GCC 15.1 منتشر شد که اولین نسخه اصلی در شاخه جدید GCC 15.x است. طبق طرح شماره گذاری انتشار، نسخه 15.0 در طول توسعه استفاده شد و کمی قبل از انتشار GCC 15.1، شاخه ای از GCC 16.0 قبلاً فورک شده بود، که اساس نسخه اصلی بعدی، GCC 16.1 را تشکیل خواهد داد.

تغییرات اصلی:

  • هنگام کامپایل برنامه های C، استاندارد C23 (Change Summary) با پسوندهای گنو ("-std=gnu23") به طور پیش فرض استفاده می شود. قبلاً استاندارد C17 به طور پیش فرض استفاده می شد (-std=gnu17). این تغییر به طور بالقوه می تواند به دلیل درج ثابت nullptr، نوع _BitInt(n) و کلمات کلیدی bool، true و false مشکلاتی را در هنگام ساخت پروژه های موجود ایجاد کند که می تواند با شناسه هایی با نام مشابه تعریف شده در برنامه ها در تضاد باشد.
  • قابلیت های زیر استاندارد C23 پیاده سازی شده است:
    • دستورالعمل "#embed" برای جاسازی منابع باینری در کد طراحی شده است.
    • ویژگی "unsequenced" که نشان می دهد نتیجه به ترتیب اجرا بستگی ندارد.
    • ویژگی "تکرار پذیر" نشان می دهد که تابع همیشه با همان ورودی یک نتیجه را برمی گرداند، یعنی به عوامل دیگر بستگی ندارد.
  • عناصر استاندارد C2Y آینده پیاده سازی شده اند (-std=c2y و -std=gnu2y):
    • امکان تعریف متغیرها در یک عبارت «if»، مانند «if (int x = get ()) {...}».
    • پشتیبانی از نامگذاری حلقه ها برای ارجاع به آنها در کد. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // پرش به CONT1 مورد 2: break outer; // به CONT2 می پرد } // CONT1 } // CONT2
    • پشتیبانی از تعیین محدوده مقادیر صحیح در عبارات case، مانند "case 1...10:".
    • پسوندهای "i" و "j" برای نشان دادن قسمت خیالی در اعداد مختلط.
    • امکان استفاده از عملگرهای «++» و «—» با اعداد مختلط.
    • ساختار "_Generic(type, expr1, expr2,…)" برای انتخاب یک عبارت بر اساس نوع عملوند.
    • پشتیبانی از دسترسی به آرایه های بایت مانند سایر انواع شی، مانند ساختارها و اتحادیه ها.
    • پشتیبانی از اعمال عملگر "alignof" برای آرایه های ناقص (آرایه هایی که بدون تعیین اندازه اعلام شده اند، مانند "int a[]").
    • دستور جدیدی برای توالی های فرار از کاراکترهای هشتگانه، هگزا دسیمال و جهانی اضافه شده است. به جای «\u»، «\x» و «\nn»، دنباله‌های «\u{}»، «\o{}» و «\x{}» پیشنهاد شده‌اند که در آن‌ها می‌توان هر تعداد رقم را مشخص کرد.
    • توابع داخلی "__builtin_stdc_rotate_left" و "__builtin_stdc_rotate_right".
    • عملیات با طول صفر روی نشانگرهای NULL مجاز است (به عنوان مثال "sizeof(*p)").
  • فرانت‌اند برای زبان C++ ویژگی‌هایی را پیاده‌سازی می‌کند که برای استاندارد آینده C++26 در حال توسعه هستند:
    • عملگر متغیر "دوست" ("دوست Ts...").
    • توانایی استفاده از کلمه کلیدی constexpr با تغییری از عملگر جدید (قرار دادن جدید) برای قرار دادن یک شی در حافظه از پیش تخصیص داده شده در زمان کامپایل.
    • خروجی خطا هنگام حذف اشاره گر به نوع ناقص.
    • نحو برای تعریف پارامترهای متغیر با بیضی بدون کامای قبلی (به عنوان مثال، هنگام تعیین "void e(int…)" به جای "void e(int,…)") منسوخ شده است.
    • نمایه سازی بسته پارامتر در قالب ها.
    • ویژگی‌های پیوندهای ساختاریافته؛
    • نحو '= حذف ("دلیل")';
    • گنجاندن "@"، "$" و "`" در مجموعه کاراکترهای اصلی.
    • استفاده از ماکروها برای اعلام ماژول ها ممنوع است.
    • امکان استفاده از binding ساختاریافته به عنوان شرط در دستورات if و switch.
    • پشتیبانی از مقایسه مستقیم آرایه (به عنوان مثال "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") متوقف شده است.
    • مکانیسم "#embed" برای جاسازی منابع باینری.
    • کلاس قالب is_trivial منسوخ شده است.
  • اضافه شدن ویژگی های C++23:
    • برخی از کاربردهای دستورالعمل "صادرات" را مجاز نکنید و استفاده از "صادرات {}" را مجاز کنید.
    • پشتیبانی از افزایش طول عمر اشیاء موقت در حلقه هایی که در محدوده ها تکرار می شوند.
  • کتابخانه libstdc++ پشتیبانی آزمایشی را برای ماژول های std و std.compat پیاده سازی می کند.
  • استفاده از مقداردهی اولیه "{0}" برای اتحادیه ها در کد C و C++ دیگر تضمین نمی کند که همه محتویات پاک شوند، اما در عوض منجر به صفر شدن اولین عنصر اتحادیه می شود. برای پاک کردن کل اتحادیه، از عبارت "{}" تعریف شده در مشخصات C23 استفاده کنید، یا گزینه "-fzero-init-padding-bits=unions" را برای بازیابی رفتار قدیمی مشخص کنید.
  • پشتیبانی از ویژگی "musttail" ([[gnu::musttail]] و [[clang::musttail]]) برای تماس‌های دم تضمین شده. این ویژگی برای عبارات بازگشتی اعمال می‌شود که یک فراخوانی بازگشتی به تابع فعلی برقرار می‌کند و تضمین می‌کند که چنین تماسی از tail recursion استفاده می‌کند، که حافظه اضافی را در پشته تخصیص نمی‌دهد (خطر تمام شدن حافظه با تعداد بسیار زیادی تماس را از بین می‌برد).
  • پشتیبانی پیاده‌سازی شده از ویژگی flag_enum ([[gnu::flag_enum]] و [[clang::flag_enum]]) برای شمارش‌ها اعمال می‌شود تا نشان دهد که محتویات در عملیات بیتی استفاده می‌شوند (از هشدارها در حالت -Wswitch جلوگیری می‌کند).
  • پشتیبانی از ویژگی "counted_by" اضافه شده است، که می تواند برای تعیین یک فیلد در یک ساختار با یک آرایه انعطاف پذیر که تعداد عناصر را تعیین می کند، استفاده شود. این ویژگی می تواند برای بهبود کارایی بررسی های سرریز بافر استفاده شود.
  • ویژگی "nonnull_if_nonzero" به توابع اضافه شده است، که مشخص می کند برخی از پارامترهای تابع با اشاره گر فقط در صورتی می توانند NULL باشند که پارامتر دیگری صفر باشد.
  • اسمبلر توسعه یافته با توابع خارجی "asm(….)" مجاز است. در درج‌های اسمبلر، امکان بازنویسی حافظه در ناحیه قرمز پشته (ناحیه بالای پشته) وجود دارد.
  • کامپایل کد ++C به لطف هش قالب بهبود یافته سریعتر است.
  • بهینه سازی های جدید اضافه شده است. پشتیبانی برای حلقه‌های برداری که حاوی کدهایی برای خروج زودهنگام هستند (مثلاً از طریق یک شکست یا تماس برگشت) پیاده‌سازی شده است، حتی اگر چنین حلقه‌هایی آرایه‌ها یا بافرهایی را که به‌صورت پویا تخصیص داده شده‌اند دستکاری کنند که اندازه آنها در زمان کامپایل ناشناخته است. هنگامی که گزینه -O2 مشخص می شود، برداری از برخی از حلقه های به راحتی قابل برداری که اطلاعات tripcount برای آنها در دسترس نیست فعال می شود.
  • حالت بهینه سازی افزایشی در مرحله پیوند اضافه شده است (LTO، Link-Time Optimization)، که به طور قابل توجهی زمان کامپایل مجدد را هنگام استفاده از LTO در شرایطی که تغییرات جزئی در کد ایجاد شده است کاهش می دهد (یک تابع ویرایش شده است). برای فعال کردن حالت افزایشی، گزینه "-flto-incremental" پیشنهاد شده است.
  • کامپایل بهبود یافته از فایل های ورودی بسیار بزرگ. ردیابی شماره ستون های بیشتر از 4096. بهبود دقت در نشان دادن محل خطاها و هشدارها در فایل های بسیار بزرگ.
  • بهبود دید گزارش ها هنگام تشخیص مشکلات. به عنوان مثال، محل مشکل با نماد "⚠️" برجسته می شود، طرح خروجی برای خطاها در قالب های ++C تغییر کرده است، نکاتی برای ساده کردن انتقال به استاندارد C23 اضافه شده است، و طرح رنگ دوباره طراحی شده است. اضافه شدن قابلیت خروجی عیب یابی با فرمت Sarif (-fdiagnostics-format=sarif-file).
  • کتابخانه libgdiagnostics پیاده‌سازی شده است و به شما امکان می‌دهد قابلیت‌های GCC مربوط به طراحی پیام‌های تشخیصی را در پروژه‌های خود ادغام کنید (برای مثال، می‌توانید از نکات نقل‌قول، برجسته‌سازی و اصلاح استفاده کنید).
  • اخطارهای "-Wtrailing-Whitespace" و "-Wleading-Whitespace" برای تشخیص فضای خالی باقیمانده در انتهای خطوط و فضای خالی اضافی در ابتدای خطوط اضافه شده است.
  • اخطار "-Wheader-guard" برای گزارش مشکلات در ماکروهای محافظ سرصفحه که از اضافه شدن مجدد فایل هدر جلوگیری می کند، اضافه شده است.
  • قسمت جلویی زبان D به نسخه 2.111.0 به روز شده است.
  • پشتیبانی از اعداد صحیح بدون علامت به frontend Fortran اضافه شده است.
  • این بسته شامل یک کامپایلر برای زبان کوبول، gcobol، است که از پلتفرم‌های x86-64 و AArch64 پشتیبانی می‌کند و برای استفاده در سیستم‌های ۳۲ بیتی طراحی نشده است. این کامپایلر مشخصات ISO/IEC 32:1989 را پیاده‌سازی کرده و اکثر آزمون‌های NIST CCVS/2023 را با موفقیت پشت سر گذاشته است.
  • اجرای استانداردهای OpenMP 5.0، 5.1، 5.2 و 6.0 (Open Multi-Processing)، تعریف API و روش های اعمال روش های برنامه نویسی موازی بر روی سیستم های چند هسته ای و هیبریدی (CPU+GPU/DSP) با حافظه مشترک و واحدهای برداری (SIMD)، ادامه یافته است. اضافه شدن پشتیبانی از metadirective ها و سازه های کاشی، باز کردن، interop و dispatch. برای برخی از پردازنده های گرافیکی AMD و NVIDIA، پشتیبانی از حافظه مشترک یکپارچه اضافه شده است (با مشخص کردن unified_shared_memory در دستورالعمل "نیازها" فعال می شود). پشتیبانی از عبارت "self_maps" اضافه شده است.
  • باطن معماری AArch64 برای پشتیبانی از پلتفرم MinGW (aarch64-w64-mingw32) به روز شده است. بیش از 20 افزونه ARM8 پیاده سازی شده است و پشتیبانی از پسوند ACLE (برنامه های افزودنی زبان Arm C) بهبود یافته است. بهبودهای متعددی در تولید کننده کد انجام شده است. پشتیبانی از CPU اضافه شده:
    • Apple A12 (apple-a12)
    • Apple M1 (apple-m1)
    • Apple M2 (apple-m2)
    • Apple M3 (apple-m3)
    • Arm Cortex-A520AE (cortex-a520ae)
    • Arm Cortex-A720AE (cortex-a720ae)
    • Arm Cortex-A725 (cortex-a725)
    • Arm Cortex-R82AE (cortex-r82ae)
    • Arm Cortex-X925 (cortex-x925)
    • Arm Neoverse N3 (neoverse-n3)
    • Arm Neoverse V3 (neoverse-v3)
    • Arm Neoverse V3AE (neoverse-v3ae)
    • فوجیتسو-موناکا (fujitsu-monaka)
    • NVIDIA Grace
    • NVIDIA Olympus (olympus)
    • Qualcomm Oryon-1 (Oryon-1)
  • پشتیبان تولید کد AMD Radeon GPU (GCN) برای پشتیبانی از کتابخانه libstdc++ و پشتیبانی از تولید کد آزمایشی برای سری دستگاه‌های gfx9-generic، gfx10-3-generic و gfx11-generic اضافه شده است.
  • پشتیبان x86 اکنون از پسوندهای معماری مجموعه دستورالعمل های اینتل AVX10.2، AMX-AVX512، AMX-FP8، AMX-MOVRS، AMX-TF32، AMX-TRANSPOSE، MOVRS پشتیبانی می کند. پشتیبانی از پردازنده های Intel Diamond Rapids و Xeon Phi اضافه شده است.
  • قابلیت‌های بک‌اند گسترده برای پلتفرم‌های LoongArch و AVR.
  • پشتیبانی از معماری هدف nios2 که در پردازنده‌های Nios II استفاده می‌شد، حذف شد. پشتیبانی از ILP32 ABI (-mabi=ilp32) در پورت AArch64 منسوخ شده است و در نسخه اصلی بعدی حذف خواهد شد.

منبع: opennet.ru

اضافه کردن نظر