LLVM - LLVM

LLVM
Логотип LLVM
Оригинальный автор (ы)Викрам Адве, Крис Латтнер
Разработчики)Группа разработчиков LLVM
изначальный выпуск2003; 17 лет назад (2003)
Стабильный выпуск
11.0.0 / 12 октября 2020 г.; 54 дней назад (2020-10-12)[1]
Репозиторий Отредактируйте это в Викиданных
Написано вC ++
Операционная системаКроссплатформенность
ТипКомпилятор
ЛицензияUIUC (BSD-стиль )
Лицензия Apache 2.0 с исключениями LLVM (v9.0.0 или новее)[2]
Интернет сайтwww.llvm.org

В LLVM компилятор инфраструктурный проект представляет собой набор компилятора и набор инструментов технологии,[3] который можно использовать для разработки внешний интерфейс для любого язык программирования и задняя часть для любого архитектура набора команд. LLVM разработан на основе независимый от языка промежуточное представление (IR), который служит портативный, высокий уровень язык ассемблера это может быть оптимизированный с множеством преобразований за несколько проходов.[4]

LLVM написан на C ++ и предназначен для время компиляции, время ссылки, время выполнения, и оптимизация "простой". Первоначально реализовано для C и C ++, не зависящий от языка дизайн LLVM с тех пор породил широкий спектр передние концы: языки с компиляторами, использующими LLVM, включают ActionScript, Ада, C #,[5][6][7] Common Lisp, Кристалл, CUDA, D, Delphi, Дилан, Фортран, Графический G,[8] Галогенид, Haskell, Байт-код Java, Юля, Котлин, Lua, Цель-C, OpenCL,[9] PostgreSQL SQL и PLpgSQL,[10] Рубин,[11] Ржавчина, Scala,[12] Swift, и Xojo.

История

Проект LLVM стартовал в 2000 г. Университет Иллинойса в Урбане-Шампейн, под руководством Викрам Адве и Крис Латтнер. LLVM изначально разрабатывался как исследовательская инфраструктура для исследования динамическая компиляция техники для статики и динамичный языки программирования. LLVM был выпущен под Лицензия открытого исходного кода Университета Иллинойса / NCSA,[2] а разрешающая лицензия свободных программ. В 2005 году, Apple Inc. нанял Латтнера и сформировал команду для работы над системой LLVM для различных целей в системах разработки Apple.[13] LLVM является неотъемлемой частью последних инструментов разработки Apple для macOS и iOS.[14]

Название LLVM изначально был инициализм для Виртуальная машина низкого уровня. Это сокращение было официально удалено, чтобы избежать путаницы, поскольку LLVM превратился в зонтичный проект, который имеет мало отношения к тому, что большинство нынешних разработчиков считают (точнее) обрабатывать виртуальные машины.[15] Теперь LLVM - это бренд, который относится к зонтичному проекту LLVM, LLVM промежуточное представление (IR), LLVM отладчик, реализация LLVM Стандартная библиотека C ++ (при полной поддержке C ++ 11 и C ++ 14[16]) и т. д. LLVM находится в ведении LLVM Foundation. Его президентом является инженер-компилятор Таня Латтнер.[17]

«За проектирование и внедрение LLVM», то Ассоциация вычислительной техники представили Викрама Адве, Криса Латтнера и Эван Ченг с 2012 Награда ACM Software System.[18]

Начиная с версии 9.0.0, он был перелицензирован на Лицензия Apache 2.0 с исключениями LLVM.[2]

особенности

LLVM может обеспечить промежуточные уровни полной системы компиляции, принимая промежуточное представление (IR) код из компилятор и излучение оптимизированного ИК-излучения. Затем этот новый IR можно преобразовать и связать в машинно-зависимый язык ассемблера код для целевой платформы. LLVM может принять IR от Коллекция компиляторов GNU (GCC) набор инструментов, что позволяет использовать его с широким спектром существующих компиляторов, написанных для этого проекта.

LLVM также может генерировать перемещаемый машинный код во время компиляции или во время компоновки или даже в двоичном машинном коде во время выполнения.

LLVM поддерживает независимый от языка Набор инструкций и система типов.[4] Каждая инструкция находится в статическая форма единого назначения (SSA), что означает, что каждый переменная (называемый типизированным регистром) назначается один раз, а затем фиксируется. Это помогает упростить анализ зависимостей между переменными. LLVM позволяет компилировать код статически, как в традиционной системе GCC, или оставлять его для поздней компиляции из IR в машинный код через своевременная компиляция (JIT), аналогично Ява. Система типов состоит из основных типов, таких как целое число или плавающая точка числа и пять производные типы: указатели, массивы, векторов, структуры, и функции. Конструкция типа на конкретном языке может быть представлена ​​путем объединения этих базовых типов в LLVM. Например, класс в C ++ может быть представлен сочетанием структур, функций и массивов указатели на функции.

Компилятор LLVM JIT может оптимизировать ненужные статические ответвления программы во время выполнения и, таким образом, полезен для частичная оценка в случаях, когда у программы много опций, большинство из которых можно легко определить как ненужные в конкретной среде. Эта функция используется в OpenGL трубопровод Mac OS X Leopard (v10.5) для поддержки отсутствующих аппаратных функций.[19]

Графический код в стеке OpenGL можно оставить в промежуточном представлении, а затем скомпилировать при запуске на целевой машине. В системах с high-end графические процессоры (GPU), результирующий код остается довольно тонким, передавая инструкции на GPU с минимальными изменениями. В системах с графическими процессорами низкого уровня LLVM будет компилировать дополнительные процедуры, которые выполняются на локальном компьютере. центральное процессорное устройство (CPU), которые имитируют инструкции, которые графический процессор не может выполнять внутренне. LLVM улучшил производительность на слабых машинах, используя Intel GMA чипсеты. Аналогичная система была разработана в рамках Галлий3D LLVMpipe и включен в ГНОМ shell, чтобы он мог работать без загруженного надлежащего аппаратного драйвера 3D.[20]

Что касается производительности скомпилированных программ во время выполнения, в 2011 году GCC раньше превосходил LLVM в среднем на 10%.[21][22] Новые результаты, полученные в 2013 году, показывают, что LLVM теперь догнал GCC в этой области и теперь компилирует двоичные файлы примерно равной производительности.[23]

Компоненты

LLVM стал зонтичным проектом, состоящим из нескольких компонентов.

Передние концы

LLVM изначально был написан как замена существующей генератор кода в стеке GCC,[24] и многие внешние интерфейсы GCC были модифицированы для работы с ним, в результате чего появился уже не существующий пакет LLVM-GCC. Модификации обычно включают этап IR-преобразования GIMPLE в LLVM, так что оптимизаторы LLVM и кодогенерацию можно использовать вместо системы GIMPLE GCC. Apple была значительным пользователем LLVM-GCC через Xcode 4.x (2013 г.).[25][26] Такое использование интерфейса GCC считалось в основном временной мерой, но с появлением Лязг и преимущества LLVM и современная модульная кодовая база Clang (а также скорость компиляции) в основном устарели.

LLVM в настоящее время поддерживает компиляцию Ада, C, C ++, D, Delphi, Фортран, Haskell, Юля, Цель-C, Ржавчина, и Swift используя различные передние концы.

Широкий интерес к LLVM привел к нескольким усилиям по разработке новых интерфейсов для множества языков. Наибольшее внимание привлек Clang, новый компилятор, поддерживающий C, C ++ и Objective-C. Clang, в первую очередь поддерживаемый Apple, нацелен на замену компилятора C / Objective-C в системе GCC на систему, которая более легко интегрируется с интегрированные среды разработки (IDE) и имеет более широкую поддержку многопоточность. Поддержка для OpenMP директивы были включены в Лязг начиная с выпуска 3.8.[27]

Утрехт Haskell компилятор может генерировать код для LLVM. Хотя генератор находится на ранних стадиях разработки, во многих случаях он оказался более эффективным, чем генератор кода C.[28] Существует Компилятор Glasgow Haskell (GHC), использующий LLVM, который обеспечивает 30% ускорение скомпилированного кода по сравнению с компиляцией собственного кода с помощью генерации кода GHC или C с последующей компиляцией, при этом отсутствует только один из многих методов оптимизации, реализованных GHC.[29]

Многие другие компоненты находятся на разных стадиях разработки, включая, помимо прочего, Ржавчина компилятор, Байт-код Java передняя часть, а Общий промежуточный язык (CIL) передняя часть, MacRuby реализация Ruby 1.9, различные интерфейсы для Стандартный ML, и новый раскраска графика распределитель регистров.[нужна цитата ]

Промежуточное представительство

LLVM IR используется, например, radeonsi и llvmpipe. Оба являются частью Меса 3D.

Ядром LLVM является промежуточное представление (IR), язык программирования низкого уровня, похожий на ассемблер. IR - это строго типизированный вычисление с сокращенным набором команд (RISC) набор инструкций, который абстрагирует большинство деталей цели. Например, соглашение о вызовах абстрагируется через вызов и Ret инструкции с явными аргументами. Кроме того, вместо фиксированного набора регистров IR использует бесконечный набор временных файлов в виде% 0,% 1 и т. Д. LLVM поддерживает три эквивалентных формы IR: удобочитаемый формат сборки, формат в памяти, подходящий для интерфейсы и плотный формат битового кода для сериализации. Просто "Привет мир!" программа в ИК-формате:[30]

@ .str = внутренний постоянный [14 Икс i8] c"привет, мир  0A  00"объявить i32 @printf(i8*, ...)определить i32 @основной(i32 % argc, i8** % argv) существительное {запись:    % tmp1 = getelementptr [14 Икс i8], [14 Икс i8]* @ .str, i32 0, i32 0    % tmp2 = вызов i32 (i8*, ...) @printf( i8* % tmp1 ) существительное    Ret i32 0}

Использование множества различных соглашений и функций, предоставляемых разными целями, означает, что LLVM не может действительно создать независимый от цели IR и перенаправить его, не нарушая некоторых установленных правил. Примеры целевой зависимости, помимо того, что явно указано в документации, можно найти в предложении 2011 года для «wordcode», полностью независимого от цели варианта LLVM IR, предназначенного для онлайн-распространения.[31] Более практический пример: PNaCl.[32]

Задняя часть

В версии 3.4 LLVM поддерживает множество наборы инструкций, в том числе РУКА, Qualcomm Hexagon, MIPS, Nvidia Параллельное выполнение потока (PTX; называется NVPTX в документации LLVM), PowerPC, AMD TeraScale,[33] AMD Графическое ядро ​​Next (GCN), SPARC, z / Архитектура (называется SystemZ в документации LLVM), x86, x86-64, и XCore. Некоторые функции недоступны на некоторых платформах. Большинство функций присутствует для x86, x86-64, z / Architecture, ARM и PowerPC.[34] RISC-V поддерживается начиная с версии 7. В прошлом LLVM также полностью или частично поддерживал другие бэкэнд, включая бэкэнд C, Ячейка СПУ, mblaze (MicroBlaze),[35] AMD R600, DEC / Compaq Альфа (Альфа AXP )[36] и Nios2,[37] но большая часть этого оборудования в основном устарела, и поддержка и обслуживание LLVM не могут быть оправданы.

LLVM также поддерживает WebAssembly в качестве цели, позволяя скомпилированным программам выполняться в средах с поддержкой WebAssembly, таких как Гугл Хром / Хром, Fire Fox, 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.[38] lld направлен на устранение зависимости от стороннего компоновщика. По состоянию на май 2017 г., lld поддерживает ELF, PE / COFF, Мачо, и WebAssembly[39] в порядке убывания полноты. lld быстрее, чем оба варианта GNU ld.[38]

В отличие от компоновщиков GNU, lld имеет встроенную поддержку оптимизация времени компоновки. Это позволяет ускорить генерацию кода, поскольку позволяет обойти использование подключаемого модуля компоновщика, но, с другой стороны, запрещает взаимодействие с другими разновидностями LTO.[40]

Стандартная библиотека C ++

Проект LLVM включает в себя реализацию Стандартная библиотека C ++ называется libc ++, имеющая двойную лицензию под Лицензия MIT и Лицензия UIUC.[41]

Начиная с версии 9.0.0, он был перелицензирован на Лицензия Apache 2.0 с исключениями LLVM.[2]

Полли

Это реализует набор оптимизаций расположения кэша, а также автопараллелизм и векторизацию с использованием многогранной модели.[42]

Отладчик

Производные

Из-за разрешающей лицензии многие поставщики выпускают собственные настроенные форки LLVM. Это официально признано в документации LLVM, которая по этой причине предлагает не использовать номера версий при проверке функций.[43] Некоторые из поставщиков включают:

Смотрите также

Литература

  • Крис Латтнер - Архитектура приложений с открытым исходным кодом - Глава 11 LLVM, ISBN  978-1257638017, выпущенный в 2012 году под CC BY 3.0 (Открытый доступ ).[49]
  • LLVM: платформа компиляции для непрерывного анализа и преобразования программ, опубликованная статья Крис Латтнер, Викрам Адве

использованная литература

  1. ^ "Выпуск LLVM 11.0.0". Github. 12 октября 2020 г.. Получено 13 октября, 2020.
  2. ^ а б c d "LICENSE.TXT". llvm.org. Получено 24 сентября, 2019.
  3. ^ "Проект инфраструктуры компилятора LLVM". Получено 11 марта, 2016.
  4. ^ а б "Справочное руководство по языку LLVM". Получено 9 июня, 2019.
  5. ^ «Представляем LLILC - новый компилятор на основе LLVM для .NET». dotnetfoundation.org. Получено 12 сентября, 2020.
  6. ^ Моно LLVM, получено 10 марта, 2013
  7. ^ Крис Латтнер (2011). "LLVM". В Эми Браун; Грег Уилсон (ред.). Архитектура приложений с открытым исходным кодом.
  8. ^ Уильям Вонг (23 мая 2017 г.). "В чем разница между LabVIEW 2017 и LabVIEW NXG?". Электронный дизайн.
  9. ^ Майкл Ларабель (11 апреля 2018 г.). «Хронос официально объявляет о выпуске переводчика LLVM / SPIR-V». phoronix.com.
  10. ^ https://www.postgresql.org/docs/12/jit-reason.html
  11. ^ "Особенности". RubyMotion. ООО "Скретчворк Девелопмент". Получено 17 июня, 2017. RubyMotion преобразует исходный код Ruby вашего проекта в ... машинный код с помощью [n] ... опережающего компилятора (AOT), основанного на LLVM.
  12. ^ Риди, Джефф (24 сентября 2012 г.). «Компиляция Scala в LLVM». Сент-Луис, штат Миссури, США. Получено 19 февраля, 2013. Цитировать журнал требует | журнал = (Помогите)
  13. ^ Адам Трит (19 февраля 2005 г.), mkspecs и патчи для LLVM-компиляции Qt4, заархивировано из оригинал 4 октября 2011 г., получено 27 января, 2012
  14. ^ "Компилятор Apple LLVM", Инструменты разработчика, Яблоко, получено 27 января, 2012
  15. ^ Латтнер, Крис (21 декабря 2011 г.). «Название LLVM». llvm-dev (Список рассылки). Получено 2 марта, 2016.
  16. ^ ""libc ++ "Стандартная библиотека C ++".
  17. ^ Крис Латтнер (3 апреля 2014 г.). «Фонд LLVM». Блог проекта LLVM.
  18. ^ «Премия ACM Software System». ACM.
  19. ^ Крис Латтнер (15 августа 2006 г.). «Отличное использование LLVM в Apple: стек OpenGL». llvm-dev (Список рассылки). Получено 1 марта, 2016.
  20. ^ Майкл Ларабель, «Оболочка GNOME работает без поддержки драйверов графического процессора», фороникс, 6 ноября 2011 г.
  21. ^ В. Макаров. «SPEC2000: Сравнение LLVM-2.9 и GCC4.6.1 на x86». Получено 3 октября, 2011.
  22. ^ В. Макаров. «SPEC2000: Сравнение LLVM-2.9 и GCC4.6.1 на x86_64». Получено 3 октября, 2011.
  23. ^ Майкл Ларабель (27 декабря 2012 г.). "Компилятор LLVM / Clang 3.2, конкурирующий с GCC". Получено 31 марта, 2013.
  24. ^ Латтнер, Крис; Викрам Адве (май 2003 г.). Архитектура для GCC следующего поколения. Первый ежегодный саммит разработчиков GCC. Получено 6 сентября, 2009.
  25. ^ "Обзор компилятора LLVM". developer.apple.com.
  26. ^ «Примечания к выпуску Xcode 5». Apple Inc..
  27. ^ «Примечания к выпуску Clang 3.8». Получено 24 августа, 2016.
  28. ^ "Компиляция Haskell в LLVM". Получено 22 февраля, 2009.
  29. ^ "Блог проекта LLVM: компилятор Glasgow Haskell и LLVM". Получено 13 августа, 2010.
  30. ^ Для получения полной документации см. llvm.org/ docs/ LangRef.html.
  31. ^ Кан, Джин-Гу. «Wordcode: больше целевой независимый битовый код LLVM» (PDF). Получено 1 декабря, 2019.
  32. ^ «PNaCl: переносимые исполняемые файлы собственного клиента» (PDF). Архивировано из оригинал (PDF) 2 мая 2012 г.. Получено 25 апреля 2012.
  33. ^ Стеллард, Том (26 марта 2012 г.). «[LLVMdev] RFC: R600, новый бэкэнд для графических процессоров AMD». llvm-dev (Список рассылки).
  34. ^ Примечания по реализации для конкретных целей: матрица целевых характеристик // Генератор кода, не зависящий от целей LLVM, сайт LLVM.
  35. ^ "Удалите серверную часть mblaze из llvm". GitHub. 25 июля 2013 г.. Получено 26 января, 2020.
  36. ^ "Удалите бэкэнд Alpha". GitHub. 27 октября 2011 г.. Получено 26 января, 2020.
  37. ^ "[Nios2] Удалить серверную часть Nios2". GitHub. 15 января 2019 г.,. Получено 26 января, 2020.
  38. ^ а б "lld - компоновщик LLVM". Проект LLVM. Получено 10 мая, 2017.
  39. ^ "Порт WebAssembly lld".
  40. ^ "42446 - lld не может обрабатывать файлы gcc LTO". bugs.llvm.org.
  41. ^ ""libc ++ "Стандартная библиотека C ++".
  42. ^ "Polly - многогранные оптимизации для LLVM".
  43. ^ "Расширения языка Clang". Документация Clang 12. Обратите внимание, что номера маркетинговых версий не следует использовать для проверки языковых функций, поскольку разные поставщики используют разные схемы нумерации. Вместо этого используйте макросы проверки функций.
  44. ^ "яблоко / llvm-project". Яблоко. 5 сентября 2020.
  45. ^ "ланл / кицунэ". Лос-Аламосская национальная лаборатория. 27 февраля 2020 г.
  46. ^ Набор инструментов разработчика для ps4 (PDF), получено 24 февраля, 2015
  47. ^ "Спецификация NVVM IR 1.5". Текущая версия NVVM IR основана на LLVM 5.0.
  48. ^ «Компиляторы IBM C / C ++ и Fortran для внедрения инфраструктуры с открытым исходным кодом LLVM».
  49. ^ Крис Латтнер (15 марта 2012 г.). «Глава 11». Архитектура приложений с открытым исходным кодом. Эми Браун, Грег Уилсон. ISBN  978-1257638017.

внешние ссылки