کلنگ (کامپایلر)

کلنگ ، به عنوان فرانت اند کامپایلر برای C , C ++، زبان Objective-C و هدف- C ++ زبان‌های برنامه‌نویسی، و همچنین به عنوان کتابخانه، از OpenCL، از RenderScript، CUDA، و HIP چارچوب‌ها استفاده می‌شود. کلنگ به عنوان جایگزینی برای مجموعه کامپایلر گنو (GCC) عمل می‌کند و از اکثر پرچم‌های کامپایل و پسوندهای زبان غیررسمی پشتیبانی می‌کند.کلنگ شامل یک تحلیلگر استاتیک و چندین ابزار تجزیه و تحلیل کد است.

Clang به صورت پشت سر هم با کامپایلر LLVM عمل می‌کند و یک پروژه فرعی از LLVM 2.6 به بعد بوده‌است. همانند LLVM، این نرم‌افزار رایگان و منبع باز تحت مجوز نرم‌افزار Apache License 2.0 می‌باشد. شرکت‌هایی مانند Apple, Microsoft, Google, ARM, Sony, Intel, و AMD با کلنگ مشارکت داشته‌اند.

Clang 12، آخرین نسخه اصلی Clang از آوریل ۲۰۲۱، از تمام استانداردهای C++ منتشر شده تا C++17 پشتیبانی کامل دارد، اکثر ویژگی‌های C++20 را پیاده‌سازی می‌کند و پشتیبانی اولیه را برای استاندارد آینده C++23 اضافه می‌کند. از نسخه ۶٫۰٫۰، Clang C++ را با استفاده از گویش GNU++14 به‌طور پیش‌فرض کامپایل می‌کند، که شامل ویژگی‌هایی از استاندارد C++14 و پسوندهای مطابق با گنو است.

زمینه 
از سال ۲۰۰۵، شرکت اپل استفاده گسترده از LLVM را در چندین محصول تجاری، از جمله iOS SDK وXcode ۳٫۱ آغاز کرد. یکی از اولین استفاده‌های LLVM یک کامپایلر کد OpenGL برای OS X بود که تماس‌های OpenGL را به فراخوان‌های اساسی‌تر برای واحدهای پردازش گرافیکی (GPU) تبدیل می‌کند که از ویژگی‌های خاصی پشتیبانی نمی‌کنند. این به اپل این امکان را داد تا از OpenGL در رایانه‌هایی که از چیپ‌ست‌های GMA اینتل استفاده می‌کنند، پشتیبانی کند و عملکرد را در این دستگاه‌ها افزایش دهد.

پروژه LLVM در ابتدا برای استفاده از قسمت جلویی GCC در نظر گرفته شده بود. کد منبع GCC، با این حال، بزرگ و تا حدودی دست و پاگیر است. همان‌طور که یکی از توسعه دهندگان قدیمی GCC با اشاره به LLVM گفت: «تلاش برای رقص اسب آبی واقعاً سرگرم کننده نیست». علاوه بر این، نرم‌افزار اپل از Objective-C استفاده می‌کند که برای توسعه دهندگان GCC اولویت پایینی دارد. به این ترتیب، GCC به راحتی در محیط توسعه یکپارچه اپل (IDE) ادغام نمی‌شود. در نهایت، موافقت نامه مجوز GCC، مجوز عمومی عمومی GNU (GPL) نسخه ۳، از توسعه دهندگانی می‌خواهد که برنامه‌های افزودنی یا نسخه‌های اصلاح شده GCC را توزیع می‌کنند تا کد منبع خود را در دسترس قرار دهند، اما مجوز نرم‌افزار مجاز LLVM فاقد چنین مانعی است.

در پایان، اپل تصمیم گرفت Clang را توسعه دهد، یک کامپایلر جدید که از C, Objective-C و C++ پشتیبانی می‌کند. در جولای ۲۰۰۷، این پروژه مجوز متن باز شدن را دریافت کرد.

طرح 
Clang در پشته با LLVM کار می‌کند. ترکیب Clang و LLVM بیشتر زنجیره ابزار را برای جایگزینی پشته GCC فراهم می‌کند. یکی از اهداف اصلی Clang ارائه یک معماری مبتنی بر کتابخانه است، به طوری که کامپایلر بتواند با ابزارهای دیگری که با کد منبع تعامل دارند، مانند محیط‌های توسعه یکپارچه (IDE) همکاری کند. در مقابل، GCC در یک گردش کار کامپایل-لینک - اشکال زدایی کار می‌کند. ادغام آن با ابزارهای دیگر همیشه آسان نیست. برای مثال، GCC از مرحله‌ای به نام fold استفاده می‌کند که کلید فرایند کامپایل کلی است، که اثر جانبی ترجمه درخت کد به شکلی دارد که شبیه کد منبع اصلی نیست. اگر خطایی در حین یا بعد از مرحله فولد یافت شود، ترجمه آن به یک مکان در منبع اصلی ممکن است دشوار باشد. علاوه بر این، فروشندگانی که از پشته GCC در IDEها استفاده می‌کنند باید از ابزارهای جداگانه برای فهرست کردن کد استفاده کنند تا ویژگی‌هایی مانند برجسته سازی نحو و تکمیل کد هوشمند را ارائه دهند.

Clang اطلاعات بیشتری را در طول فرایند کامپایل نسبت به GCC حفظ می‌کند و شکل کلی کد اصلی را حفظ می‌کند و نگاشت خطاها را به منبع اصلی آسان‌تر می‌کند. گزارش‌های خطای Clang دقیق تر، خاص تر و قابل خواندن توسط ماشین هستند، بنابراین IDEها می‌توانند خروجی کامپایلر را فهرست کنند. طراحی ماژولار کامپایلر می‌تواند نمایه‌سازی کد منبع، بررسی نحو، و سایر ویژگی‌هایی را که معمولاً با سیستم‌های توسعه سریع برنامه مرتبط هستند ارائه دهد. درخت تجزیه همچنین برای پشتیبانی از بازآفرینی خودکار کد مناسب‌تر است، زیرا مستقیماً کد منبع اصلی را نشان می‌دهد.

Clang فقط زبان‌های شبیه به C مانند C, C++، Objective-C و Objective-C++ را کامپایل می‌کند. در بسیاری از موارد، Clang می‌تواند در صورت نیاز جایگزین GCC شود، بدون اینکه تأثیر دیگری بر روی زنجیره ابزار به‌عنوان یک کل داشته باشد. از اکثر گزینه‌های رایج GCC پشتیبانی می‌کند. پروژه Flang توسط Nvidia و The Portland Group پشتیبانی از Fortran را اضافه می‌کند. با این حال، برای سایر زبان‌ها، مانند Ada , LLVM همچنان به GCC یا یک کامپایلر دیگر وابسته است.

عملکرد و سازگاری GCC 
Clang با GCC سازگار است. رابط خط فرمان آن بسیاری از پرچم‌ها و گزینه‌های GCC را به اشتراک می‌گذارد. Clang بسیاری از پسوندهای زبان گنو و ذاتی کامپایلر را پیاده‌سازی می‌کند که برخی از آنها صرفاً برای سازگاری هستند. به عنوان مثال، کلنگ intrinsics اتمی که دقیقاً متناظر با C11 فیزیک هسته ای و همین‌طور لینوکس کتابخانه libstdc ++ در کلنگ، توسط جی‌سی‌سی ، __sync_* intrinsics برای سازگاری با GCC به انجام رسید. سازگاری ABI را با کد شی تولید شده توسط GCC حفظ می‌کند. در عمل، Clang جایگزینی برای GCC است.

هدف توسعه دهندگان Clang کاهش ردپای حافظه و افزایش سرعت کامپایل در مقایسه با کامپایلرهای رقیب مانند GCC است. در اکتبر ۲۰۰۷، آنها گزارش دادند که Clang کتابخانه‌های کربن را بیش از دو برابر سریعتر از GCC جمع‌آوری کرد، در حالی که از حدود یک ششم حافظه و فضای دیسک GCC استفاده می‌کرد. به نظر می‌رسد تا سال ۲۰۱۱، Clang این مزیت را در عملکرد کامپایلر حفظ کرده‌است. از اواسط سال ۲۰۱۴، Clang همچنان سریعتر از GCC در یک معیار زمان کامپایل ترکیبی و معیار عملکرد برنامه کامپایل می‌شود. با این حال، تا سال ۲۰۱۹، Clang در کامپایل هسته لینوکس به‌طور قابل توجهی کندتر از GCC است در حالی که در کامپایل LLVM کمی سریعتر باقی می‌ماند.

در حالی که Clang از لحاظ تاریخی در تدوین سریع‌تر از GCC بوده‌است، کیفیت خروجی عقب مانده‌است. از سال ۲۰۱۴، عملکرد برنامه‌های کامپایل‌شده با Clang از عملکرد برنامه‌های کامپایل‌شده توسط GCC عقب‌تر بود، که گاهی به دلیل فاکتورهای بزرگ (تا ۵٫۵ برابر)، که گزارش‌های قبلی از عملکرد کندتر را تکرار می‌کرد. هر دو کامپایلر از آن زمان به بعد تکامل یافته‌اند تا عملکرد خود را افزایش دهند، با کاهش فاصله:
 مقایسه در نوامبر ۲۰۱۶ بین GCC 4.8.2 در مقابل clang 3.4، در دسته بزرگی از فایل‌های آزمایشی نشان می‌دهد که GCC در کد منبع بهینه‌سازی شده تقریباً ۱۷ درصد بهتر از صدای صدا می‌زند. نتایج آزمون مختص کد هستند و کد منبع C بهینه نشده می‌تواند این تفاوت‌ها را معکوس کند؛ بنابراین این دو کامپایلر به‌طور کلی قابل مقایسه به نظر می‌رسند.
 مقایسه در سال ۲۰۱۹ در اینتل آیس لیک نشان داده‌است که برنامه‌های تولید شده توسط Clang 10 به ۹۶ درصد از عملکرد GCC 10 در ۴۱ معیار مختلف دست یافته‌اند (در حالی که برنده ۲۲ و از دست دادن ۱۹ مورد از آنها).

در سال ۲۰۲۱ معیاری برای مقایسه عملکرد LLVM 2.7 در مقابل LLVM 11 و زمان‌های کامپایل ایجاد شد. نتیجه این بود که LLVM 11 کامپایل کد با بهینه‌سازی‌ها ۲ برابر طول می‌کشد، و در نتیجه کدی تولید می‌کند که ۱۰ تا ۲۰ درصد سریع‌تر اجرا می‌شود (با گاه به گاه در هر جهت)، در مقایسه با LLVM 2.7 که بیش از ۱۰ سال قدمت دارد.

رابط 
libclang یک رابط از C ارائه می‌دهد که یک API نسبتاً کوچک ارائه می‌دهد. عملکردهای آن شامل: تجزیه کد منبع در یک AST، بارگیری ASTها، عبور از AST، مرتبط کردن مکان‌های منبع با عناصر درون AST است.

جستارهای وابسته 
 کامپایلر AMD Optimizing C/C++
 LLDB
 کامپایلر سی قابل حمل

منابع 

ابزارهای تحلیل ایستای برنامه
کامپایلرها و مفسرهای آزاد
کامپایلرهای سی++
کامپایلرهای سی
نرم‌افزارهای اپل
نرم‌افزارهای ۲۰۰۷ (میلادی)
نرم‌افزارهایی که از پروانه آپاچی استفاده می‌کنند