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

کلنگ ‎/ˈklæŋ/‎ (به انگلیسی Clang) به عنوان فرانت اند کامپایلر برای C , C ++، زبان Objective-C و هدف- C ++ زبان‌های برنامه‌نویسی، و همچنین به عنوان کتابخانه،[۶] از OpenCL، از RenderScript، CUDA، و HIP[۷] چارچوب‌ها استفاده می‌شود. کلنگ به عنوان جایگزینی برای مجموعه کامپایلر گنو (GCC) عمل می‌کند و از اکثر پرچم‌های کامپایل و پسوندهای زبان غیررسمی پشتیبانی می‌کند.[۸][۹]کلنگ شامل یک تحلیلگر استاتیک و چندین ابزار تجزیه و تحلیل کد است.[۱۰]

Clang
نویسنده(های)
اصلی
Chris Lattner
توسعه‌دهنده(ها)LLVM Developer Group
انتشار اولیه۲۶ سپتامبر ۲۰۰۷؛ ۱۷ سال پیش (۲۰۰۷-26}})[۱]
انتشار پایدار
18.1.8 / ۱۸ ژوئن ۲۰۲۴؛ ۴ ماه پیش (۲۰۲۴-18}})[۲]
مخزن
نوشته‌شده باC++
سیستم‌عاملUnix-like
پلت‌فرمAArch64, ARMv7, IA-32, x86-64, ppc64le[۳]
نوعCompiler front end
مجوزApache License 2.0 with LLVM Exceptions[۴][۵]
وبگاه

کلنگ به صورت پشت سر هم با کامپایلر LLVM عمل می‌کند و یک پروژه فرعی از LLVM 2.6 به بعد بوده‌است.[۱۱] همانند LLVM، این نرم‌افزار آزاد و منبع باز تحت مجوز نرم‌افزار مجوز آپاچی ۲٫۰ است.[۴][۵] شرکت‌هایی مانند Apple, Microsoft, Google, ARM, Sony, Intel, و AMD با کلنگ مشارکت داشته‌اند.

کلنگ ۱۲، آخرین نسخه اصلی کلنگ از آوریل ۲۰۲۱، از تمام استانداردهای 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 است.

جستارهای وابسته

ویرایش

منابع

ویرایش
  1. "LLVM 2.1 Release Notes". llvm.org. LLVM Developer Group. 27 September 2007.
  2. "LLVM Download Page". llvm.org. LLVM Developer Group.
  3. "Releases". llvm / llvm-project repo. LLVM Developer Group. 27 August 2021 – via GitHub.com].
  4. ۴٫۰ ۴٫۱ ۴٫۲ "LICENSE.TXT", llvm.org, LLVM Developer Group, retrieved 2019-09-24
  5. ۵٫۰ ۵٫۱ ۵٫۲ "LLVM Developer Policy", llvm.org, LLVM Developer Group, § Copyright, License, and Patents
  6. "OpenMP Support". LLVM Project Blog. May 22, 2015. Retrieved 28 March 2016.
  7. "C++ Heterogeneous-Compute Interface for Portability". Retrieved 18 February 2020.
  8. "Clang Language Extensions". Retrieved 2017-11-08. In addition to the language extensions listed here, Clang aims to support a broad range of GCC extensions.
  9. ۹٫۰ ۹٫۱ Clang - Features and Goals: GCC Compatibility, 15 April 2013
  10. "Clang Static Analyzer". LLVM. Retrieved 3 September 2009.
  11. "Getting Involved with the Clang Project", clang.llvm.org, LLVM Developer Group, retrieved 2012-09-18, Clang is a subproject of the LLVM Project, but has its own mailing lists because the communities have people with different interests.
  12. "C++ and C++'0x Support in Clang". LLVM.
  13. "Clang 6.0.0 Release Notes". LLVM.
  14. Lattner, Chris (11 July 2007). "New LLVM C front-end: "clang"". https://lists.llvm.org/pipermail/cfe-dev/2007-July/000000.html.
  15. Clang team, clang: a C language family frontend for LLVM
  16. Clang: Utility and Applications: Library Based Architecture
  17. FLANG: NVIDIA Brings Fortran To LLVM
  18. Clang can often be used as a drop-in replacement for GCC, May 2020
  19. Clang - Features and Goals: Fast compiles and Low Memory Use, October 2007
  20. ۲۰٫۰ ۲۰٫۱ Simonis, Volker (10 February 2011). "Compiling the HotSpot VM with Clang". Archived from the original on 18 February 2011. Retrieved 13 February 2011. While the overall GCC compatibility is excellent and the compile times are impressive, the performance of the generated code is still lacking behind a recent GCC version.
  21. "Benchmarking LLVM & Clang Against GCC 4.5". Phoronix. 21 April 2010. Retrieved 13 February 2011. Binaries from LLVM-GCC and Clang both struggled to compete with GCC 4.5.0 in the timed HMMer benchmark of a Pfam database search. LLVM-GCC and Clang were about 23% slower(...)Though LLVM / Clang isn't the performance champion at this point, both components continue to be under very active development and there will hopefully be more news to report in the coming months
  22. ۲۲٫۰ ۲۲٫۱ "GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks". OpenBenchmarking.org. 14 April 2014. Retrieved 25 June 2014.
  23. ۲۳٫۰ ۲۳٫۱ Michael Larabel (Dec 23, 2019). "LLVM Clang Achieves ~96% The Performance Of GCC On Intel Ice Lake".
  24. "Clang vs GCC - which produces better binaries?". stackoverflow.com. Retrieved 2018-10-01.
  25. "How does clang 2.7 hold up in 2021?".