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

از ویکی‌پدیا، دانشنامهٔ آزاد
Clang
Clang 12.0.1
Clang 12.0.1
نویسنده(های)
اصلی
Chris Lattner
توسعه‌دهنده(ها)LLVM Developer Group
انتشار ابتدایی۲۶ سپتامبر ۲۰۰۷؛ ۱۴ سال پیش (۲۰۰۷-۰۹-26)[۱]
انتشار پایدار
13.0.0
۴ اکتبر ۲۰۲۱؛ ۸ ماه پیش (۲۰۲۱-۱۰-04)[۲]
مخزن
نوشته‌شده باC++
سیستم‌عاملUnix-like
بن‌سازه رایانشAArch64, ARMv7, IA-32, x86-64, ppc64le[۳]
گونهCompiler front end
پروانهApache License 2.0 with LLVM Exceptions[۴][۵]
وبگاه

کلنگ ‎/ˈklæŋ/‎ ، به عنوان فرانت اند کامپایلر برای 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 ۳.۱ آغاز کرد. یکی از اولین استفاده‌های LLVM یک کامپایلر کد OpenGL برای OS X بود که تماس‌های OpenGL را به فراخوان‌های اساسی‌تر برای واحدهای پردازش گرافیکی (GPU) تبدیل می‌کند که از ویژگی‌های خاصی پشتیبانی نمی‌کنند. این به اپل این امکان را داد تا از OpenGL در رایانه‌هایی که از چیپ‌ست‌های GMA اینتل استفاده می‌کنند، پشتیبانی کند و عملکرد را در این دستگاه‌ها افزایش دهد.

پروژه LLVM در ابتدا برای استفاده از قسمت جلویی GCC در نظر گرفته شده بود. کد منبع GCC، با این حال، بزرگ و تا حدودی دست و پا گیر است. همانطور که یکی از توسعه دهندگان قدیمی GCC با اشاره به LLVM گفت: "تلاش برای رقص اسب آبی واقعاً سرگرم کننده نیست". علاوه بر این، نرم افزار اپل از Objective-C استفاده میکند که برای توسعه دهندگان GCC اولویت پایینی دارد. به این ترتیب، GCC به راحتی در محیط توسعه یکپارچه اپل (IDE) ادغام نمی شود. در نهایت، موافقت نامه مجوز GCC، مجوز عمومی عمومی GNU (GPL) نسخه 3 ، از توسعه دهندگانی می خواهد که برنامه های افزودنی یا نسخه های اصلاح شده 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 است. در اکتبر 2007، آنها گزارش دادند که Clang کتابخانه های کربن را بیش از دو برابر سریعتر از GCC جمع آوری کرد، در حالی که از حدود یک ششم حافظه و فضای دیسک GCC استفاده می کرد. [۱۹] به نظر می رسد تا سال 2011، Clang این مزیت را در عملکرد کامپایلر حفظ کرده است. [۲۰] [۲۱] از اواسط سال 2014، Clang همچنان سریعتر از GCC در یک معیار زمان کامپایل ترکیبی و معیار عملکرد برنامه کامپایل می شود. [۲۲] با این حال، تا سال 2019، Clang در کامپایل هسته لینوکس به طور قابل توجهی کندتر از GCC است در حالی که در کامپایل LLVM کمی سریعتر باقی می ماند. [۲۳]

در حالی که Clang از لحاظ تاریخی در تدوین سریعتر از GCC بوده است، کیفیت خروجی عقب مانده است. از سال 2014، عملکرد برنامه‌های کامپایل‌شده با Clang از عملکرد برنامه‌های کامپایل‌شده توسط GCC عقب‌تر بود، که گاهی اوقات به دلیل فاکتورهای بزرگ (تا 5.5 برابر)، [۲۲] که گزارش‌های قبلی از عملکرد کندتر را تکرار می‌کرد. [۲۰] هر دو کامپایلر از آن زمان به بعد تکامل یافته اند تا عملکرد خود را افزایش دهند، با کاهش فاصله:

  • مقایسه در نوامبر 2016 بین GCC 4.8.2 در مقابل clang 3.4، در دسته بزرگی از فایل‌های آزمایشی نشان می‌دهد که GCC در کد منبع بهینه‌سازی شده تقریباً 17 درصد بهتر از صدای صدا می‌زند. نتایج آزمون مختص کد هستند و کد منبع C بهینه نشده می‌تواند این تفاوت‌ها را معکوس کند. بنابراین این دو کامپایلر به طور کلی قابل مقایسه به نظر می رسند. [۲۴] 
  • مقایسه در سال 2019 در اینتل آیس لیک نشان داده است که برنامه های تولید شده توسط Clang 10 به 96 درصد از عملکرد GCC 10 در 41 معیار مختلف دست یافته اند (در حالی که برنده 22 و از دست دادن 19 مورد از آنها). [۲۳]

در سال 2021 معیاری برای مقایسه عملکرد LLVM 2.7 در مقابل LLVM 11 و زمان های کامپایل ایجاد شد. نتیجه این بود که LLVM 11 کامپایل کد با بهینه‌سازی‌ها 2 برابر طول می‌کشد، و در نتیجه کدی تولید می‌کند که 10 تا 20 درصد سریع‌تر اجرا می‌شود (با گاه به گاه در هر جهت)، در مقایسه با LLVM 2.7 که بیش از 10 سال قدمت دارد. [۲۵]

رابط[ویرایش]

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?".