موضوع مقاله: ال‌ال‌وی‌ام | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # ال‌ال‌وی‌ام | مقدمه: LLVM (ال‌ال‌وی‌ام) مجموعه‌ای از فناوری‌های کامپایلر و زنجیره ابزار است، که می‌تواند برای توسعه یک فرانت‌اند برای هر زبان برنامه‌نویسی و یک بک اند برای هر معماری مجموعه دستورالعمل استفاده شود. | ## بخش 1: ال‌ال‌وی‌ام | LLVM حول یک نمایش میانی مستقل از زبان (IR) طراحی شده‌است که به عنوان یک زبان اسمبلی پرتابل و سطح بالا عمل می‌کند که می‌تواند با تغییر شکل‌های مختلف در چندین پاس بهینه شود. LLVM به زبان C++ نوشته شده‌است و برای بهینه‌سازی زمان کامپایل، زمان لینک، زمان اجرا و زمان بیکاری طراحی شده‌است. LLVM در ابتدا به عنوان یک زیرساخت تحقیقاتی برای بررسی تکنیک‌های کامپایل پویا برای زبان‌های برنامه‌نویسی استاتیک و پویا توسعه داده شد. در سال ۲۰۰۵، کمپانی اپل کریس لتنر را استخدام کرد و تیمی را برای کار بر روی سیستم LLVM برای استفاده‌‌های مختلف در سیستم‌های توسعه اپل تشکیل داد. LLVM به بخشی جدایی ناپذیر از اپل شده‌است اکس‌کد متعلق به ابزار توسعه برای مک‌اواس است و همچنین در آی‌اواس از Xcode 4 استفاده شده است. مخفف LLVM برای جلوگیری از سردرگمی رسماً حذف شده‌است، زیرا LLVM به یک پروژه چتری تبدیل شده‌است که ارتباط کمی با آنچه اکثر توسعه دهندگان فعلی به عنوان (به‌طور خاص) ماشین‌های مجازی پردازش میکند، دارد. امکانات LLVM می‌تواند لایه‌های میانی یک سیستم کامپایلر کامل را فراهم کند، کد بازنمایی میانی (IR) را از یک کامپایلر گرفته و یک IR بهینه‌سازی شده منتشر می‌کند. سپس این IR جدید می‌تواند تبدیل شود و به کد زبان اسمبلی وابسته به ماشین برای پلتفرم هدف پیوند داده شود. LLVM می‌تواند IR را از زنجیره ابزار جی‌سی‌سی بپذیرد، و به آن اجازه می‌دهد تا با آرایه وسیعی از فرانت کامپایلرهای موجود برای آن پروژه استفاده شود. LLVM همچنین می‌تواند کد ماشین قابل جابجایی را در زمان کامپایل یا زمان پیوند یا حتی کد ماشین باینری در زمان اجرا تولید کند. هر دستورالعمل به صورت استاتیک تک انتساب (SSA) است، به این معنی که هر متغیر (به نام ثبات تایپ شده) یک بار اختصاص داده می‌شود و سپس ثابت می‌شود. LLVM اجازه می‌دهد تا کد به صورت ایستا کامپایل شود، همان‌طور که در سیستم سنتی GCC است، یا برای کامپایل دیرهنگام از IR به کد ماشین از طریق کامپایل درجا (JIT)، مشابه جاوا، رها شود. سیستم نوع شامل انواع اساسی مانند اعداد صحیح یا ممیز شناور و پنج نوع مشتق شده‌است: اشاره‌گرها، آرایه‌ها، بردارها، ساختارها و توابع. | ## بخش 2: ال‌ال‌وی‌ام | یک ساختار نوع در یک زبان مشخص را می‌توان با ترکیب این انواع اساسی در LLVM نشان داد. به عنوان مثال، یک کلاس در C++ را می‌توان با ترکیبی از ساختارها، توابع و آرایه‌های نشانگر تابع نمایش داد. کامپایلر LLVM JIT می‌تواند شاخه‌های استاتیک غیرضروری از یک برنامه را در زمان اجرا بهینه‌سازی کند، بنابراین برای ارزیابی جزئی در مواردی که یک برنامه گزینه‌های زیادی دارد، که اکثر آن‌ها به راحتی می‌توانند در یک محیط خاص غیر ضروری تشخیص داده شوند، کاربردی است. کدهای گرافیکی در پشته OpenGL را می‌توان در نمایش متوسط رها کرد و سپس هنگام اجرا بر روی ماشین مورد نظر کامپایل کرد. در سیستم‌هایی که واحدهای پردازش گرافیکی (GPU) سطح بالایی دارند، کد به‌دست‌آمده کاملاً نازک باقی می‌ماند و دستورالعمل‌ها را با حداقل تغییرات به GPU منتقل می‌کند. در سیستم‌هایی با پردازنده‌های گرافیکی پایین‌رده، LLVM رویه‌های اختیاری را جمع‌آوری می‌کند که روی واحد پردازش مرکزی محلی (CPU) اجرا می‌شوند که دستورالعمل‌هایی را شبیه‌سازی می‌کنند که GPU نمی‌تواند به صورت داخلی اجرا شود. نتایج جدیدتر در سال ۲۰۱۳ نشان می‌دهد که LLVM اکنون در این زمینه به GCC رسیده‌است و اکنون در حال جمع‌آوری باینری‌هایی با عملکرد تقریباً برابر است. علاقه گسترده به LLVM منجر به تلاش‌های متعددی برای توسعه فرانت‌اندهای جدید برای زبان‌های مختلف شده‌است. اگرچه ژنراتور در مراحل اولیه توسعه است، اما در بسیاری از موارد کارآمدتر از مولد کد C بوده‌است. یک بک‌اند کامپایلر هسکل گلاسکو (GHC) با استفاده از LLVM وجود دارد که سرعت ۳۰ درصدی کد کامپایل‌شده را نسبت به کامپایل کد بومی از طریق تولید کد GHC یا C و سپس کامپایل به دست می‌آورد و تنها یکی از تکنیک‌های بهینه‌سازی بسیاری را که توسط GHC. هسته LLVM بازنمایی میانی (IR) است که یک زبان برنامه‌نویسی سطح پایین شبیه اسمبلی است. IR یک مجموعه دستور العمل محاسباتی مجموعه دستورالعمل کاهش یافته (RISC) است که بیشتر جزئیات هدف را انتزاعی می‌کند. به عنوان مثال، قرارداد فراخوانی از طریق دستورات فراخوانی و ret با آرگومان‌های صریح انتزاع می‌شود. | ## بخش 3: ال‌ال‌وی‌ام | همچنین به جای مجموعه ثابتی از رجیسترها، IR از مجموعه نامتناهی موقت به شکل %۰، %۱ و غیره استفاده می‌کند. LLVM از سه شکل معادل IR شامل : یک قالب اسمبلی قابل خواندن توسط انسان، یک فرمت درون حافظه مناسب برای قسمت‌های جلویی و یک قالب بیت کد متراکم برای سریال سازی ، پشتیبانی میکند. کنوانسیون‌های مختلف مورد استفاده و ویژگی‌های ارائه شده توسط اهداف مختلف به این معنی است که LLVM نمی‌تواند واقعاً یک IR مستقل از هدف تولید کند و آن را بدون نقض برخی از قوانین تعیین شده مجدداً هدف قرار دهد. نمونه‌هایی از وابستگی هدف فراتر از آنچه به صراحت در مستندات ذکر شده‌است را می‌توان در پیشنهادی در سال ۲۰۱۱ برای "wordcode" یافت، یک نوع کاملاً مستقل از هدف LLVM IR که برای توزیع آنلاین در نظر گرفته شده‌است. قبلاً، LLVM برای ترجمه اسمبلی به کد ماشین به اسمبلر سیستم یا یکی از ابزارهایی که توسط یک زنجیره ابزار ارائه می‌شد متکی بود. برای برخی از اهداف، از جمله مجموعه‌های مختلف دستورالعمل MIPS، پشتیبانی مونتاژ یکپارچه قابل استفاده است اما هنوز در مرحله بتا است. پیوند دهنده پروژه فرعی lld تلاشی برای توسعه یک لینکر داخلی و مستقل از پلتفرم برای LLVM است. برخلاف پیوند دهنده‌های گنو، lld دارای پشتیبانی داخلی برای بهینه‌سازی زمان پیوند است. این امکان تولید کد سریع‌تر را فراهم می‌کند زیرا استفاده از یک پلاگین پیوند دهنده را دور می‌زند، اما از طرف دیگر قابلیت همکاری با دیگر طعم‌های LTO را ممنوع می‌کند. پلی این مجموعه ای از بهینه‌سازی‌های حافظه نهان-محلی و همچنین موازی سازی خودکار و برداری را با استفاده از یک مدل چند وجهی پیاده‌سازی می‌کند. مشتقات به دلیل مجوز مجاز آن، بسیاری از فروشندگان چنگال‌های تنظیم شده خود را از LLVM منتشر می‌کنند. این به‌طور رسمی توسط اسناد LLVM به رسمیت شناخته شده‌است، که به این دلیل پیشنهاد می‌کند از شماره نسخه در بررسی ویژگی‌ها استفاده نکنید. | ## جمع‌بندی | آزمایشگاه ملی لس آلاموس دارای یک چنگال محاسباتی موازی LLVM 8 به نام «کیتسون» است.