Що саме таке LLVM?


464

Я постійно чую про LLVM. Це в Perl, потім у Haskell, тоді хтось використовує його якоюсь іншою мовою? Що це?


45
У книзі є хороший розділ, в якому все прекрасно пояснюється тут: www.aosabook.org/uk/llvm.html
David d C e Freitas

Відповіді:


369

LLVM - це бібліотека, яка використовується для побудови, оптимізації та створення проміжного та / або двійкового машинного коду.

LLVM може використовуватися як структура компілятора, де ви надаєте "передній кінець" (аналізатор і лексеру) і "задній кінець" (код, який перетворює представлення LLVM у фактичний код машини).

LLVM також може виступати компілятором JIT - він підтримує генерацію x86 / x86_64 та PPC / PPC64 з швидкими оптимізаціями коду, спрямованими на швидкість компіляції.

Якщо вам цікаво, ви можете грати з машинним кодом LLVM, який генерується з коду C або C ++ на їх демонстраційній сторінці , але демо-сторінку наразі вимкнено з 2013 року.


39
Якщо ви хочете пограти з ним, подивіться цю дивовижну статтю: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna

29
Посилання, надане у відповіді, говорить: "Демо-сторінка LLVM наразі вимкнена."
EngrStudent

5
ellcc.org/demo/index.cgi - це ще один спосіб пограти з компіляцією C / C ++ через LLVM до різних цілей, включаючи проміжний код
Том Гудфллоу,

1
чи можете ви навести фактичний приклад того, що це означає?
Migrate2Lazarus дивіться мій профіль

112

Хороший підсумок LLVM такий:

введіть тут опис зображення

У передній частині у вас є Perl та багато інших мов високого рівня. На вихідному у вас є вихідний код, який працює безпосередньо на машині.

У центрі - ваше проміжне представлення коду. Якщо кожна мова високого рівня може бути представлена ​​в цьому ІК-форматі LLVM, то інструменти аналізу, засновані на цьому ІК, можуть бути легко використані - це основне обгрунтування.


39
картина варта тисячі слів 👍
ipatch

3
Тож здається, що LLVM корисний для дизайнерів-компіляторів. Чи повинен піклуватися програміст, якщо він компілює зі стандартним компілятором або на основі LLVM, окрім аналізу згенерованого коду незалежно від вихідного коду?
jinawee

4
якщо ви можете компілювати LLVM з його ІК, то для аналізу ІК вам може бути відкрито багато інструментів. Але якщо ваш інструмент здатний аналізувати лише нативні бінарні файли (наприклад, x86), то, чи це бінарні файли, згенеровані LLVM, або бінарні файли, згенеровані gcc, або генерований компілятором Intel, не має різниці.
Петро Тео

73

LLVM (раніше використовується "Віртуальна машина низького рівня", але більше не є) - це інфраструктура компілятора, написана на C ++, яка призначена для оптимізації часу компіляції, часу зв’язку, часу виконання та "простою" програми написаних програм. у довільних мовах програмування. Спочатку реалізований для C / C ++, мовна незалежна конструкція (і успіх) LLVM з тих пір породила широкий спектр передньої частини, включаючи Objective C, Fortran, Ada, Haskell, байт-код Java, Python, Ruby, ActionScript, GLSL , і інші.

Читати це для більш докладного пояснення
Також перевірте порожню Ластівку


13
.. так, що намагаються сказати документи; в той час як LLVM є абревіатурою для віртуальної машини низького рівня , проект називається просто LLVM , а не повністю прописаними словами.
Джохем Куджперс

2
Раніше це було вище абревіатури, але пізніше було видалено en.wikipedia.org/wiki/LLVM
VVB

2
Для узагальнення коментарів. "Віртуальна машина низького рівня (LLVM)" повинна бути чимось на кшталт "LLVM (що означало" Віртуальна машина низького рівня "раніше протягом життя проектів)"
ssokolow

52

Відповідно до книги "Початок роботи з основними бібліотеками LLVM" :

Насправді назва LLVM може посилатися на будь-яке з наведених нижче:

  • Проект / інфраструктура LLVM: Це парасолька для декількох проектів, які разом утворюють повноцінний компілятор: frontends, backends, оптимізатори, асемблери, лінкери, libc ++, компілятор-rt та двигун JIT. Слово "LLVM" має таке значення, наприклад, у наступному реченні: "LLVM складається з декількох проектів".

  • Компілятор на основі LLVM: це компілятор, побудований частково або повністю з інфраструктурою LLVM. Наприклад, компілятор може використовувати LLVM для інтерфейсу та бекенда, але використовувати системні бібліотеки GCC та GNU для завершального посилання. LLVM має таке значення в наступному реченні, наприклад: "Я використовував LLVM для компіляції програм C на платформу MIPS".

  • Бібліотеки LLVM: Це частина коду для багаторазового використання інфраструктури LLVM. Наприклад, LLVM має таке значення у реченні: "Мій проект використовує LLVM для генерування коду через його компіляційну систему Just-in-Time".

  • Ядро LLVM: Оптимізації, які відбуваються на проміжному мовному рівні, та алгоритми резервного копіювання утворюють ядро ​​LLVM, з якого розпочався проект. LLVM має таке значення у наступному реченні: "LLVM та Clang - це два різні проекти".

  • LLVM IR: Це проміжне представлення компілятора LLVM. LLVM має таке значення, коли використовується в реченнях, таких як "Я створив frontend, що перекладає мою власну мову на LLVM".


35

LLVM - це в основному бібліотека, яка використовується для створення компіляторів та / або програмного забезпечення, орієнтованого на мову. Основна суть, хоча у вас є gcc, який, мабуть, є найпоширенішим набором компіляторів, він не створений для повторного використання, тобто. важко брати компоненти з gcc і використовувати їх для створення власного додатку. LLVM добре вирішує цю проблему, створюючи набір "модульних компіляторів та технологій компіляції та багаторазового використання", які кожен може використовувати для створення компіляторів та програмно орієнтованого на мову.


6
Отже, LLVM - це бібліотека, а Кланг - компілятор?
Абдул

11
Clang - це компілятор для FLtend C / C ++ LLVM. Він перетворює код C у бітовий код LLVM, який перекладається на деяку мову складання за допомогою компілятора з резервного копіювання.
Борис Малдер

6

Інфраструктура компілятора LLVM особливо корисна для оптимізації та перетворення коду. Він також складається з ряду інструментів, що обслуговують різні звички. llvm-prof - це інструмент профілювання, який дозволяє виконувати профілювання виконання з метою виявлення точкових точок програми. Opt - це засіб оптимізації, який пропонує різні пропуски оптимізації (наприклад, усунення мертвого коду).

Важливо, що LLVM надає вам бібліотеки, щоб написати власні пасажі. Наприклад, якщо вам потрібно додати перевірку діапазону певних аргументів, переданих певним функціям програми, достатньо написати простого проходу LLVM.

Для отримання додаткової інформації про написання власного проходу перегляньте цей http://llvm.org/docs/WritingAnLLVMPass.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.