Что именно LLVM?

464

Я постоянно слышу о LLVM. Это на Perl, потом на Haskell, потом кто-то использует его на каком-то другом языке? Что это?

bodacydo
источник
45
В книге есть хорошая глава, в которой все подробно объясняется
Дэвид

Ответы:

369

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

LLVM может использоваться в качестве среды компилятора, где вы предоставляете «внешний конец» (анализатор и лексер) и «внутренний конец» (код, который преобразует представление LLVM в фактический машинный код).

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

Если вам интересно, вы можете поиграть с машинным кодом LLVM, который генерируется из кода C или C ++ на их демонстрационной странице , но демонстрационная страница в настоящее время отключена с 2013 года.

LiraNuna
источник
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 посмотреть мой профиль
Теперь вы можете играть с LLVM, сгенерированным из C / C ++, используя Compiler Explorer. godbolt.org
Галактика
112

Хорошее резюме LLVM это:

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

На фронтенде у вас есть Perl и многие другие языки высокого уровня. На сервере у вас есть встроенный код, который запускается непосредственно на компьютере.

В центре ваше промежуточное представление кода. Если каждый язык высокого уровня может быть представлен в этом формате IR LLVM, то инструменты анализа, основанные на этом IR, могут быть легко использованы повторно - это основное обоснование.

Питер Теох
источник
39
картинка стоит тысячи слов i
ipatch
3
Так что кажется, что LLVM полезен для разработчиков компиляторов. Должен ли программист заботиться, компилирует ли он со стандартным компилятором или компилятором, основанным на LLVM, помимо анализа сгенерированного кода независимо от исходного кода?
Джинави
4
если вы можете скомпилировать LLVM для его IR, то вам будет доступно множество инструментов для анализа IR. Но если ваш инструмент способен анализировать только собственные двоичные файлы (например, x86), то не имеет значения, является ли это двоичными файлами, сгенерированными LLVM, или сгенерированными с помощью gcc, или сгенерированными Intel-компилятором.
Питер Теох
73

LLVM (используется для обозначения «Низкоуровневая виртуальная машина», но больше не является) - это инфраструктура компилятора, написанная на C ++, которая предназначена для оптимизации написанных программ во время компиляции, во время соединения, во время выполнения и во время простоя. в произвольных языках программирования. Первоначально реализованный для C / C ++, независимый от языка дизайн (и успех) LLVM породил широкий спектр внешних интерфейсов, включая Objective C, Fortran, Ada, Haskell, байт-код Java, Python, Ruby, ActionScript, GLSL. , и другие.

Прочитайте это для более подробного объяснения.
Также проверьте Unladen Swallow

N 1.1
источник
13
.. так, что доктора пытаются сказать; в то время как LLVM является аббревиатурой для низкоуровневой виртуальной машины , проект называется просто LLVM , а не полностью прописанные слова.
Йохем Куиджперс
2
Раньше оно имело аббревиатуру выше, но позже было удалено en.wikipedia.org/wiki/LLVM
VVB
2
Подведем итоги комментирования. «Низкоуровневая виртуальная машина (LLVM)» должна быть чем-то вроде «LLVM (что означало« Низкоуровневая виртуальная машина »ранее в течение срока службы проектов)»
ssokolow
52

Согласно книге «Начало работы с основными библиотеками LLVM» (c):

На самом деле, имя LLVM может относиться к любому из следующего:

  • Проект / инфраструктура LLVM: это зонтик для нескольких проектов, которые вместе образуют полный компилятор: внешние интерфейсы, серверные части, оптимизаторы, ассемблеры, компоновщики, libc ++, compiler-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 имеет это значение при использовании в таких предложениях, как «Я создал интерфейс, который переводит мой собственный язык в LLVM».

Ittrin
источник
35

LLVM - это библиотека, используемая для создания компиляторов и / или программного обеспечения, ориентированного на язык. Основная суть в том, что хотя у вас есть gcc, который, вероятно, является наиболее распространенным набором компиляторов, он не предназначен для повторного использования, т.е. трудно взять компоненты из gcc и использовать его для создания собственного приложения. LLVM хорошо решает эту проблему, создавая набор «модульных и многократно используемых технологий компиляторов и наборов инструментов», которые каждый может использовать для создания компиляторов и языкового программного обеспечения.

redbandit
источник
6
Итак, LLVM - это библиотека, а Clang - это компилятор?
Абдул
11
Clang является компилятором внешнего интерфейса C / C ++ LLVM. Он преобразует код C в битовый код LLVM, который переводится на некоторый язык ассемблера внутренним компилятором.
Борис Малдер
6

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

Важно отметить, что LLVM предоставляет вам библиотеки для написания ваших собственных пропусков. Например, если вам требуется добавить проверку диапазона для определенных аргументов, которые передаются в определенные функции Программы, достаточно написать простой проход LLVM.

Для получения дополнительной информации о написании вашего собственного Pass, проверьте это http://llvm.org/docs/WritingAnLLVMPass.html

Хашим Шариф
источник