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

پس از یک سال توسعه منتشر شد انتشار مجموعه ای رایگان از کامپایلرها GCC 10.1، اولین نسخه اصلی در شاخه جدید GCC 10.x. مطابق با طرح جدید شماره انتشار، نسخه 10.0 در فرآیند توسعه استفاده شد و اندکی قبل از انتشار GCC 10.1، شعبه GCC 11.0 قبلاً منشعب شده بود که بر اساس آن نسخه مهم بعدی GCC 11.1 تشکیل می شد.

GCC 10.1 به دلیل اجرای بسیاری از نوآوری ها در زبان C++ توسعه یافته برای استاندارد C++20، بهبودهای مربوط به استاندارد زبان C آینده (C2x)، بهینه سازی های جدید در پشتیبان کامپایلر و پشتیبانی آزمایشی قابل توجه است. حالت تحلیل استاتیکی. علاوه بر این، در طول آماده سازی یک شعبه جدید، پروژه مخزن را از SVN به Git منتقل کرد.

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

  • اضافه حالت تجربی تحلیل استاتیکی "فنالایزر"، که تجزیه و تحلیل بین رویه ای با منابع فشرده مسیرهای اجرای کد و جریان داده ها را در یک برنامه انجام می دهد. این حالت می‌تواند مشکلاتی را در مرحله کامپایل تشخیص دهد، مانند تماس‌های مضاعف به تابع free() برای یک ناحیه حافظه، نشت توصیفگر فایل، ارجاع‌زدایی و ارسال اشاره‌گرهای تهی، دسترسی به بلوک‌های حافظه آزاد شده، استفاده از مقادیر اولیه و غیره. استفاده از حالت جدید برای کد OpenSSL قبلاً امکان شناسایی را فراهم کرده است آسیب پذیری خطرناک.
  • بهینه سازی بین رویه ای بهبود یافته پاس IPA-SRA (Interprocedural Scalar Shared Replacement) برای کار در زمان اتصال مجدد طراحی شده است و از جمله موارد دیگر، اکنون مقادیر محاسبه شده و استفاده نشده را حذف می کند. در حالت بهینه سازی "-O2"، گزینه "-finline-functions" فعال است، که مجددا تنظیم می شود تا کد فشرده تر را به عملکرد اجرا ترجیح دهد. کار اکتشافی برای استقرار تابع درون خطی تسریع شده است. توسعه درون خطی و اکتشافی شبیه سازی تابع اکنون می تواند از اطلاعات مربوط به محدوده های ارزش برای پیش بینی اثربخشی تبدیل های فردی استفاده کند. برای C++، دقت تجزیه نام مستعار مبتنی بر نوع بهبود یافته است.
  • بهینه سازی زمان پیوند پیشرفته (LTO). فایل اجرایی جدید اضافه شد lto-dump برای بازنشانی اطلاعات مربوط به فایل های شی با بایت کد LTO. پاس‌های LTO موازی به‌طور خودکار تعداد کارهای ساخت همزمان در حال اجرا را تعیین می‌کنند و اگر نمی‌توان آن‌ها را تعیین کرد، از اطلاعات مربوط به تعداد هسته‌های CPU به عنوان عامل موازی‌سازی استفاده می‌کند. اضافه شدن قابلیت فشرده سازی بایت کد LTO با استفاده از الگوریتم zstd.
  • مکانیسم بهینه سازی بر اساس نتایج پروفایل کد (PGO - Profile-guided optimization) بهبود یافته است که بر اساس تجزیه و تحلیل ویژگی های اجرای کد کد بهینه تری تولید می کند. بهبود نگهداری پروفیل در حین کامپایل و جداسازی کدهای گرم/سرد. از طریق گزینه "-fprofile-values» اکنون می تواند تا 4 مقدار نمایه را نظارت کند، به عنوان مثال برای تماس های غیر مستقیم و ارائه اطلاعات پروفایل دقیق تر.
  • مشخصات برنامه نویسی موازی برای زبان های C، C++ و Fortran پیاده سازی شده است OpenACC 2.6، که ابزارهایی را برای تخلیه عملیات بر روی GPU و پردازنده های تخصصی مانند NVIDIA PTX تعریف می کند. اجرای استاندارد تقریباً کامل شده است MP 5.0 را باز کنید (Open Multi-Processing)، که API و روش‌های اعمال روش‌های برنامه‌نویسی موازی را بر روی سیستم‌های چند هسته‌ای و ترکیبی (CPU+GPU/DSP) با حافظه مشترک و واحدهای برداری (SIMD) تعریف می‌کند. ویژگی هایی مانند آخرین شرط های خصوصی، دستورات اسکن و حلقه، دستور و عبارت use_device_addr اضافه شده است. برای OpenMP و OpenACC، پشتیبانی از عملیات تخلیه بر روی پردازنده‌های گرافیکی نسل چهارم (فیجی) و نسل پنجم AMD Radeon (GCN) (VEGA 10/VEGA 20) اضافه شده است.
  • برای زبان‌های خانواده C، تابع «دسترسی» اضافه شده است تا دسترسی تابع به اشیاء ارسال شده توسط مرجع یا اشاره‌گر را توصیف کند و این اشیاء را با آرگومان‌های عدد صحیح حاوی اطلاعات مربوط به اندازه اشیاء مرتبط کند. برای کار در ارتباط با "access"، ویژگی "type" برای تشخیص دسترسی نادرست از توابع کاربر، به عنوان مثال، هنگام نوشتن مقادیر در ناحیه ای خارج از محدوده آرایه، پیاده سازی می شود. همچنین ویژگی "symver" برای مرتبط کردن نمادها در یک فایل ELF با شماره های نسخه خاص اضافه شده است.
  • هشدارهای جدید اضافه شد:
    • "-Wstring-compare" (فعال شده با "-Wextra") - در مورد وجود عباراتی هشدار می دهد که در آنها صفر با نتیجه فراخوانی توابع strcmp و strncmp مقایسه می شود که به دلیل این واقعیت که طول معادل یک ثابت است. یک آرگومان بزرگتر از اندازه آرایه در آرگومان دوم است.
    • "-Wzero-length-bounds" (فعال شده با "-Warray-bounds") - در مورد دسترسی به عناصر آرایه با طول صفر هشدار می دهد، که ممکن است منجر به بازنویسی داده های دیگر شود.
    • هشدارهای «-Warray-bounds»، «-Wformat-overflow»، «-Wrestrict»، «-Wreturn-local-addr» و «-Wstringop-overflow» برای افزایش تعداد موقعیت های خارج از محدوده گسترش یافته اند. که رسیدگی می شود.
  • قابلیت تعیین مستقیم نویسه‌های گسترده در شناسه‌ها را با استفاده از رمزگذاری فعلی (به‌طور پیش‌فرض UTF-8) به جای نماد UCN (\uNNNN یا \UNNNNNNNN) پیاده‌سازی کرد. مثلا:

    static const int π = 3;
    int get_naïve_pi() {
    بازگشت π;
    }

  • برای زبان C، بخشی از ویژگی‌های جدید توسعه‌یافته در استاندارد C2X پیاده‌سازی شده است (با تعیین -std=c2x و -std=gnu2x فعال می‌شود): پشتیبانی از نحو "[[]]" برای تعریف ویژگی‌ها مانند شکل ظاهر شده است. C++ (به عنوان مثال، [[gnu ::const]]، [[منسوخ شده]]، [[fallthrough]] و [[maybe_unused]]. اضافه شدن پشتیبانی از نحو "u8" برای تعریف ثابت ها با کاراکترهای UTF-8.
    ماکروهای جدید به . جایگزین های "%OB" و "%Ob" به strftime اضافه شد.

  • حالت پیش فرض برای C "-fno-common" است که امکان دسترسی کارآمدتر به متغیرهای سراسری را در برخی از پلتفرم ها فراهم می کند.
  • برای C++، حدود 16 تغییر و نوآوری در استاندارد C++20 ایجاد شده است. از جمله کلمه کلیدی اضافه شده "continit"
    و پشتیبانی از پسوندهای قالب اجرا شده است "مفاهیم". مفاهیم به شما امکان می دهد مجموعه ای از الزامات پارامتر الگو را تعریف کنید که در زمان کامپایل، مجموعه ای از آرگومان هایی را که می توان به عنوان پارامترهای الگو پذیرفت، محدود کرد. این مفاهیم را می توان برای جلوگیری از تناقضات منطقی بین خصوصیات انواع داده های مورد استفاده در قالب و ویژگی های نوع داده پارامترهای ورودی استفاده کرد.

  • G++ تشخیص رفتار تعریف نشده ناشی از تغییر اشیاء ثابت از طریق constexpr را فراهم می کند. کاهش مصرف حافظه توسط کامپایلر هنگام محاسبه constexpr. هشدارهای جدید "-Wmismatched-tags" و "-Wredundant-tags" اضافه شده است.
  • گزینه های خط فرمان جدیدی پیشنهاد شده است:
    • "-fallocation-dce" برای حذف جفت های غیر ضروری از عملگرهای "جدید" و "حذف".
    • "-fprofile-partial-training" برای غیرفعال کردن بهینه سازی اندازه برای کدهایی که دوره آموزشی ندارند.
    • "-fprofile-reproducible برای کنترل سطح تکرارپذیری پروفایل.
    • "-fprofile-prefix-path" برای تعریف دایرکتوری ساخت منبع پایه که برای تولید نمایه جداگانه استفاده می شود (برای "-fprofile-generate=profile_dir" و "-fprofile-use=profile_dir").
  • در متن هشدار برای گزینه های ذکر شده، هایپرلینک هایی ارائه شده است که به شما امکان می دهد به مستندات این گزینه ها بروید. جایگزینی URL با استفاده از گزینه "-fdiagnostics-urls" کنترل می شود.
  • اضافه شدن اپراتور پیش پردازنده "__ساخته شده است"، که می تواند برای بررسی توابع داخلی استفاده شود.
  • یک تابع داخلی جدید "__builtin_roundeven" با اجرای تابع گرد تعریف شده در مشخصات ISO/IEC TS 18661، شبیه به "گرد" اضافه شد، اما بخش گرد کردن بیشتر از 0.5 به بالا (به مقدار بزرگتر)، کمتر از 0.5 - پایین (به صفر) و برابر با 0.5 - با شروع از برابری رقم ماقبل آخر.
  • برای معماری AArch64، پشتیبانی از پسوند SVE2 اضافه شده است و پشتیبانی از SVE (افزونه برداری مقیاس پذیر) بهبود یافته است، از جمله پشتیبانی اضافه شده برای توابع و انواع SVE ACLE داخلی، و استفاده از برداری. پشتیبانی از LSE (Large System Extensions) و TME (Transactional Memory Extension) گسترش یافته است. دستورالعمل‌های جدید پیشنهاد شده در Armv8.5-A و Armv8.6-A اضافه شده است، از جمله دستورالعمل‌هایی برای تولید اعداد تصادفی، گرد کردن، اتصال برچسب حافظه،
    bfloat16 و ضرب ماتریس. پشتیبانی از پردازنده اضافه شد
    Arm Cortex-A77،
    Arm Cortex-A76AE،
    Arm Cortex-A65،
    Arm Cortex-A65AE،
    بازوی Cortex-A34 و
    Marvell ThunderX3.

  • پشتیبانی از ABI FDPIC (نشانگرهای عملکرد 32 بیتی) برای ARM64 اضافه شده است. طراحی مجدد و پردازش بهینه عملیات اعداد صحیح 64 بیتی. پشتیبانی از CPU اضافه شد
    Arm Cortex-A77،
    Arm Cortex-A76AE و
    بازوی Cortex-M35P. پشتیبانی گسترده از دستورالعمل های پردازش داده ACLE، از جمله SIMD 32 بیتی، ضرب 16 بیتی، محاسبات لچ و سایر بهینه سازی های الگوریتم DSP. پشتیبانی آزمایشی برای دستورالعمل‌های ACLE CDE (افزودن مسیر داده سفارشی) اضافه شد.

  • بهبود قابل توجهی در تولید کد و بردارسازی در باطن برای پردازنده‌های گرافیکی AMD بر اساس ریزمعماری GCN.
  • پشتیبانی از دستگاه های XMEGA مانند برای معماری AVR اضافه شده است
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATminy808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209, ATmega4808, 4809، ATmegaXNUMX، ATmegaXNUMX XNUMX، ATmegaXNUMX و ATmegaXNUMX.

  • یک پسوند معماری مجموعه دستورالعمل جدید Intel ENQCMD (-menqcmd) برای معماری های IA-32/x86-64 اضافه شده است. پشتیبانی اضافه شده برای اینتل Cooperlake (-march=cooperlake، شامل پسوند AVX512BF16 ISA) و Tigerlake (-march=tigerlake، شامل پسوندهای MOVDIRI، MOVDIR64B و AVX512VP2INTERSECT ISA) CPU.
  • اجرای HSAIL (زبان میانی معماری سیستم ناهمگن) برای سیستم های محاسباتی ناهمگن مبتنی بر معماری HSA منسوخ شده است و احتمالاً در نسخه بعدی حذف خواهد شد.

منبع: opennet.ru

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