ال‌ال‌وی‌ام

LLVM (ال‌ال‌وی‌ام) مجموعه‌ای از فن‌آوری‌های کامپایلر و زنجیره ابزار است، که می‌تواند برای توسعه یک فرانت‌اند برای هر زبان برنامه‌نویسی و یک فرانت اند برای هر معماری مجموعه دستورالعمل استفاده شود. LLVM حول یک نمایش میانی مستقل از زبان (IR) طراحی شده‌است که به عنوان یک زبان اسمبلی پرتابل و سطح بالا عمل می‌کند که می‌تواند با تغییر شکل‌های مختلف در چندین پاس بهینه شود.

LLVM به زبان C++ نوشته شده‌است و برای بهینه‌سازی زمان کامپایل ، زمان لینک ، زمان اجرا و زمان بیکاری طراحی شده‌است. در ابتدا برای C و C++ پیاده‌سازی شد، طراحی زبان آگنوستیک LLVM از آن زمان تا به حال طیف گسترده‌ای از فرست‌اندها را ایجاد کرده‌است، زبان‌هایی با کامپایلرهایی که از LLVM استفاده می‌کنند عبارتند از:ActionScript، Ada، C#، Common Lisp , PicoLisp. , کریستال، CUDA, D, Delphi, Dylan, Forth, Fortran, Graphical G, Halide, Haskell, Java bytecode, Julia, Kotlin, Lua, Objective-C, OpenCL, PostgreSQL 's SQL و PLpgSQL, Ruby , Rust، Scala , Swift , XC, Xojo و Zig.

تاریخ 
پروژه LLVM در سال ۲۰۰۰ در دانشگاه ایلینویز در Urbana-Champaign، تحت مدیریت Vikram Adve و Chris Lattner  آغاز شد. نام LLVM در اصل یک initialism (سرواژه) برای سطح پایین ماشین مجازی بود. LLVM در ابتدا به عنوان یک زیرساخت تحقیقاتی برای بررسی تکنیک‌های کامپایل پویا برای زبان‌های برنامه‌نویسی استاتیک و پویا توسعه داده شد. LLVM تحت مجوز منبع باز دانشگاه ایلینویز/NCSA، به عنوان یک مجوز نرم‌افزار آزاد مجاز منتشر شد. در سال ۲۰۰۵، کمپانی اپل Apple Inc کریس لتنر را استخدام کرد و تیمی را برای کار بر روی سیستم LLVM برای استفاده‌‌های مختلف در سیستم‌های توسعه اپل تشکیل داد. LLVM به بخشی جدایی ناپذیر از اپل شده‌است Xcode متعلق به ابزار توسعه برای MacOS است و همچنین در iOS از Xcode 4 استفاده شده است. 

مخفف LLVM برای جلوگیری از سردرگمی رسماً حذف شده‌است، زیرا LLVM به یک پروژه چتری تبدیل شده‌است که ارتباط کمی با آنچه اکثر توسعه دهندگان فعلی به عنوان (به‌طور خاص) ماشین‌های مجازی پردازش میکند، دارد. اکنون، LLVM برندی است که برای پروژه چتر LLVM، نمایندگی میانی LLVM (IR)، اشکال‌زدای LLVM، اجرای LLVM کتابخانه استاندارد C++ (با پشتیبانی کامل از C++11 و C++14 استفاده می‌شود) و غیره LLVM توسط بنیاد LLVM اداره می‌شود. رئیس آن مهندس کامپایلر تانیا لاتنر است.

"برای طراحی و پیاده سازی LLVM"، انجمن ماشین‌های محاسباتی جایزه سیستم نرم‌افزاری ACM را در سال ۲۰۱۲ به Vikram Adve, Chris Lattner و Evan Cheng اهدا کرد.

از نسخه ۹٫۰٫۰، مجوز Apache 2.0 با استثناهای LLVM مجدداً دریافت شد.

امکانات 
LLVM می‌تواند لایه‌های میانی یک سیستم کامپایلر کامل را فراهم کند، کد بازنمایی میانی (IR) را از یک کامپایلر گرفته و یک IR بهینه‌سازی شده منتشر می‌کند. سپس این IR جدید می‌تواند تبدیل شود و به کد زبان اسمبلی وابسته به ماشین برای پلتفرم هدف پیوند داده شود. LLVM می‌تواند IR را از زنجیره ابزار GNU Compiler Collection (GCC) بپذیرد، و به آن اجازه می‌دهد تا با آرایه وسیعی از فرانت کامپایلرهای موجود برای آن پروژه استفاده شود.

LLVM همچنین می‌تواند کد ماشین قابل جابجایی را در زمان کامپایل یا زمان پیوند یا حتی کد ماشین باینری در زمان اجرا تولید کند.

LLVM از مجموعه دستورات و سیستم نوع مستقل از زبان پشتیبانی می‌کند. هر دستورالعمل به صورت استاتیک تک انتساب (SSA) است، به این معنی که هر متغیر (به نام ثبات تایپ شده) یک بار اختصاص داده می‌شود و سپس ثابت می‌شود. این به ساده‌سازی تحلیل وابستگی‌ها در بین متغیرها کمک می‌کند. LLVM اجازه می‌دهد تا کد به صورت ایستا کامپایل شود، همان‌طور که در سیستم سنتی GCC است، یا برای کامپایل دیرهنگام از IR به کد ماشین از طریق کامپایل در زمان (JIT)، مشابه جاوا، رها شود. سیستم نوع شامل انواع اساسی مانند اعداد صحیح یا ممیز شناور و پنج نوع مشتق شده‌است: اشاره گرها، آرایه‌ها، بردارها، ساختارها و توابع. یک ساختار نوع در یک زبان مشخص را می‌توان با ترکیب این انواع اساسی در LLVM نشان داد. به عنوان مثال، یک کلاس در C++ را می‌توان با ترکیبی از ساختارها، توابع و آرایه‌های نشانگر تابع نمایش داد.

کامپایلر LLVM JIT می‌تواند شاخه‌های استاتیک غیرضروری از یک برنامه را در زمان اجرا بهینه‌سازی کند،  بنابراین برای ارزیابی جزئی در مواردی که یک برنامه گزینه‌های زیادی دارد، که اکثر آن‌ها به راحتی می‌توانند در یک محیط خاص غیر ضروری تشخیص داده شوند، کاربردی است. این ویژگی در خط لوله OpenGL Mac OS X Leopard (نسخه ۱۰٫۵) برای پشتیبانی از ویژگی‌های سخت‌افزاری از دست رفته استفاده می‌شود.

کدهای گرافیکی در پشته OpenGL را می‌توان در نمایش متوسط رها کرد و سپس هنگام اجرا بر روی ماشین مورد نظر کامپایل کرد. در سیستم‌هایی که واحدهای پردازش گرافیکی (GPU) سطح بالایی دارند، کد به‌دست‌آمده کاملاً نازک باقی می‌ماند و دستورالعمل‌ها را با حداقل تغییرات به GPU منتقل می‌کند. در سیستم‌هایی با پردازنده‌های گرافیکی پایین‌رده، LLVM رویه‌های اختیاری را جمع‌آوری می‌کند که روی واحد پردازش مرکزی محلی (CPU) اجرا می‌شوند که دستورالعمل‌هایی را شبیه‌سازی می‌کنند که GPU نمی‌تواند به صورت داخلی اجرا شود. LLVM با استفاده از چیپست‌های GMA اینتل، عملکرد را در ماشین‌های ارزان قیمت بهبود بخشید. سیستم مشابهی تحت Gallium3D LLVMpipe توسعه داده شد و در پوسته گنوم گنجانده شد تا بدون بارگذاری درایور سخت‌افزاری سه بعدی مناسب اجرا شود.

برای عملکرد زمان اجرا برنامه‌های کامپایل شده، GCC قبلاً در سال ۲۰۱۱ به‌طور متوسط ۱۰٪ از LLVM بهتر بود. نتایج جدیدتر در سال ۲۰۱۳ نشان می‌دهد که LLVM اکنون در این زمینه به GCC رسیده‌است و اکنون در حال جمع‌آوری باینری‌هایی با عملکرد تقریباً برابر است.

اجزاء 
LLVM به یک پروژه مادر شامل چندین مؤلفه تبدیل شده‌است.

قسمت‌های جلویی 
LLVM در اصل برای جایگزینی برای تولیدکننده کد موجود در پشته GCC نوشته شده بود، و بسیاری از قسمت‌های جلویی GCC برای کار با آن اصلاح شده‌اند که منجر به مجموعه منحل‌شده LLVM-GCC شد. اصلاحات عموماً شامل یک مرحله IR GIMPLE -to-LLVM هستند تا بهینه‌سازها و کدژن‌های LLVM را بتوان به جای سیستم GIMPLE GCC استفاده کرد. اپل از طریق Xcode 4.x (2013) یکی از کاربران مهم LLVM-GCC بود. این استفاده از قسمت‌های جلویی GCC عمدتاً یک اقدام موقت در نظر گرفته می‌شد، اما با ظهور Clang و مزایای LLVM و پایگاه کد مدرن و مدولار Clang (و همچنین سرعت کامپایل)، عمدتاً منسوخ شده‌است.

LLVM در حال حاضر از کامپایل Ada، C , C++، D، Delphi، Fortran، Haskell، Julia، Objective-C، Rust و Swift با استفاده از قسمت‌های جلویی مختلف پشتیبانی می‌کند.

علاقه گسترده به LLVM منجر به تلاش‌های متعددی برای توسعه فرانت‌اندهای جدید برای زبان‌های مختلف شده‌است. کامپایلر جدیدی که بیشتر مورد توجه قرار گرفته Clang است که از C, C++ و Objective-C پشتیبانی می‌کند. هدف Clang که عمدتاً توسط اپل پشتیبانی می‌شود، جایگزینی کامپایلر C/Objective-C در سیستم GCC با سیستمی است که راحت‌تر با محیط‌های توسعه یکپارچه (IDEs) ادغام می‌شود و پشتیبانی گسترده‌تری از multithreading دارد. پشتیبانی از دستورالعمل‌های OpenMP از زمان انتشار ۳٫۸ در Clang گنجانده شده‌است.

کامپایلر Utrecht Haskell می‌تواند کد برای LLVM تولید کند. اگرچه ژنراتور در مراحل اولیه توسعه است، اما در بسیاری از موارد کارآمدتر از مولد کد C بوده‌است. یک بک‌اند کامپایلر هسکل گلاسکو (GHC) با استفاده از LLVM وجود دارد که سرعت ۳۰ درصدی کد کامپایل‌شده را نسبت به کامپایل کد بومی از طریق تولید کد GHC یا C و سپس کامپایل به دست می‌آورد و تنها یکی از تکنیک‌های بهینه‌سازی بسیاری را که توسط GHC.

بسیاری از مؤلفه‌های دیگر در مراحل مختلف توسعه هستند، از جمله، اما نه محدود به، کامپایلر Rust، یک بایت کد جاوا، یک زبان میانی معمولی (CIL)، اجرای MacRuby از Ruby 1.9، بخش‌های جلویی مختلف برای استاندارد ML. و یک تخصیص دهنده ثبت رنگ آمیزی گراف جدید میتوان اشاره کرد.

نمایندگی میانی 

هسته LLVM بازنمایی میانی (IR) است که یک زبان برنامه‌نویسی سطح پایین شبیه اسمبلی است. IR یک مجموعه دستور العمل محاسباتی مجموعه دستورالعمل کاهش یافته (RISC) است که بیشتر جزئیات هدف را انتزاعی می‌کند. به عنوان مثال، قرارداد فراخوانی از طریق دستورات فراخوانی و ret با آرگومان‌های صریح انتزاع می‌شود. همچنین به جای مجموعه ثابتی از رجیسترها، IR از مجموعه نامتناهی موقت به شکل %۰، %۱ و غیره استفاده می‌کند. LLVM از سه شکل معادل IR شامل : یک قالب اسمبلی قابل خواندن توسط انسان، یک فرمت درون حافظه مناسب برای قسمت‌های جلویی و یک قالب بیت کد متراکم برای سریال سازی ، پشتیبانی میکند.

کنوانسیون‌های مختلف مورد استفاده و ویژگی‌های ارائه شده توسط اهداف مختلف به این معنی است که LLVM نمی‌تواند واقعاً یک IR مستقل از هدف تولید کند و آن را بدون نقض برخی از قوانین تعیین شده مجدداً هدف قرار دهد. نمونه‌هایی از وابستگی هدف فراتر از آنچه به صراحت در مستندات ذکر شده‌است را می‌توان در پیشنهادی در سال ۲۰۱۱ برای "wordcode" یافت، یک نوع کاملاً مستقل از هدف LLVM IR که برای توزیع آنلاین در نظر گرفته شده‌است. یک مثال کاربردی تر PNaCl است.

انتهای پشتی 
در نسخه ۳٫۴، LLVM از بسیاری از مجموعه‌های دستورالعمل پشتیبانی می‌کند، از جمله ARM , Qualcomm Hexagon، MIPS، Nvidia Parallel Thread Execution (PTX؛ به نام NVPTX در اسناد LLVM)، PowerPC , AMD TeraScale , AMD GraphicsN, Core Next (SPARC) z/Architecture (به نام SystemZ در اسناد LLVM)، x86، x86-64 و XCore. برخی از ویژگی‌ها در برخی از سیستم عامل‌ها در دسترس نیستند. اکثر ویژگی‌ها برای x86، x86-64، z/Architecture, ARM و PowerPC وجود دارد. RISC-V از نسخه ۷ پشتیبانی می‌شود. در گذشته، LLVM به‌طور کامل یا جزئی از سایر باطن‌ها، از جمله C backend، Cell SPU , mblaze (MicroBlaze) , AMD R600، DEC/Compaq Alpha (Alpha AXP) و Nios2، اما بسیاری از این سخت‌افزار بیشتر منسوخ شده‌است و توسعه دهندگان LLVM تصمیم گرفتند که هزینه‌های پشتیبانی و نگهداری دیگر توجیه نشده باشد.

LLVM همچنین از WebAssembly به عنوان هدف پشتیبانی می‌کند و برنامه‌های کامپایل شده را قادر می‌سازد در محیط‌های دارای WebAssembly مانند Google Chrome / Chromium، Firefox، Microsoft Edge، Apple Safari یا WAVM اجرا شوند. کامپایلرهای WebAssembly سازگار با LLVM معمولاً از کد منبع اصلاح نشده نوشته شده در C, C++، D, Rust, Nim, Kotlin و چندین زبان دیگر پشتیبانی می‌کنند.

زیر پروژه کد ماشین LLVM (MC) چارچوب LLVM برای ترجمه دستورالعمل‌های ماشین بین فرم‌های متنی و کد ماشین است. قبلاً، LLVM برای ترجمه اسمبلی به کد ماشین به اسمبلر سیستم یا یکی از ابزارهایی که توسط یک زنجیره ابزار ارائه می‌شد متکی بود. اسمبلر یکپارچه LLVM MC از اکثر اهداف LLVM از جمله x86، x86-64، ARM و ARM64 پشتیبانی می‌کند. برای برخی از اهداف، از جمله مجموعه‌های مختلف دستورالعمل MIPS، پشتیبانی مونتاژ یکپارچه قابل استفاده است اما هنوز در مرحله بتا است.

پیوند دهنده 
پروژه فرعی lld تلاشی برای توسعه یک لینکر داخلی و مستقل از پلتفرم برای LLVM است. lld با هدف حذف وابستگی به پیوند دهنده شخص ثالث است. ، lld از ELF، PE/COFF , Mach-O و WebAssembly به ترتیب نزولی کامل پشتیبانی می‌کند. lld سریعتر از هر دو طعم GNU ld است.

برخلاف پیوند دهنده‌های گنو، lld دارای پشتیبانی داخلی برای بهینه‌سازی زمان پیوند است. این امکان تولید کد سریع‌تر را فراهم می‌کند زیرا استفاده از یک پلاگین پیوند دهنده را دور می‌زند، اما از طرف دیگر قابلیت همکاری با دیگر طعم‌های LTO را ممنوع می‌کند.

کتابخانه استاندارد C++ 
پروژه LLVM شامل اجرای کتابخانه استاندارد C++ به نام libc++ است که دارای مجوز دوگانه تحت مجوز MIT و مجوز UIUC است.

از نسخه ۹٫۰٫۰، مجوز Apache 2.0 با استثناهای LLVM دریافت شد.

پلی 
این مجموعه ای از بهینه‌سازی‌های حافظه نهان-محلی و همچنین موازی سازی خودکار و برداری را با استفاده از یک مدل چند وجهی پیاده‌سازی می‌کند.

مشتقات 
به دلیل مجوز مجاز آن، بسیاری از فروشندگان چنگال‌های تنظیم شده خود را از LLVM منتشر می‌کنند. این به‌طور رسمی توسط اسناد LLVM به رسمیت شناخته شده‌است، که به این دلیل پیشنهاد می‌کند از شماره نسخه در بررسی ویژگی‌ها استفاده نکنید. برخی از فروشندگان عبارتند از:
 کامپایلر AMD Optimizing C/C++ AMD مبتنی بر LLVM, Clang و Flang است.
 اپل یک فورک منبع باز برای Xcode دارد.
 ARM یک فورک LLVM 9 را به عنوان «کامپایلر بازو» حفظ می‌کند.
 اینتل LLVM را برای کامپایلر نسل بعدی Intel C++ خود پذیرفته‌است.
 آزمایشگاه ملی لس آلاموس دارای یک چنگال محاسباتی موازی LLVM 8 به نام «کیتسون» است.
 از سال ۲۰۱۳، سونی از کامپایلر اصلی جلویی Clang LLVM در کیت توسعه نرم‌افزار (SDK) کنسول پلی استیشن ۴ خود استفاده کرده‌است.
 انویدیا از LLVM در پیاده‌سازی کامپایلر NVVM CUDA خود استفاده می‌کند. کامپایلر NVVM متمایز از "NVPTX" باطن ذکر شده در است بخش پایانه (Backend)، اگر چه هر دو تولید کد PTX برای کارت گرافیک Nvidia GPUها.
 IBM در حال استفاده از LLVM در کامپایلرهای C/C++ و Fortran خود است.

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

 HHVM
 ج--
 کیت کامپایلر آمستردام (ACK)
 LLDB (اشکال زدا)
 رعد و برق گنو
 مجموعه کامپایلر گنو (GCC)
 خالص
 OpenCL
 Emscripten
 قالب توزیع TenDRA
 قالب توزیع خنثی معماری (ANDF)
 مقایسه ماشین‌های مجازی کاربردی
 SPIR-V
 اکتشافات و نوآوری‌های دانشگاه ایلینوی در اوربانا Champaign

ادبیات 
 کریس لاتنر - معماری برنامه‌های کاربردی منبع باز - فصل 11 LLVM ،، در سال ۲۰۱۲ تحت CC BY 3.0 (دسترسی آزاد) منتشر شد.
 LLVM: یک چارچوب گردآوری برای تجزیه و تحلیل و تحول برنامه مادام العمر، مقاله منتشر شده توسط کریس لاتنر، ویکرام ادو

منابع

پیوند به بیرون 
 
کامپایلرها و مفسرهای آزاد
کامپایلرها
نرم‌افزارهایی که از پروانه آپاچی استفاده می‌کنند