موضوع مقاله: سی‌لنگ (کامپایلر) | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # سی‌لنگ (کامپایلر) | مقدمه: سی‌لنگ به عنوان جایگزینی برای مجموعه کامپایلر گنو (GCC) عمل می‌کند و از اکثر پرچم‌های کامپایل و پسوندهای زبان غیررسمی پشتیبانی می‌کند. | ## بخش 1: سی‌لنگ (کامپایلر) | همانند LLVM، این نرم‌افزار آزاد و منبع باز تحت مجوز نرم‌افزار مجوز آپاچی ۲٫۰ است. سی‌لنگ ۱۲، آخرین نسخه اصلی سی‌لنگ از آوریل ۲۰۲۱، از تمام استانداردهای C++ منتشر شده تا C++17 پشتیبانی کامل دارد، اکثر ویژگی‌های C++20 را پیاده‌سازی می‌کند و پشتیبانی اولیه را برای استاندارد آینده C++23 اضافه می‌کند. از نسخه ۶٫۰٫۰، Clang C++ را با استفاده از گویش GNU++14 به‌طور پیش‌فرض کامپایل می‌کند، که شامل ویژگی‌هایی از استاندارد C++14 و پسوندهای مطابق با گنو است. این به اپل این امکان را داد تا از OpenGL در رایانه‌هایی که از چیپ‌ست‌های GMA اینتل استفاده می‌کنند، پشتیبانی کند و عملکرد را در این دستگاه‌ها افزایش دهد. همان‌طور که یکی از توسعه دهندگان قدیمی GCC با اشاره به LLVM گفت: «تلاش برای رقص اسب آبی واقعاً سرگرم کننده نیست». در نهایت، موافقت نامه مجوز GCC، مجوز عمومی عمومی GNU (GPL) نسخه ۳، از توسعه دهندگانی می‌خواهد که برنامه‌های افزودنی یا نسخه‌های اصلاح شده GCC را توزیع می‌کنند تا کد منبع خود را در دسترس قرار دهند، اما مجوز نرم‌افزار مجاز LLVM فاقد چنین مانعی است. برای مثال، GCC از مرحله‌ای به نام fold استفاده می‌کند که کلید فرایند کامپایل کلی است، که اثر جانبی ترجمه درخت کد به شکلی دارد که شبیه کد منبع اصلی نیست. اگر خطایی در حین یا بعد از مرحله فولد یافت شود، ترجمه آن به یک مکان در منبع اصلی ممکن است دشوار باشد. | ## بخش 2: سی‌لنگ (کامپایلر) | علاوه بر این، فروشندگانی که از پشته GCC در IDEها استفاده می‌کنند باید از ابزارهای جداگانه برای فهرست کردن کد استفاده کنند تا ویژگی‌هایی مانند برجسته سازی نحو و تکمیل کد هوشمند را ارائه دهند. Clang اطلاعات بیشتری را در طول فرایند کامپایل نسبت به GCC حفظ می‌کند و شکل کلی کد اصلی را حفظ می‌کند و نگاشت خطاها را به منبع اصلی آسان‌تر می‌کند. گزارش‌های خطای Clang دقیق تر، خاص تر و قابل خواندن توسط ماشین هستند، بنابراین IDEها می‌توانند خروجی کامپایلر را فهرست کنند. طراحی ماژولار کامپایلر می‌تواند نمایه‌سازی کد منبع، بررسی نحو، و سایر ویژگی‌هایی را که معمولاً با سیستم‌های توسعه سریع برنامه مرتبط هستند ارائه دهد. درخت تجزیه همچنین برای پشتیبانی از بازآفرینی خودکار کد مناسب‌تر است، زیرا مستقیماً کد منبع اصلی را نشان می‌دهد. در بسیاری از موارد، Clang می‌تواند در صورت نیاز جایگزین GCC شود، بدون اینکه تأثیر دیگری بر روی زنجیره ابزار به‌عنوان یک کل داشته باشد. Clang بسیاری از پسوندهای زبان گنو و ذاتی کامپایلر را پیاده‌سازی می‌کند که برخی از آنها صرفاً برای سازگاری هستند. هدف توسعه دهندگان Clang کاهش ردپای حافظه و افزایش سرعت کامپایل در مقایسه با کامپایلرهای رقیب مانند GCC است. | ## بخش 3: سی‌لنگ (کامپایلر) | در اکتبر ۲۰۰۷، آنها گزارش دادند که Clang کتابخانه‌های کربن را بیش از دو برابر سریعتر از GCC جمع‌آوری کرد، در حالی که از حدود یک ششم حافظه و فضای دیسک GCC استفاده می‌کرد. از اواسط سال ۲۰۱۴، Clang همچنان سریعتر از GCC در یک معیار زمان کامپایل ترکیبی و معیار عملکرد برنامه کامپایل می‌شود. از سال ۲۰۱۴، عملکرد برنامه‌های کامپایل‌شده با Clang از عملکرد برنامه‌های کامپایل‌شده توسط GCC عقب‌تر بود، که گاهی به دلیل فاکتورهای بزرگ (تا ۵٫۵ برابر)، که گزارش‌های قبلی از عملکرد کندتر را تکرار می‌کرد. هر دو کامپایلر از آن زمان به بعد تکامل یافته‌اند تا عملکرد خود را افزایش دهند، با کاهش فاصله: مقایسه در نوامبر ۲۰۱۶ بین GCC 4.8.2 در مقابل clang 3.4، در دسته بزرگی از فایل‌های آزمایشی نشان می‌دهد که GCC در کد منبع بهینه‌سازی شده تقریباً ۱۷ درصد بهتر از صدای صدا می‌زند. نتایج آزمون مختص کد هستند و کد منبع C بهینه نشده می‌تواند این تفاوت‌ها را معکوس کند؛ بنابراین این دو کامپایلر به‌طور کلی قابل مقایسه به نظر می‌رسند. مقایسه در سال ۲۰۱۹ در اینتل آیس لیک نشان داده‌است که برنامه‌های تولید شده توسط Clang 10 به ۹۶ درصد از عملکرد GCC 10 در ۴۱ معیار مختلف دست یافته‌اند (در حالی که برنده ۲۲ و از دست دادن ۱۹ مورد از آنها). | ## جمع‌بندی | نتیجه این بود که LLVM 11 کامپایل کد با بهینه‌سازی‌ها ۲ برابر طول می‌کشد، و در نتیجه کدی تولید می‌کند که ۱۰ تا ۲۰ درصد سریع‌تر اجرا می‌شود (با گاه به گاه در هر جهت)، در مقایسه با LLVM 2.7 که بیش از ۱۰ سال قدمت دارد.