ال‌ال‌وی‌ام

از ویکی‌پدیا، دانشنامهٔ آزاد
(تغییرمسیر از ماشین مجازی سطح پایین)
LLVM
نویسنده(های)
اصلی
Vikram Adve, Chris Lattner
توسعه‌دهنده(ها)LLVM Developer Group
انتشار ابتدایی۲۰۰۳؛ ۱۹ سال پیش (۲۰۰۳)
انتشار پایدار
13.0.0
۳۰ سپتامبر ۲۰۲۱؛ ۱۰ ماه پیش (۲۰۲۱-۰۹-30)[۱]
انتشار آزمایشی
13.0.0-rc4
۲۴ سپتامبر ۲۰۲۱؛ ۱۰ ماه پیش (۲۰۲۱-۰۹-24)[۱]
مخزن
نوشته‌شده باC++
سیستم‌عاملCross-platform
گونهCompiler
پروانهUIUC (BSD-style)
Apache License 2.0 with LLVM Exceptions (v9.0.0 or later)[۲]
وبگاه

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 به عنوان مثال توسط radeonsi و توسط llvmpipe استفاده می‌شود. هر دو بخشی از Mesa 3D هستند .

هسته 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 به رسمیت شناخته شده‌است، که به این دلیل پیشنهاد می‌کند از شماره نسخه در بررسی ویژگی‌ها استفاده نکنید.[۴۳] برخی از فروشندگان عبارتند از:

جستارهای وابسته[ویرایش]

ادبیات[ویرایش]

منابع[ویرایش]

  1. ۱٫۰ ۱٫۱ "Releases". Github. 9 July 2021. Retrieved 1 September 2021.
  2. "LICENSE.TXT". llvm.org. Retrieved 2019-09-24.
  3. "LLVM Logo". The LLVM Compiler Infrastructure Project.
  4. "The LLVM Compiler Infrastructure Project". Retrieved March 11, 2016.
  5. "LLVM Language Reference Manual". Retrieved June 9, 2019.
  6. "Announcing LLILC - A new LLVM-based Compiler for .NET". dotnetfoundation.org. Retrieved 2020-09-12.
  7. Mono LLVM, retrieved March 10, 2013
  8. "MovForth". GitHub. November 28, 2021.
  9. William Wong (May 23, 2017). "What's the Difference Between LabVIEW 2017 and LabVIEW NXG?". Electronic Design.
  10. Michael Larabel (11 April 2018). "Khronos Officially Announces Its LLVM/SPIR-V Translator". phoronix.com.
  11. "32.1. What is JIT compilation?". PostgreSQL Documentation (به انگلیسی). 2020-11-12. Retrieved 2021-01-25.
  12. "Features". RubyMotion. Scratchwork Development LLC. Retrieved June 17, 2017. RubyMotion transforms the Ruby source code of your project into … machine code using a[n] … ahead-of-time (AOT) compiler, based on LLVM.
  13. Reedy, Geoff (September 24, 2012). "Compiling Scala to LLVM". St. Louis, Missouri, United States. Retrieved February 19, 2013. {{cite journal}}: Cite journal requires |journal= (help)
  14. "xCORE: Multicore theory, hardware and programming (2014-12-01)", Developer Tool xTIMEcomposer, XMOS, December 2014, retrieved March 27, 2021
  15. Adam Treat (February 19, 2005), mkspecs and patches for LLVM compile of Qt4, archived from the original on October 4, 2011, retrieved January 27, 2012
  16. "Developer Tools Overview". Apple Developer. Apple. Archived from the original on April 23, 2011.
  17. ""libc++" C++ Standard Library".
  18. Chris Lattner (April 3, 2014). "The LLVM Foundation". LLVM Project Blog.
  19. "ACM Software System Award". ACM.
  20. "LLVM Language Reference Manual". Retrieved June 9, 2019.
  21. "A cool use of LLVM at Apple: the OpenGL stack". http://lists.llvm.org/pipermail/llvm-dev/2006-August/006497.html.
  22. Michael Larabel, "GNOME Shell Works Without GPU Driver Support", phoronix, November 6, 2011
  23. V. Makarov. "SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86". Retrieved October 3, 2011.
  24. V. Makarov. "SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86_64". Retrieved October 3, 2011.
  25. Michael Larabel (December 27, 2012). "LLVM/Clang 3.2 Compiler Competing With GCC". Retrieved March 31, 2013.
  26. "LLVM Compiler Overview". developer.apple.com.
  27. "Xcode 5 Release Notes". Apple Inc.
  28. "Clang 3.8 Release Notes". Retrieved August 24, 2016.
  29. "Compiling Haskell To LLVM". Retrieved February 22, 2009.
  30. "LLVM Project Blog: The Glasgow Haskell Compiler and LLVM". May 17, 2010. Retrieved August 13, 2010.
  31. Kang, Jin-Gu. "Wordcode: more target independent LLVM bitcode" (PDF). Retrieved 1 December 2019.
  32. "PNaCl: Portable Native Client Executables" (PDF). Archived from the original (PDF) on 2 May 2012. Retrieved 25 April 2012.
  33. "[LLVMdev RFC: R600, a new backend for AMD GPUs"]. March 26, 2012. http://lists.llvm.org/pipermail/llvm-dev/2012-March/048409.html.
  34. Target-specific Implementation Notes: Target Feature Matrix // The LLVM Target-Independent Code Generator, LLVM site.
  35. "Remove the mblaze backend from llvm". GitHub. July 25, 2013. Retrieved January 26, 2020.
  36. "Remove the Alpha backend". GitHub. October 27, 2011. Retrieved January 26, 2020.
  37. "[Nios2] Remove Nios2 backend". GitHub. January 15, 2019. Retrieved January 26, 2020.
  38. ۳۸٫۰ ۳۸٫۱ "lld - The LLVM Linker". The LLVM Project. Retrieved May 10, 2017.
  39. "WebAssembly lld port".
  40. "42446 – lld can't handle gcc LTO files". bugs.llvm.org.
  41. ""libc++" C++ Standard Library".
  42. "Polly - Polyhedral optimizations for LLVM".
  43. "Clang Language Extensions". Clang 12 documentation. Note that marketing version numbers should not be used to check for language features, as different vendors use different numbering schemes. Instead, use the Feature Checking Macros.
  44. "apple/llvm-project". Apple. 5 September 2020.
  45. "Intel C/C++ compilers complete adoption of LLVM". Intel (به انگلیسی). Retrieved 2021-08-17.
  46. "lanl/kitsune". Los Alamos National Laboratory. 27 February 2020.
  47. Developer Toolchain for ps4 (PDF), retrieved February 24, 2015
  48. "NVVM IR Specification 1.5". The current NVVM IR is based on LLVM 5.0
  49. "IBM C/C++ and Fortran compilers to adopt LLVM open source infrastructure".

پیوند به بیرون[ویرایش]