Что именно LLVM?
Я постоянно слышу о LLVM. Это на Perl, потом на Haskell, потом кто-то использует его на каком-то другом языке? Что это?
7 ответов
LLVM - это библиотека, которая используется для конструирования, оптимизации и производства промежуточного и / или двоичного машинного кода.
LLVM может использоваться в качестве среды компилятора, где вы предоставляете "внешний интерфейс" (анализатор и лексер) и "внутренний конец" (код, который преобразует представление LLVM в фактический машинный код).
LLVM также может выступать в качестве JIT-компилятора - он поддерживает генерацию сборок x86/x86_64 и PPC/PPC64 с быстрой оптимизацией кода, нацеленной на скорость компиляции.
Если вам интересно, вы можете поиграть с машинным кодом LLVM, который генерируется из кода C или C++ на их демонстрационной странице.
Хорошее резюме LLVM это:
На фронтенде у вас есть Perl и многие другие языки высокого уровня. На сервере у вас есть встроенный код, который запускается непосредственно на компьютере.
В центре ваше промежуточное представление кода. Если все языки высокого уровня могут быть представлены в этом формате IR LLVM, то инструменты анализа, основанные на этом IR, могут быть легко использованы повторно - это основной рациональный подход.
Низкоуровневая виртуальная машина (LLVM) - это инфраструктура компилятора, написанная на C++, предназначенная для оптимизации программ, написанных на произвольных языках программирования, во время компиляции, компоновки, выполнения и простоя. Первоначально реализованный для C/C++, независимый от языка дизайн (и успех) LLVM породил широкий спектр внешних интерфейсов, включая Objective C, Fortran, Ada, Haskell, байт-код Java, Python, Ruby, ActionScript, GLSL., и другие.
Прочитайте это для большего объяснения
Также проверьте Unladen Ласточка
Согласно книге "Начало работы с основными библиотеками 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".
LLVM - это библиотека, используемая для создания компиляторов и / или программного обеспечения, ориентированного на язык. Основная суть в том, что хотя у вас есть gcc, который, вероятно, является наиболее распространенным набором компиляторов, он не предназначен для повторного использования, т.е. трудно взять компоненты из gcc и использовать его для создания собственного приложения. LLVM хорошо решает эту проблему, создавая набор "модульных и повторно используемых технологий компиляторов и наборов инструментов", которые каждый может использовать для создания компиляторов и языкового программного обеспечения.
Виртуальная машина низкого уровня (LLVM)
Альтернатива: GCC (Сборник компиляторов GNU). GDB (GNU Debugger) - инструмент отладки. Поддерживает больше языков и архитектур.
LLVM - это зонтичный проект (набор библиотек), это торговая марка с разными проектами (IR, инструмент отладки ...) И теперь это не виртуальная машина или аббревиатура. LLDB(LLVM Debugger) - инструмент отладки. При поддержке крупных компаний
Компилятор:
Language FrontEnd(Many: Clang, Haskel...) -> Optimizer(Single) -> Backend(Many: ARM, x86...)
FrontEnd генерирует
Intermediate Representation (IR)
. Этот общий язык позволяет упростить процесс масштабирования. Если вы создаете новый язык, вы отвечаете только за FrontEnd, если вы разрабатываете новую архитектуру, вам следует позаботиться о BackEnd. Это своего рода
.class
файл в JVM, которые используются
ClassLoader
[О]
Есть три эквивалентных формы:
- удобочитаемое представление на языке ассемблера
- компилятор в памяти IR,
- представление битового кода на диске [О программе]
llvm-dis
можно использовать для преобразования
bitcode
в
human readable
Инфраструктура компилятора LLVM особенно полезна для выполнения оптимизаций и преобразований в коде. Он также состоит из ряда инструментов, обслуживающих различные виды использования. llvm-prof - это инструмент профилирования, который позволяет вам выполнять профилирование выполнения для определения горячих точек программы. Opt - это инструмент оптимизации, который предлагает различные этапы оптимизации (например, удаление мертвого кода).
Важно, что LLVM предоставляет вам библиотеки для написания ваших собственных пропусков. Например, если вам требуется добавить проверку диапазона для определенных аргументов, которые передаются в определенные функции Программы, достаточно написать простой проход LLVM.
Для получения дополнительной информации о написании вашего собственного Pass, проверьте это http://llvm.org/docs/WritingAnLLVMPass.html