Low Level Virtual Machine (LLVM) — універсальна система аналізу, трансформації і оптимізації програм, що реалізує віртуальну машину з RISC-подібними інструкціями. Може використовуватися як оптимізувальний компілятор цього байт-коду в машинний код для різних архітектур або для його інтерпретації та JIT-компіляції (для деяких платформ).
Тип | Компілятори, оптимізатори і генератори коду |
---|---|
Розробники | LLVM Developer Group |
Перший випуск | 24 жовтня 2003 |
Стабільний випуск | 17.0.6 (28 листопада 2023) |
Операційна система | кросплатформність |
Мова програмування | |
Ліцензія | University of Illinois Open Source License |
Репозиторій | github.com/llvm/llvm-project |
Вебсайт | llvm.org |
|
LLVM дозволяє компілювати програми, написані мовами С, , ObjC, Fortran, Ada, Haskell, Java, Python, Ruby, Rust, JavaScript, GLSL, або будь-якою іншою, для якої реалізовано front-end. В рамках проєкту розроблено фронтенд Clang для мов C і і версія GCC, що використовують LLVM як бекенд. У Glasgow Haskell Compiler також реалізована компіляція за допомогою LLVM, існує ще безліч програм, що використовують цю інфраструктуру.
Історія
LLVM — не просто черговий академічний проєкт. Його історія почалась у 2000 році в Університеті Іллінойса, а тепер LLVM використовують такі гіганти індустрії як Apple, Adobe та Google. Зокрема, на LLVM заснована підсистема OpenGL у MacOS X 10.5, a iPhone SDK використовує GCC з бекендом на LLVM. Apple та Google є одними із основних спонсорів проєкту, а натхненник LLVM — Кріс Латтнер — тепер працює в Apple.
Особливості
У основі LLVM лежить проміжне подання коду (intermediate representation, IR), над яким можна виконувати трансформації у всі компіляції, компонування і виконання. Із нього генерується оптимізований машинний код для низки платформ, як статично, так і динамічно (JIT-компіляція). LLVM підтримує генерацію коду для x86, x86-64, ARM, PowerPC, SPARC, MIPS, IA-64, Alpha.
LLVM написана на і портована на більшість unix-систем і Windows. Система має модульну структуру і може розширюватись додатковими алгоритмами трансформації (compiler passes) і кодогенераторами для нових апаратних платформ. Фронтенд користувача, як правило, лінкується із LLVM і використовує C++ API для генерації коду і його перетворень. Однак LLVM містить у собі й standalone утиліти.
Платформи
LLVM підтримує роботу на наступних платформах:
Операційна система | Архітектура | Компілятор |
---|---|---|
FreeBSD | x86 | GCC, Clang |
FreeBSD | AMD64 | GCC, Clang |
Linux | AMD64 | GCC, Clang |
Linux | x86 | GCC, Clang |
Mac OS X | PowerPC | GCC |
Mac OS X | x86 | GCC, Clang |
Solaris | GCC | |
Cygwin/Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
MinGW/Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
LLVM має часткову підтримку таких платформ:
Операційна система | Архітектура | Компілятор |
---|---|---|
Windows | x86 | Visual Studio .NET |
AIX | PowerPC | GCC |
Linux | PowerPC | GCC |
Linux | Alpha | GCC |
Linux | Itanium (IA-64) | GCC |
HP-UX | Itanium (IA-64) |
Типи даних
Прості типи
Цілі числа довільної розрядності | iрозрядність |
|
| ||
Числа з рухомою комою | float, double, типи, специфічні для конкретної платформи (наприклад, x86_fp80) | |
Пусте значення | void |
Похідні типи
Вказівники | тип* | i32* — вказівник на 32-бітне ціле |
Масиви | [число елементів x тип] |
|
Структури | { i32, i32, double } | |
Вектор — спеціальний тип для спрощення SIMD-операцій. Вектор складається із 2^n значень примітивного типу — цілого або з плаваючою крапкою. | ||
< число елементів x тип > | < 4 x float > — вектор XMM | |
Функції |
|
Система типів рекурсивна, тобто можна використовувати багатовимірні масиви, масиви структур, вказівники на структури і функції і т. д.
Операції
Більшість інструкцій у LLVM приймають два аргументи (операнда) і вертають одне значення (триадресний код). Значення визначаються текстовим ідентифікатором. Локальні значення позначаються префіксом %
, а глобальні — @
. Локальні значення також називають регістрами, а LLVM — віртуальною машиною з нескінченним числом регістрів. Приклад:
%sum = add i32 %n, 5 %diff = sub double %a, %b %z = add <4 x float> %v1, %v2 — поелементне додавання %cond = icmp eq %x, %y — Порівняння цілих чисел. Результат має тип i1 %success = call i32 @puts(i8* %str)
Тип операндів завжди вказується явно, і однозначно визначає тип результату. Операнди арифметичних інструкцій повинні мати однаковий тип, але самі інструкції «перевантажені» для будь-яких числових типів і векторів.
LLVM підтримує повний набір арифметичних операцій, побітових логічних операцій і операцій зсуву, а також спеціальні інструкції для роботи з векторами.
LLVM IR строго типізований, тому існують операції приведення типів, які явно кодуються спеціальними інструкціями. Набір із 9 інструкцій покриває всі можливі приведення між різними числовими типами: цілими і з рухомою комою, із знаком і без, різної розрядності і т.п. Крім цього є інструкції перетворення між цілими і вказівниками, а також інструкція bitcast
, яка приведе все до всього, але за результат ви відповідаєте самі.
Пам’ять
Крім значень-регістрів, у LLVM є і робота із пам’яттю. Значення в пам’яті адресуються типізованими вказівниками. Звернутися до пам’яті можна за допомогою двох інструкцій: load
і store
. Наприклад:
%x = load i32* %x.ptr — отримати значення типу i32 по вказівнику %x.ptr %tmp = add i32 %x, 5 — додати 5 store i32 %tmp, i32* %x.ptr — і повернути назад
Інструкція malloc транслюється у виклик однойменної системної функції і виділяє пам’ять у купи, повертаючи значення — вказівник визначеного типу. У парі з нею йде інструкція free
.
%struct.ptr = malloc { double, double } %string = malloc i8, i32 %length %array = malloc [16 x i32] free i8* %string
Інструкція alloca
виділяє пам’ять на стеку.
%x.ptr = alloca double — %x.ptr має тип double* %array = alloca float, i32 8 — %array має тип float*, а не [8 x float]!
Пам’ять, виділена alloca
, автоматично звільняється при виході із функції за допомогою інструкцій ret
або unwind
.
Супутні проєкти
З проєктів, заснованих на LLVM, що розвиваються паралельно, можна відзначити:
- KLEE [ 25 грудня 2012 у Wayback Machine.] - символьний аналізатор і генератор тестових наборів;
- Runtime-бібліотека compiler-rt [ 6 липня 2009 у Wayback Machine.];
- llvm-mc [ 15 січня 2013 у Wayback Machine.] - автогенератор асемблера, дизасемблера та інших, пов'язаних з машинним кодом компонентів, на основі описів параметрів LLVM-сумісних платформ.
- VMKit [ 9 листопада 2020 у Wayback Machine.] - віртуальна машина для Java і .NET;
- Реалізація функційної мови програмування Pure[недоступне посилання з червня 2019];
- LDC [Архівовано 18 травня 2012 у WebCite] - компілятор для ;
- - оптимізатор, статичний і JIT компілятор для мови PHP;
- Віртуальні машини для Ruby: Rubinius [ 13 грудня 2015 у Wayback Machine.] і MacRuby [ 24 грудня 2012 у Wayback Machine.];
- Unladen Swallow [ 10 лютого 2011 у Wayback Machine.] - реалізація мови Python;
- LLVM-Lua [ 22 січня 2009 у Wayback Machine.]
- FlashCCompiler [ 5 вересня 2012 у Wayback Machine.] - засіб для компіляції коду на мові Сі у вид, придатний для виконання у віртуальній машині Adobe Flash;
- LLDB [1] [ 6 серпня 2012 у Wayback Machine.] - модульна інфраструктура зневадження, використовує такі підсистеми LLVM як API для дизасемблювання, Clang AST (Abstract Syntax Tree), парсер виразів, генератор коду і JIT-компілятор. LLDB підтримує зневадження багатонитевих програм на мовах C, Objective-C і ; відрізняється можливістю підключення плагінів і скриптів на мові Python; демонструє екстремально високу швидкодія при зневадженні програм великого розміру;
- Emscripten [2] [ 20 березня 2017 у Wayback Machine.] - транскомпілятор біткоду LLVM в JavaScript, що дозволяє перетворити для запуску в браузері застосунки, спочатку написані на мові Сі. Наприклад, вдалося запустити Python, Lua, Quake, Freetype;
- sparse-llvm[недоступне посилання з червня 2019] —— бекенд, націлений на створення Сі-компілятора, здатного збирати ядро Linux.
- Portable OpenCL — відкрита і незалежна реалізація стандарту OpenCL;
- CUDA Compiler — дозволяє згенерувати GPU-інструкції з коду, написаного на мовах Сі, Сі++ та Fortran;
- Julia — відкрита динамічна мова програмування, що використовує напрацювання проєкту LLVM.
Відзнаки
У 2010 Асоціація обчислювальної техніки (ACM), найавторитетніша міжнародна організація, в області комп'ютерних систем присудила проєкту LLVM премію за внесок у розвиток мов програмування (SIGPLAN Programming Languages Software Award). Премія присуджується за значний вплив на пов'язані з мовами програмування дослідження, реалізації технологій і інструменти.
Примітки
- https://github.com/llvm/llvm-project/graphs/contributors?type=a
- . Архів оригіналу за 26 листопада 2018. Процитовано 15 січня 2019.
- LLVM: Frequently Asked Questions. Архів оригіналу за 13 липня 2013. Процитовано 23 грудня 2010.
Посилання
- LLVM [ 3 травня 2004 у Wayback Machine.]
- libJIT Linear Scan Register Allocator [Архівовано 12 лютого 2012 у WebCite]
- Amy Brown and Greg Wilson (eds.). Chapter 11. LLVM (Chris Lattner) // The Architecture of Open Source Applications. — 2011. — P. 155-170. — .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Low Level Virtual Machine LLVM universalna sistema analizu transformaciyi i optimizaciyi program sho realizuye virtualnu mashinu z RISC podibnimi instrukciyami Mozhe vikoristovuvatisya yak optimizuvalnij kompilyator cogo bajt kodu v mashinnij kod dlya riznih arhitektur abo dlya jogo interpretaciyi ta JIT kompilyaciyi dlya deyakih platform LLVMTip Kompilyatori optimizatori i generatori koduRozrobniki LLVM Developer GroupPershij vipusk 24 zhovtnya 2003Stabilnij vipusk 17 0 6 28 listopada 2023 Operacijna sistema krosplatformnistMova programuvannya C Licenziya University of Illinois Open Source LicenseRepozitorij github com llvm llvm projectVebsajt llvm org Mediafajli u Vikishovishi LLVM dozvolyaye kompilyuvati programi napisani movami S C ObjC Fortran Ada Haskell Java Python Ruby Rust JavaScript GLSL abo bud yakoyu inshoyu dlya yakoyi realizovano front end V ramkah proyektu rozrobleno frontend Clang dlya mov C i C i versiya GCC sho vikoristovuyut LLVM yak bekend U Glasgow Haskell Compiler takozh realizovana kompilyaciya za dopomogoyu LLVM isnuye she bezlich program sho vikoristovuyut cyu infrastrukturu IstoriyaLLVM ne prosto chergovij akademichnij proyekt Jogo istoriya pochalas u 2000 roci v Universiteti Illinojsa a teper LLVM vikoristovuyut taki giganti industriyi yak Apple Adobe ta Google Zokrema na LLVM zasnovana pidsistema OpenGL u MacOS X 10 5 a iPhone SDK vikoristovuye GCC z bekendom na LLVM Apple ta Google ye odnimi iz osnovnih sponsoriv proyektu a nathnennik LLVM Kris Lattner teper pracyuye v Apple OsoblivostiU osnovi LLVM lezhit promizhne podannya kodu intermediate representation IR nad yakim mozhna vikonuvati transformaciyi u vsi kompilyaciyi komponuvannya i vikonannya Iz nogo generuyetsya optimizovanij mashinnij kod dlya nizki platform yak statichno tak i dinamichno JIT kompilyaciya LLVM pidtrimuye generaciyu kodu dlya x86 x86 64 ARM PowerPC SPARC MIPS IA 64 Alpha LLVM napisana na C i portovana na bilshist unix sistem i Windows Sistema maye modulnu strukturu i mozhe rozshiryuvatis dodatkovimi algoritmami transformaciyi compiler passes i kodogeneratorami dlya novih aparatnih platform Frontend koristuvacha yak pravilo linkuyetsya iz LLVM i vikoristovuye C API dlya generaciyi kodu i jogo peretvoren Odnak LLVM mistit u sobi j standalone utiliti U LLVM vklyuchena obgortka API dlya OCaml PlatformiLLVM pidtrimuye robotu na nastupnih platformah Operacijna sistema Arhitektura Kompilyator FreeBSD x86 GCC Clang FreeBSD AMD64 GCC Clang Linux AMD64 GCC Clang Linux x86 GCC Clang Mac OS X PowerPC GCC Mac OS X x86 GCC Clang Solaris GCC Cygwin Win32 x86 GCC 3 4 X Binutils 2 15 MinGW Win32 x86 GCC 3 4 X Binutils 2 15 LLVM maye chastkovu pidtrimku takih platform Operacijna sistema Arhitektura Kompilyator Windows x86 Visual Studio NET AIX PowerPC GCC Linux PowerPC GCC Linux Alpha GCC Linux Itanium IA 64 GCC HP UX Itanium IA 64 Tipi danihProsti tipi Cili chisla dovilnoyi rozryadnosti irozryadnist i1 buleve znachennya 0 abo 1 i32 32 rozryadne cile i17 i256 Generaciya mashinnogo kodu dlya tipiv duzhe velikoyi rozryadnosti ne pidtrimuyetsya Napriklad dlya x86 vam dovedetsya obmezhitis i64 a dlya x86 64 ta inshih 64 rozryadnih platform 128 bitnimi cilimi Ale dlya promizhnogo predstavlennya niyakih obmezhen nema Chisla vvazhayutsya predstavlenimi u dodatkovomu kodi Na rivni tipiv riznici mizh znakovimi i bezznakovimi cilimi ne isnuye u tih vipadkah koli ce maye znachennya z nimi pracyuyut rizni instrukciyi Chisla z ruhomoyu komoyu float double tipi specifichni dlya konkretnoyi platformi napriklad x86 fp80 Puste znachennya void Pohidni tipi Vkazivniki tip i32 vkazivnik na 32 bitne cile Masivi chislo elementiv x tip 10 x i32 8 x double Strukturi i32 i32 double Vektor specialnij tip dlya sproshennya SIMD operacij Vektor skladayetsya iz 2 n znachen primitivnogo tipu cilogo abo z plavayuchoyu krapkoyu lt chislo elementiv x tip gt lt 4 x float gt vektor XMM Funkciyi i32 i32 i32 float float float float float Sistema tipiv rekursivna tobto mozhna vikoristovuvati bagatovimirni masivi masivi struktur vkazivniki na strukturi i funkciyi i t d OperaciyiBilshist instrukcij u LLVM prijmayut dva argumenti operanda i vertayut odne znachennya triadresnij kod Znachennya viznachayutsya tekstovim identifikatorom Lokalni znachennya poznachayutsya prefiksom a globalni Lokalni znachennya takozh nazivayut registrami a LLVM virtualnoyu mashinoyu z neskinchennim chislom registriv Priklad sum add i32 n 5 diff sub double a b z add lt 4 x float gt v1 v2 poelementne dodavannya cond icmp eq x y Porivnyannya cilih chisel Rezultat maye tip i1 success call i32 puts i8 str Tip operandiv zavzhdi vkazuyetsya yavno i odnoznachno viznachaye tip rezultatu Operandi arifmetichnih instrukcij povinni mati odnakovij tip ale sami instrukciyi perevantazheni dlya bud yakih chislovih tipiv i vektoriv LLVM pidtrimuye povnij nabir arifmetichnih operacij pobitovih logichnih operacij i operacij zsuvu a takozh specialni instrukciyi dlya roboti z vektorami LLVM IR strogo tipizovanij tomu isnuyut operaciyi privedennya tipiv yaki yavno koduyutsya specialnimi instrukciyami Nabir iz 9 instrukcij pokrivaye vsi mozhlivi privedennya mizh riznimi chislovimi tipami cilimi i z ruhomoyu komoyu iz znakom i bez riznoyi rozryadnosti i t p Krim cogo ye instrukciyi peretvorennya mizh cilimi i vkazivnikami a takozh instrukciya bitcast yaka privede vse do vsogo ale za rezultat vi vidpovidayete sami Pam yatKrim znachen registriv u LLVM ye i robota iz pam yattyu Znachennya v pam yati adresuyutsya tipizovanimi vkazivnikami Zvernutisya do pam yati mozhna za dopomogoyu dvoh instrukcij load i store Napriklad x load i32 x ptr otrimati znachennya tipu i32 po vkazivniku x ptr tmp add i32 x 5 dodati 5 store i32 tmp i32 x ptr i povernuti nazad Instrukciya malloc translyuyetsya u viklik odnojmennoyi sistemnoyi funkciyi i vidilyaye pam yat u kupi povertayuchi znachennya vkazivnik viznachenogo tipu U pari z neyu jde instrukciya free struct ptr malloc double double string malloc i8 i32 length array malloc 16 x i32 free i8 string Instrukciya alloca vidilyaye pam yat na steku x ptr alloca double x ptr maye tip double array alloca float i32 8 array maye tip float a ne 8 x float Pam yat vidilena alloca avtomatichno zvilnyayetsya pri vihodi iz funkciyi za dopomogoyu instrukcij ret abo unwind Suputni proyektiZ proyektiv zasnovanih na LLVM sho rozvivayutsya paralelno mozhna vidznachiti KLEE 25 grudnya 2012 u Wayback Machine simvolnij analizator i generator testovih naboriv Runtime biblioteka compiler rt 6 lipnya 2009 u Wayback Machine llvm mc 15 sichnya 2013 u Wayback Machine avtogenerator asemblera dizasemblera ta inshih pov yazanih z mashinnim kodom komponentiv na osnovi opisiv parametriv LLVM sumisnih platform VMKit 9 listopada 2020 u Wayback Machine virtualna mashina dlya Java i NET Realizaciya funkcijnoyi movi programuvannya Pure nedostupne posilannya z chervnya 2019 LDC Arhivovano 18 travnya 2012 u WebCite kompilyator dlya optimizator statichnij i JIT kompilyator dlya movi PHP Virtualni mashini dlya Ruby Rubinius 13 grudnya 2015 u Wayback Machine i MacRuby 24 grudnya 2012 u Wayback Machine Unladen Swallow 10 lyutogo 2011 u Wayback Machine realizaciya movi Python LLVM Lua 22 sichnya 2009 u Wayback Machine FlashCCompiler 5 veresnya 2012 u Wayback Machine zasib dlya kompilyaciyi kodu na movi Si u vid pridatnij dlya vikonannya u virtualnij mashini Adobe Flash LLDB 1 6 serpnya 2012 u Wayback Machine modulna infrastruktura znevadzhennya vikoristovuye taki pidsistemi LLVM yak API dlya dizasemblyuvannya Clang AST Abstract Syntax Tree parser viraziv generator kodu i JIT kompilyator LLDB pidtrimuye znevadzhennya bagatonitevih program na movah C Objective C i C vidriznyayetsya mozhlivistyu pidklyuchennya plaginiv i skriptiv na movi Python demonstruye ekstremalno visoku shvidkodiya pri znevadzhenni program velikogo rozmiru Emscripten 2 20 bereznya 2017 u Wayback Machine transkompilyator bitkodu LLVM v JavaScript sho dozvolyaye peretvoriti dlya zapusku v brauzeri zastosunki spochatku napisani na movi Si Napriklad vdalosya zapustiti Python Lua Quake Freetype sparse llvm nedostupne posilannya z chervnya 2019 bekend nacilenij na stvorennya Si kompilyatora zdatnogo zbirati yadro Linux Portable OpenCL vidkrita i nezalezhna realizaciya standartu OpenCL CUDA Compiler dozvolyaye zgeneruvati GPU instrukciyi z kodu napisanogo na movah Si Si ta Fortran Julia vidkrita dinamichna mova programuvannya sho vikoristovuye napracyuvannya proyektu LLVM VidznakiU 2010 Asociaciya obchislyuvalnoyi tehniki ACM najavtoritetnisha mizhnarodna organizaciya v oblasti komp yuternih sistem prisudila proyektu LLVM premiyu za vnesok u rozvitok mov programuvannya SIGPLAN Programming Languages Software Award Premiya prisudzhuyetsya za znachnij vpliv na pov yazani z movami programuvannya doslidzhennya realizaciyi tehnologij i instrumenti Primitkihttps github com llvm llvm project graphs contributors type a Arhiv originalu za 26 listopada 2018 Procitovano 15 sichnya 2019 LLVM Frequently Asked Questions Arhiv originalu za 13 lipnya 2013 Procitovano 23 grudnya 2010 PosilannyaLLVM 3 travnya 2004 u Wayback Machine libJIT Linear Scan Register Allocator Arhivovano 12 lyutogo 2012 u WebCite Amy Brown and Greg Wilson eds Chapter 11 LLVM Chris Lattner The Architecture of Open Source Applications 2011 P 155 170 ISBN 978 1 257 63801 7