پس از شش ماه توسعه، LLVM 22.1.0 منتشر شد. این نرمافزار ابزارهایی (کامپایلرها، بهینهسازها و مولدهای کد) را توسعه میدهد که برنامهها را به بیتکدهای میانی از دستورالعملهای مجازی شبیه RISC (یک ماشین مجازی سطح پایین با سیستم بهینهسازی چند سطحی) کامپایل میکنند. شبهکد تولید شده میتواند به کد ماشین برای یک پلتفرم هدف مشخص تبدیل شود یا توسط یک کامپایلر just-in-time (JIT) برای تولید مستقیم دستورالعملهای ماشین در حین اجرای برنامه استفاده شود. بر اساس فناوریهای LLVM، این پروژه در حال توسعه کامپایلر Clang است که از زبانهای برنامهنویسی C، C++ و Objective-C پشتیبانی میکند. با شروع از شاخه 18.x، این پروژه به یک طرح شمارهگذاری نسخه جدید روی آورد که طبق آن نسخه 0 ("N.0") در طول توسعه استفاده میشود و اولین نسخه پایدار با شماره "N.1" شمارهگذاری میشود.
بهبودهای Clang 22 عبارتند از:
- پشتیبانی از توکنهای تخصیص حافظه (Allocation Tokens) برای علامتگذاری عملیات تخصیص حافظه که با استفاده از توابعی مانند malloc انجام میشوند، با یک شناسه منحصر به فرد اضافه شده است. توکنهای تخصیص امکان ساختاردهی اطلاعات هیپ، سادهسازی تشخیص نشت حافظه و فعالسازی گروهبندی اشیاء بر اساس هدف یا الگوهای اصلاح آنها (مثلاً جداسازی دادههای "داغ" از "سرد") را فراهم میکنند. برای فعالسازی، از پرچم "-fsanitize=alloc-token" استفاده کنید.
- ویژگیهای مرتبط با زبان C:
- پیشنویس مشخصاتی که مکانیزم اجرای به تعویق افتادهی «defer» را تعریف میکند، پیادهسازی شده است که امکان اجرای اقدامات را هنگام خروج از محدودهی فعلی فراهم میکند. پرچم «-fdefer-ts» برای فعال کردن پشتیبانی از «defer» اضافه شده است.
- تابع داخلی __builtin_stack_address() اضافه شده است که عملکرد مشابه در GCC را منعکس میکند. این تابع آدرس پشته را برمیگرداند و ناحیه پشته تابع فعلی که __builtin_stack_address() را فراخوانی کرده و توابع بعدی که فراخوانی میکند را جدا میکند.
- قابلیتهای در حال توسعه برای استاندارد آینده C2y:
- پشتیبانی از حلقههای نامگذاریشده اضافه شده است که به شما امکان میدهد نامهایی را به حلقهها و دستورات switch اختصاص دهید، که میتوانند در دستورات break و continue برای تعریف صریح حلقهای که باید از آن خارج شوید، مشخص شوند. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // go to CONT1 continue outer; // go to CONT2 // CONT1 } // CONT2 }
- پیادهسازی ماکروی داخلی "__COUNTER__" که برای تولید نامهای شناسه منحصر به فرد طراحی شده است، گسترش یافته و در استاندارد گنجانده شده است. محدودیت ۲۱۴۷۴۸۳۶۴۷ فراخوانی برای این ماکرو تعیین شده است؛ تجاوز از این محدودیت باعث ایجاد خطا خواهد شد.
- هشدار (-Wstatic-in-inline) هنگام استفاده از توابع یا متغیرهای استاتیک درون توابع تعریف شده به صورت "extern inline" حذف شد.
- قابلیتهای تعریفشده در استاندارد C23 C:
- فایل هدر float.h اکنون از ماکروهای FLT_SNAN، DBL_SNAN و LDBL_SNAN پشتیبانی میکند که مقادیر NaN علامتگذاری شده (که در صورت استفاده در عملیات حسابی باعث ایجاد استثنا میشود) را برای انواع float، double و long double پیادهسازی میکنند.
- اشکالی که باعث میشد انواع مختلف بدون نام، در صورت داشتن فیلدهای یکسان، در یک واحد ترجمه یکسان، سازگار تلقی شوند، برطرف شد.
- پرچم "-MG" که برای نادیده گرفتن فایلهای هدر مفقود شده در طول اسکن وابستگی استفاده میشد، به دستورالعملهای "#embed" نیز گسترش یافته است و اکنون خطای "فایل یافت نشد" را هنگامی که فایل مشخص شده در دستورالعمل "#embed" مفقود شده باشد، سرکوب میکند.
- ویژگیهای مرتبط با ++C:
- قابلیت استفاده از اتصالات ساختاریافته در زمینه "constexpr"، همانطور که در مشخصات C++2c (C++26) توسعه داده شده است، اضافه شده است. این بدان معناست که ارجاعات به عبارات ثابت اکنون میتوانند خودشان عبارات ثابت باشند. پشتیبانی برای آرایهها و ساختارهای ساده پیادهسازی شده است (tuples هنوز پشتیبانی نمیشوند). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- طبق استاندارد C++20، محدودیتها اکنون قبل از بررسی به فرم استاندارد تبدیل میشوند که امکان پیامهای تشخیصی دقیقتر و مدیریت صحیح خطاهای جایگزینی در آرگومانهای قالبی که فقط در شناسههای مفهوم استفاده میشوند را فراهم میکند.
- خانوادهای از توابع توکار "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" اضافه شد تا مشخص شود که آیا عملگرهای مقایسهای "<"، ">"، "<=" و ">=" از عملگر "<=>" ساخته شدهاند یا خیر.
- پارامتر "-Wincompatible-pointer-types" تغییر کرده است تا به جای هشدار، خطا نمایش دهد. برای بازگشت به رفتار قبلی، از گزینه "-Wno-error=incompatible-pointer-types" استفاده کنید.
- توابع داخلی __builtin_bswapg، __builtin_elementwise_ldexp، __builtin_elementwise_fshl، __builtin_elementwise_fshr، __builtin_elementwise_minnum، __builtin_elementwise_maxnum، __builtin_masked_load، __builtin_masked_expand_load، __builtin_masked_store، __builtin_masked_compress_store، __builtin_masked_gather، __builtin_masked_scatter و __builtin_dedup_pack اضافه شده است. به عنوان مثال، builtin_dedup_pack به شما امکان میدهد موارد تکراری را از لیستی از انواع حذف کنید: با استفاده از MyTypeList = TypeList<__builtin_dedup_pack …>; // نوع حاصل TypeList خواهد بود
- هنگام اشکالزدایی رفتار نامشخص با UBSan (-fsanitize=undefined -fsanitize-trap=undefined)، اطلاعات علت خطا اکنون در اطلاعات اشکالزدایی تولید شده گنجانده میشود. پرچم "-fsanitize-debug-trap-reasons" برای مشخص کردن سطح جزئیات در اطلاعات خطا اضافه شده است. میتوان آن را برای توضیحات کلی روی "basic" و برای اطلاعات دقیق روی "detailed" تنظیم کرد (مثلاً "signed integer addition overflowed in 'a + b'").
- پرچم های کامپایلر جدید اضافه شد:
- برای کنترل اینکه آیا دلایل تله استثنا هنگام کامپایل با حالت "-fsanitize-trap" در اطلاعات اشکالزدایی تعبیه شده است یا خیر، از "-fsanitize-trap" استفاده کنید.
- برای مدیریت توکنهای تخصیص حافظه، از دستورهای "-fsanitize=alloc-token"، "-falloc-token-max"، "-fsanitize-alloc-token-fast-abi" و "-fsanitize-alloc-token-extended" استفاده کنید.
- "-fmatrix-memory-layout" برای کنترل چیدمان حافظه انواع ماتریس (مثلاً column-major برای column-major، row-major برای row-major).
- توابع اکنون دارای یک ویژگی "malloc_span" هستند، مشابه ویژگی malloc اما قابل اجرا برای توابعی که ساختارهای span مانندی را برمیگردانند که شامل یک اشارهگر و یک فیلد با اندازه یا یک اشارهگر به انتهای بلوک است.
- ویژگی "modular_format" اضافه شد تا به صورت پویا پیادهسازی مورد نیاز برای پیوند استاتیک تابع printf را در زمان پیوند انتخاب کند.
- ابزارهای تحلیل تشخیصی و استاتیک گسترش یافتهاند، بررسیهای جدیدی اضافه شدهاند (چندین بهبود مرتبط با تشخیص).
- ویژگیهای ذاتی بیشتری برای افزونههای SSE، AVX و AVX512 به پشت صحنه X86 اضافه شده است. حالتهای ساخت برای پردازندههای اینتل مبتنی بر ریزمعماریهای Wildcat Lake (-march=wildcatlake) و Nova Lake (-march=novalake) اضافه شده است.
- بکاند AArch64 اکنون از پردازندههای Ampere Computing Ampere1C (ampere1c)، Arm C1-Nano (c1-nano)، Arm C1-Pro (c1-pro)، Arm C1-Premium (c1-premium) و Arm C1-Ultra (c1-ultra) پشتیبانی میکند. توابع داخلی اضافی برای دستورالعملهای FCVTZ[US]، FCVTN[US]، FCVTM[US]، FCVTP[US] و FCVTA[US] اضافه شده است. پشتیبانی از چند نسخهای کردن توابع (FMV) تثبیت شده است. کاربران اکنون میتوانند اولویت نسخههای مختلف توابع را لغو کنند.
- پشتیبانی از معماری LoongArch32 (LA32R، LA32S) اضافه شد.
- بهبود بکاندها برای معماریهای ARM، AMDGPU، RISC-V، LoongArch64، MIPS، WebAssembly و PowerPC.
منبع: opennet.ru
