کلنگ (کامپایلر)
کلنگ ، به عنوان فرانت اند کامپایلر برای 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 از آوریل 2021، از تمام استانداردهای C++ منتشر شده تا C++17 پشتیبانی کامل دارد، اکثر ویژگی‌های C++20 را پیاده‌سازی می‌کند و پشتیبانی اولیه را برای استاندارد آینده C++23 اضافه می‌کند. از نسخه 6.0.0، Clang C++ را با استفاده از گویش GNU++14 به طور پیش‌فرض کامپایل می‌کند، که شامل ویژگی‌هایی از استاندارد C++14 و پسوندهای مطابق با گنو است.
از سال 2005، شرکت اپل استفاده گسترده از LLVM را در چندین محصول تجاری، از جمله iOS SDK وXcode 3.1 آغاز کرد. یکی از اولین استفاده‌های LLVM یک کامپایلر کد OpenGL برای OS X بود که تماس‌های OpenGL را به فراخوان‌های اساسی‌تر برای واحدهای پردازش گرافیکی (GPU) تبدیل می‌کند که از ویژگی‌های خاصی پشتیبانی نمی‌کنند. این به اپل این امکان را داد تا از OpenGL در رایانه‌هایی که از چیپ‌ست‌های GMA اینتل استفاده می‌کنند، پشتیبانی کند و عملکرد را در این دستگاه‌ها افزایش دهد.
پروژه LLVM در ابتدا برای استفاده از قسمت جلویی GCC در نظر گرفته شده بود. کد منبع GCC، با این حال، بزرگ و تا حدودی دست و پا گیر است. همانطور که یکی از توسعه دهندگان قدیمی شورای همکاری خلیج فارس با اشاره به LLVM گفت: "تلاش برای رقص اسب آبی واقعاً سرگرم کننده نیست". علاوه بر این، نرم افزار اپل از Objective-C استفاده میکند که برای توسعه دهندگان GCC اولویت پایینی دارد. به این ترتیب، GCC به راحتی در محیط توسعه یکپارچه اپل (IDE) ادغام نمی شود. در نهایت، موافقت نامه مجوز GCC، مجوز عمومی عمومی GNU (GPL) نسخه 3 ، از توسعه دهندگانی می خواهد که برنامه های افزودنی یا نسخه های اصلاح شده GCC را توزیع می کنند تا کد منبع خود را در دسترس قرار دهند ، اما مجوز نرم افزار مجاز LLVM فاقد چنین مانعی است.
در پایان، اپل تصمیم گرفت Clang را توسعه دهد، یک کامپایلر جدید که از C، Objective-C و C++ پشتیبانی می کند. در جولای 2007، این پروژه مجوز متن باز شدن را دریافت کرد.
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 یا یک کامپایلر دیگر وابسته است.
Clang با GCC سازگار است. رابط خط فرمان آن بسیاری از پرچم‌ها و گزینه‌های GCC را به اشتراک می‌گذارد. Clang بسیاری از پسوندهای زبان گنو و ذاتی کامپایلر را پیاده سازی می کند که برخی از آنها صرفاً برای سازگاری هستند. به عنوان مثال، کلنگ intrinsics اتمی که دقیقا متناظر با C11 فیزیک هسته ای و همینطور لینوکس کتابخانه libstdc ++ در کلنگ، توسط شورای همکاری خلیج فارس codice_1 intrinsics برای سازگاری با شورای همکاری خلیج فارس به انجام رسید . سازگاری ABI را با کد شی تولید شده توسط GCC حفظ می کند. در عمل، Clang جایگزینی برای GCC است.
هدف توسعه دهندگان Clang کاهش ردپای حافظه و افزایش سرعت کامپایل در مقایسه با کامپایلرهای رقیب مانند GCC است. در اکتبر 2007، آنها گزارش دادند که Clang کتابخانه های کربن را بیش از دو برابر سریعتر از GCC جمع آوری کرد، در حالی که از حدود یک ششم حافظه و فضای دیسک GCC استفاده می کرد. به نظر می رسد تا سال 2011، Clang این مزیت را در عملکرد کامپایلر حفظ کرده است. از اواسط سال 2014، Clang همچنان سریعتر از GCC در یک معیار زمان کامپایل ترکیبی و معیار عملکرد برنامه کامپایل می شود. با این حال، تا سال 2019، Clang در کامپایل هسته لینوکس به طور قابل توجهی کندتر از GCC است در حالی که در کامپایل LLVM کمی سریعتر باقی می ماند.
در حالی که Clang از لحاظ تاریخی در تدوین سریعتر از GCC بوده است، کیفیت خروجی عقب مانده است. از سال 2014، عملکرد برنامه‌های کامپایل‌شده با Clang از عملکرد برنامه‌های کامپایل‌شده توسط GCC عقب‌تر بود، که گاهی اوقات به دلیل فاکتورهای بزرگ (تا 5.5 برابر)، که گزارش‌های قبلی از عملکرد کندتر را تکرار می‌کرد. هر دو کامپایلر از آن زمان به بعد تکامل یافته اند تا عملکرد خود را افزایش دهند، با کاهش فاصله:در سال 2021 معیاری برای مقایسه عملکرد LLVM 2.7 در مقابل LLVM 11 و زمان های کامپایل ایجاد شد. نتیجه این بود که LLVM 11 کامپایل کد با بهینه‌سازی‌ها 2 برابر طول می‌کشد، و در نتیجه کدی تولید می‌کند که 10 تا 20 درصد سریع‌تر اجرا می‌شود (با گاه به گاه در هر جهت)، در مقایسه با LLVM 2.7 که بیش از 10 سال قدمت دارد.
libclang یک رابط از C ارائه می دهد که یک API نسبتاً کوچک ارائه می دهد. عملکردهای آن شامل: تجزیه کد منبع در یک AST، بارگیری AST ها، عبور از AST، مرتبط کردن مکان های منبع با عناصر درون AST است.