پس از یک سال توسعه منتشر شد انتشار مجموعه ای رایگان از کامپایلرها 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 است.
بهبودهایی در تولید کننده کد انجام شده است. به عنوان مثال، استفاده از استراتژی های مختلف برای گسترش عبارات سوئیچ (جدول پرش، تست بیت، درخت تصمیم) بسته به شرایط اجرا شده است. قابلیت تبدیل توابع خطی که شامل یک عبارت Switch با استفاده از بهینهسازی «-ftree-switch-conversion» هستند (به عنوان مثال، مجموعهای از شرایط مانند «مورد 2: how = 205؛ شکست؛ مورد 3: چگونه = 305؛ شکستن ;” به "100 * how + 5" تبدیل می شود.
بهینه سازی بین رویه ای بهبود یافته تنظیمات استقرار درون خطی برای پایگاه های کد C++ مدرن تطبیق داده شده و با پارامترهای جدید max-inline-insns-small، max-inline-insns-size، uninlined-function-insns، uninlined-function-time، uninlined-thunk-insns و uninlined گسترش یافته است. -زمان فکر. بهبود دقت و تهاجمی جداسازی کد سرد/گرم. مقیاس پذیری بهبود یافته برای بسیار بزرگ واحدهای ترجمه (به عنوان مثال، هنگام اعمال بهینه سازی در مرحله پیوند به برنامه های بزرگ).
مکانیسم بهینه سازی بر اساس نتایج پروفایل کد (PGO - Profile-guided optimization) بهبود یافته است که بر اساس تجزیه و تحلیل ویژگی های اجرای کد کد بهینه تری تولید می کند. گزینه خلاصه "-fprofile-use" اکنون شامل حالت های بهینه سازی "-fversion-loops-for-strides"، "-floop-interchange"، "-floop-unroll-and-jam" و "-ftree-loop-distribution" است. گنجاندن هیستوگرام با شمارنده در فایلها را حذف کرد، که باعث کاهش اندازه فایلهای دارای نمایه میشد (هیستوگرامها اکنون در هنگام انجام بهینهسازی در حین پیوند ایجاد میشوند).
بهینه سازی زمان پیوند پیشرفته (LTO). ساده سازی انواع قبل از تولید نتیجه ارائه شد که باعث شد تا اندازه فایل های شی LTO به میزان قابل توجهی کاهش یابد، مصرف حافظه در مرحله اتصال کاهش یابد و موازی سازی عملیات بهبود یابد. تعداد پارتیشن ها (پارتیشن های -param lto-) از 32 به 128 افزایش یافته است که باعث بهبود عملکرد در سیستم هایی با تعداد زیادی thread های CPU می شود. یک پارامتر برای کنترل تعداد فرآیندهای بهینه ساز اضافه شده است
"-param lto-max-streaming-parallelism";
در نتیجه، در مقایسه با GCC 8.3، بهینه سازی های معرفی شده در GCC 9 مجاز زمان کامپایل فایرفاکس 5 و لیبره آفیس 66 را حدود 6.2.3 درصد کاهش دهید. حجم فایل های شی 7 درصد کاهش یافت. زمان اتصال در یک CPU 8 هسته ای 11٪ کاهش یافته است. مرحله بهینه سازی متوالی مرحله پیوند اکنون 28٪ سریعتر است و 20٪ حافظه کمتری مصرف می کند. مصرف حافظه هر پردازنده مرحله موازی LTO 30٪ کاهش یافت.
بیشتر مشخصات برنامه نویسی موازی برای زبان های C، C++ و Fortran پیاده سازی شده است OpenACC 2.5که ابزارهایی را برای بارگذاری عملیات بر روی GPU ها و پردازنده های تخصصی مانند NVIDIA PTX تعریف می کند.
پشتیبانی جزئی از استاندارد برای C و C++ اجرا شده است MP 5.0 را باز کنید (Open Multi-Processing)، که API و روشهای اعمال روشهای برنامهنویسی موازی را برای زبانهای C، C++ و Fortran در سیستمهای چند هستهای و ترکیبی (CPU+GPU/DSP) با حافظه مشترک و واحدهای برداری (SIMD) تعریف میکند. ;
هشدارهای جدیدی برای زبان C اضافه شده است:-Waddress-of-packed- Member" (مقدار اشاره گر بدون تراز به یک عضو بسته از یک ساختار یا اتحادیه) و
«-مقدار مطلق" (هنگام دسترسی به توابع برای محاسبه یک مقدار مطلق، اگر تابع مناسب تری برای آرگومان مشخص شده وجود دارد، به عنوان مثال، باید به جای abs (3.14) از fabs(3.14) استفاده شود. هشدارهای جدید برای C++ اضافه شد: "-Wdeprecated-copy"،
"-Winit-list-lifetime"، "-Wredundant-move"، "-Wpessimizing-move" و "-Wclass-conversion". بسیاری از هشدارهای موجود قبلاً گسترش یافته اند.
پشتیبانی آزمایشی برای بخشی از استاندارد زبان C آینده با نام رمز C2x اضافه شد. برای فعال کردن پشتیبانی C2x، از گزینه های "-std=c2x" و "-std=gnu2x" (برای فعال کردن پسوندهای گنو) استفاده کنید. استاندارد هنوز در مرحله اولیه توسعه است، بنابراین، از قابلیت های آن، فقط عبارت _Static_assert با یک آرگومان پشتیبانی می شود (_Static_assert با دو آرگومان در C11 استاندارد شده است).
پشتیبانی از استاندارد C++17 پایدار اعلام شده است. در frontend، قابلیتهای زبان 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::pler، اضافه شد. , std::bind_front,
std::visit، std::is_constant_evaluated و std::assume_aligned، پشتیبانی از نوع char8_t را اضافه کرد، قابلیت بررسی پیشوند و پسوند رشته ها (شروع_با، پایان_با) را پیاده سازی کرد.
پشتیبانی از پردازنده های جدید 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" اضافه شده است.
این شامل یک Backend برای تولید کد برای GPU های AMD بر اساس ریزمعماری GCN است. این پیادهسازی در حال حاضر محدود به تلفیقی از برنامههای تک رشتهای است (پشتیبانی از انجام محاسبات چند رشتهای از طریق OpenMP و OpenACC بعداً ارائه خواهد شد) و پشتیبانی از GPU Fiji و Vega 10.
اضافه شدن باطن برای پردازنده ها C-SKY V2تولید شده توسط شرکت چینی به همین نام برای دستگاه های مصرفی مختلف;
تمام گزینه های خط فرمان که مقادیر بایت را اعمال می کنند، پسوندهای kb، KiB، MB، MiB، GB و GiB را پشتیبانی می کنند.
اجرا شد گزینه "-flive-patching=[inline-only-static|inline-clone]" به شما امکان می دهد تا به کامپایل ایمن برای سیستم های وصله زنده به دلیل کنترل چند سطحی بر استفاده از بین رویه ها (IPA) بهینه سازی؛
اضافه شدن گزینه "--completion" برای کنترل دقیق تکمیل گزینه هنگام استفاده از bash.
ابزارهای تشخیصی نمایشهایی از گزیدههای متن منبع را ارائه میدهند که شماره خط را نشان میدهد و اطلاعات مرتبط را به صورت بصری علامتگذاری میکند، مانند انواع عملوند. برای غیرفعال کردن نمایش شماره خطوط و برچسب ها، گزینه های "-fno-diagnostics-show-line-numbers" و "-fno-diagnostics-show-labels" ارائه شده است.
منبسط ابزارهایی برای تشخیص خطاها در کد ++C، بهبود خوانایی اطلاعات در مورد علل خطاها و برجسته کردن پارامترهای مشکل ساز.
گزینه "-fdiagnostics-format=json" اضافه شد که امکان تولید خروجی تشخیصی در قالب قابل خواندن ماشین (JSON) را فراهم می کند.
افزودن گزینه های پروفایل جدید "-fprofile-filter-files" و "-fprofile-exclude-files" برای انتخاب فایل های منبع برای پردازش.
AddressSanitizer کد تأیید فشرده تری را برای متغیرهای خودکار تولید می کند که مصرف حافظه فایل اجرایی در حال بررسی را کاهش می دهد.
خروجی بهبود یافته در "-fopt-info» (اطلاعات دقیق در مورد بهینه سازی های اضافه شده). اضافه شدن پیشوندهای جدید "بهینه شده" و "از دست رفته"، علاوه بر پیشوند قبلی "توجه". خروجی اطلاعات در مورد تصمیم گیری در بازگشایی درون خطی و برداری چرخه ها اضافه شده است.
گزینه "-fsave-optimization-record" اضافه شد، در صورت مشخص شدن، GCC فایل SRCFILE.opt-record.json.gz را با شرحی از تصمیمات در مورد استفاده از بهینه سازی های خاص ذخیره می کند. گزینه جدید با اضافه کردن ابرداده های اضافی، مانند اطلاعات مربوط به نمایه و زنجیره های درون خطی، با حالت "-fopt-info" متفاوت است.
گزینه های "-fipa-stack-alignment" و "-fipa-reference-addressable" برای کنترل تراز پشته و استفاده از حالت های آدرس دهی (فقط نوشتن یا خواندن دقیق) برای متغیرهای استاتیک در طول بهینه سازی های بین رویه ای اضافه شده است.
پشتیبانی کامل از ورودی/خروجی ناهمزمان برای زبان فرترن اجرا شده است.
پشتیبانی از پلتفرم های Solaris 10 (*-*-solaris2.10) و Cell/BE (Cell Broadband Engine SPU) منسوخ شده است و در نسخه اصلی بعدی حذف خواهد شد. پشتیبانی از معماری های Armv2، Armv3، Armv5 و Armv5E متوقف شده است. پشتیبانی از Intel MPX (برنامه های افزودنی حفاظت از حافظه) متوقف شده است.