Лязг - Clang

Лязг
LLVM Logo.svg
Clang используется для компиляции Chicken
Clang используется для компиляции Курица
Оригинальный автор (ы)Крис Латтнер
Разработчики)Группа разработчиков LLVM
изначальный выпуск26 сентября 2007 г.; 13 лет назад (2007-09-26)[1]
Стабильный выпуск
11.0.0[2] / 12 октября 2020; 42 дней назад (2020-10-12)
Репозиторий Отредактируйте это в Викиданных
Написано вC ++
Операционная системаUnix-подобный
ПлатформаLLVM (ARMv7, AArch64, IA-32, x64, ppc64le )[3]
ТипКомпилятор
Лицензия
Интернет сайтлязгать.llvm.org

Лязг /ˈkлæŋ/[5] это интерфейс компилятора для C, C ++, Цель-C и Цель-C ++ языки программирования, так же хорошо как OpenMP,[6] OpenCL, RenderScript, CUDA и БЕДРО[7] рамки. Он использует LLVM инфраструктура компилятора как его задняя часть и был частью LLVM цикл выпуска начиная с LLVM 2.6.

Он предназначен для использования в качестве оперативной замены Коллекция компиляторов GNU (GCC), поддерживающий большинство своих флагов компиляции и неофициальных языковых расширений.[8][9] Его участники включают яблоко, Microsoft, Google, РУКА, Sony, Intel и Продвинутые Микроустройства (AMD). это программное обеспечение с открытым исходным кодом,[10] с исходный код выпущен под Лицензия Университета Иллинойса / NCSA, а разрешающая лицензия свободных программ. Начиная с версии 9.0.0, он был перелицензирован на Лицензия Apache 2.0 с исключениями LLVM.[4]

Clang 12, последняя основная версия Clang по состоянию на ноябрь 2020 г., имеет полную поддержку всех опубликованных стандартов C ++ и частичную поддержку предстоящих C ++ 20 стандарт.[11] Начиная с версии 6.0.0, Clang по умолчанию компилирует C ++ с использованием диалекта GNU ++ 14, который включает функции из C ++ 14 стандартные и соответствующие расширения GNU.[12]

В проект Clang входят передняя часть Clang, а статический анализатор и несколько инструментов для анализа кода.[13]

Фон

Начиная с 2005 года, Apple Inc. широко использовал LLVM в ряде коммерческих продуктов,[14] в том числе SDK для iOS и Xcode 3.1.

Одним из первых применений LLVM был OpenGL компилятор кода для OS X который преобразует вызовы OpenGL в более фундаментальные призывы к графические процессоры (GPU), которые не поддерживают определенные функции. Это позволило Apple поддерживать OpenGL на компьютерах, использующих Intel Graphics Media Accelerator (GMA), повышая производительность на этих машинах.[15] Для графических процессоров, которые его поддерживают, код компилируется для полного использования базового оборудования, но на машинах GMA LLVM компилирует тот же код OpenGL в подпрограммы, чтобы гарантировать непрерывное правильное функционирование.

LLVM изначально предназначался для использования интерфейса GCC, но GCC, как оказалось, доставил некоторые проблемы разработчикам LLVM и в Apple. Исходный код GCC - большая и несколько громоздкая система для работы разработчиков; как сказал один давний разработчик GCC, ссылаясь на LLVM, «пытаться заставить бегемота танцевать - не очень весело».[16]

Программное обеспечение Apple активно использует Objective-C, но интерфейс Objective-C в GCC не является приоритетом для разработчиков GCC. Кроме того, GCC не интегрируется плавно в Apple интегрированная среда развития (IDE).[17] Наконец, GCC имеет лицензию на условиях Стандартная общественная лицензия GNU (GPL) версии 3, который требует, чтобы разработчики, распространяющие расширения для GCC или его модифицированные версии, исходный код доступен, тогда как LLVM имеет BSD-подобная лицензия[18] который не имеет такого требования.

Apple решила разработать новый интерфейс компилятора с нуля, поддерживающий C, Objective-C и C ++.[17] Этот «лязгающий» проект был открыт в июле 2007 года.[19]

Дизайн

Clang предназначен для работы поверх LLVM.[18] Комбинация Clang и LLVM обеспечивает большую часть набор инструментов, чтобы можно было заменить полный GCC куча. Поскольку он построен на основе библиотеки, как и остальная часть LLVM, Clang легко встраивать в другие приложения. Это одна из причин, почему большинство OpenCL реализации построены с помощью Clang и LLVM.[нужна цитата ]

Одна из основных целей Clang - предоставить архитектуру на основе библиотек,[20] чтобы компилятор был более тесно связан с инструментами, которые взаимодействуют с исходным кодом, такими как интегрированная среда развития (IDE) графический интерфейс пользователя (GUI). Напротив, GCC предназначен для работы в режиме компиляции.связь -отлаживать рабочий процесс, и интегрировать его с другими инструментами не всегда просто. Например, GCC использует шаг под названием складывать это ключ к общему процессу компиляции, побочным эффектом которого является перевод дерева кода в форму, не похожую на исходный исходный код. Если ошибка обнаружена во время или после этапа сворачивания, может быть трудно перевести ее обратно в одно место в исходном источнике. Кроме того, поставщики, использующие стек GCC в среде IDE, используют отдельные инструменты для индексации кода, чтобы обеспечить такие функции, как подсветка синтаксиса и автозаполнение.

Clang предназначен для сохранения большего количества информации в процессе компиляции, чем GCC, и для сохранения общей формы исходного кода. Цель этого - упростить отображение ошибок обратно в исходный источник. Отчеты об ошибках, предлагаемые Clang, также нацелены на то, чтобы быть более подробными и конкретными, а также быть машиночитаемыми, поэтому IDE могут индексировать вывод компилятора во время компиляции. Модульный дизайн компилятора может предложить исходный код индексация, проверка синтаксиса и другие функции, обычно связанные с быстрая разработка приложений системы. В дерево синтаксического анализа также больше подходит для поддержки автоматизированных рефакторинг кода, поскольку он напрямую представляет исходный исходный код.

Clang компилирует только C-подобные языки, такие как C, C ++, Objective-C, Objective-C ++, OpenCL, CUDA и HIP. Для других языков, например Ада LLVM остается зависимым от GCC или другого внешнего интерфейса компилятора. Во многих случаях Clang можно использовать или заменить на GCC по мере необходимости, без каких-либо других эффектов на инструментальную цепочку в целом.[нужна цитата ] Он поддерживает большинство часто используемых опций GCC. Подпроект Фланец к Nvidia и Портлендская группа добавлен Фортран поддерживать.[21]

Производительность и совместимость с GCC

Clang разработан для обеспечения высокой совместимости с GCC.[9] Clang's Интерфейс командной строки похож на многие флаги и варианты с GCC. Clang реализует множество расширений языка GNU и включает их по умолчанию. Clang реализует многие встроенные функции компилятора GCC исключительно для совместимости. Например, несмотря на то, что Clang реализует атомарные встроенные функции, которые точно соответствуют C11 атомика, он также реализует GCC __sync_ * встроенные функции для совместимости с GCC и libstdc ++. Clang также поддерживает ABI совместимость с созданным GCC объектный код. На практике Clang часто можно использовать как замену GCC.[22]

Разработчики Clang стремятся сократить объем памяти и увеличить скорость компиляции по сравнению с конкурирующими компиляторами, такими как GCC. В октябре 2007 года они сообщают, что Clang собрал Углерод библиотеки более чем в два раза быстрее, чем GCC, при этом используется примерно одна шестая памяти и дискового пространства GCC.[23] Однако по состоянию на 2011 год это был нетипичный результат.[24][25] По состоянию на середину 2014 года Clang выиграл более трети тестов, при этом GCC выиграл больше всего.[26] По состоянию на 2014 год производительность программ, скомпилированных с помощью Clang, отставала от производительности программы, скомпилированной с помощью GCC, иногда во много раз (до 5,5 раз),[26] репликация более ранних отчетов о более низкой производительности.[24]

Более поздние сравнения, проведенные в ноябре 2016 года, показывают, что оба компилятора эволюционировали, чтобы повысить свою производительность. Что касается GCC 4.8.2 по сравнению с clang 3.4, на большом количестве тестовых файлов GCC превосходит clang примерно на 17% на хорошо оптимизированном исходном коде. Результаты тестирования зависят от кода, и неоптимизированный исходный код C может устранить такие различия. Эти два компилятора теперь кажутся в целом сопоставимыми.[27][ненадежный источник ]

История статуса

В этой таблице представлены только важные шаги и выпуски в истории Clang.

ДатаОсобенности
11 июля 2007 г.Интерфейс Clang выпущен под лицензией с открытым исходным кодом
25 февраля 2009 г.Clang / LLVM может скомпилировать рабочий FreeBSD ядро.[28][29]
16 марта 2009 г.Clang / LLVM может скомпилировать рабочий DragonFly BSD ядро.[30][31]
23 октября 2009 г.Выпущен Clang 1.0, впервые с LLVM 2.6.
Декабрь 2009 г.Генерация кода для C и Objective-C достигает производственного качества. Поддержка C ++ и Objective-C ++ все еще не завершена. Clang C ++ может анализировать GCC 4.2 libstdc ++ и сгенерировать рабочий код для нетривиальных программ,[18] и может компилироваться.[32]
2 февраля 2010 г.Лязг самостоятельный хостинг.[33]
20 мая 2010 годаПоследняя версия Clang построила Библиотеки Boost C ++ успешно, и прошел почти все испытания.[34]
10 июня 2010 г.Clang / LLVM становится неотъемлемой частью FreeBSD, но компилятором по умолчанию остается GCC.[35]
25 октября 2010 г.Clang / LLVM может скомпилировать рабочий модифицированный Ядро Linux.[36]
Январь 2011 г.Завершены предварительные работы в поддержку проекта C ++ 0x стандартный, с некоторыми из новых функций черновика, поддерживаемыми в разрабатываемой версии Clang.[37][11]
10 февраля 2011 г.Clang может скомпилировать рабочий HotSpot Виртуальная машина Java.[24]
19 января 2012 г.Clang становится необязательным компонентом в NetBSD кроссплатформенная система сборки, но GCC по-прежнему используется по умолчанию.[38]
29 февраля 2012 г.Clang 3.0 может восстановить 91,2% Debian архив.[39]
29 февраля 2012 г.Clang становится компилятором по умолчанию в МИНИКС 3[40]
12 мая 2012Clang / LLVM объявили о замене GCC в FreeBSD.[41]
5 ноября 2012 г.Clang становится компилятором по умолчанию в FreeBSD 10.x на amd64 / i386.[42]
18 февраля 2013 г.Clang / LLVM может скомпилировать рабочий модифицированный Android Ядро Linux за Нексус 7.[43][44]
19 апреля 2013 г.Clang это C ++ 11 функция завершена.[45]
6 ноября 2013 г.Clang это C ++ 14 функция завершена.[46]
11 сентября 2014 г.Clang 3.5 может восстановить 94,3% архива Debian. С января 2013 года процент сбоев снизился на 1,2% на выпуск, в основном из-за повышения совместимости с флагами GCC.[47]
Октябрь 2016Clang становится компилятором по умолчанию для Android[48] (и позже только компилятор, поддерживаемый Android NDK[49]).
13 марта 2017 г.Clang 4.0.0 вышел
26 июля 2017 г.Clang становится компилятором по умолчанию в OpenBSD 6.2 на amd64 / i386.[50]
7 сентября 2017 г.Clang 5.0.0 вышел
19 января 2018 г.Clang становится компилятором по умолчанию в OpenBSD 6.3 на руку.[51]
5 марта 2018 г.Clang теперь используется для сборки Гугл Хром для Windows.[52] Mozilla делает то же изменение для Firefox в сентябре того же года.[53]
8 марта 2018 г.Clang 6.0.0 вышел
19 сентября 2018 г.Clang 7.0.0 вышел
20 марта 2019 г.Clang 8.0.0 вышел
1 июля 2019 г.Clang становится компилятором по умолчанию в OpenBSD 6.6 на mips64.[54]
19 сентября 2019 г.Clang 9.0.0 вышел с официальным RISC-V целевая поддержка.[55]
29 февраля 2020 г.Clang становится единственным компилятором C в FreeBSD базовая система, с удалением GCC.[56]
24 марта 2020 г.Clang 10.0.0 вышел
2 апреля 2020Clang становится компилятором по умолчанию в OpenBSD 6.7 на powerpc.[57]
12 Октябрь 2020Clang 11.0.0 вышел

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

Рекомендации

  1. ^ «Примечания к выпуску LLVM 2.1».
  2. ^ "Скачать релизы LLVM".
  3. ^ Страница загрузки LLVM
  4. ^ а б LICENSE.TXT, llvm.org, получено 24 сентября 2019
  5. ^ Кристофер, Эрик (3 июля 2008 г.). "просто удивляйтесь произношению Clang". LLVMdev (Список рассылки). Получено 22 сентября 2015.
  6. ^ «Поддержка OpenMP». Блог проекта LLVM. Получено 28 марта 2016.
  7. ^ «Интерфейс гетерогенных вычислений C ++ для переносимости». Получено 18 февраля 2020.
  8. ^ "Расширения языка Clang". Получено 8 ноября 2017. В дополнение к перечисленным здесь языковым расширениям Clang стремится поддерживать широкий спектр расширений GCC.
  9. ^ а б Clang - Возможности и цели: Совместимость с GCC, 15 апреля 2013
  10. ^ Clang "Приступая к работе", Clang.llvm.org, получено 18 сентября 2012
  11. ^ а б «Поддержка C ++ и C ++ '0x в Clang». LLVM.
  12. ^ «Примечания к выпуску Clang 6.0.0». LLVM.
  13. ^ «Статический анализатор Clang». LLVM. Получено 3 сентября 2009.
  14. ^ Угощение, Адам (19 февраля 2005 г.). "mkspecs и патчи для LLVM компиляции Qt4". Qt4-предварительный просмотр-обратная связь (Список рассылки). Архивировано из оригинал 4 октября 2011 г.
  15. ^ Латтнер, Крис (25 мая 2007 г.). LLVM для OpenGL и прочего (Слайды). Встреча разработчиков LLVM.
  16. ^ Задек, Кеннет (19 ноября 2005 г.). "Re: Предложение по интеграции LLVM / GCC". Разработка GCC (Список рассылки).
  17. ^ а б Нарофф, Стив (25 мая 2007 г.). Новый интерфейс LLVM C (Слайды). Встреча разработчиков LLVM.
  18. ^ а б c Команда Clang, clang: интерфейс семейства языков C для LLVM
  19. ^ Латтнер, Крис (11 июля 2007 г.). "Новый интерфейс LLVM C:" clang"". cfe-dev (Список рассылки).
  20. ^ Clang: Утилита и приложения: архитектура на основе библиотек
  21. ^ ФЛАНГ: NVIDIA переносит Fortran в LLVM
  22. ^ Clang часто можно использовать как замену GCC., Май 2020
  23. ^ Clang - Возможности и цели: быстрая компиляция и низкое использование памяти, Октябрь 2007 г.
  24. ^ а б c Симонис, Волкер (10 февраля 2011 г.). «Компиляция виртуальной машины HotSpot с помощью Clang». Архивировано из оригинал 18 февраля 2011 г.. Получено 13 февраля 2011. Хотя общая совместимость с GCC превосходна, а время компиляции впечатляет, производительность сгенерированного кода все еще ниже, чем у последней версии GCC.
  25. ^ «Сравнение LLVM и Clang с GCC 4.5». Фороникс. 21 апреля 2010 г.. Получено 13 февраля 2011. Бинарные файлы от LLVM-GCC и Clang оба изо всех сил пытались конкурировать с GCC 4.5.0 в синхронизированном тесте HMMer поиска в базе данных Pfam. LLVM-GCC и Clang были примерно на 23% медленнее (...) Хотя LLVM / Clang на данный момент не является чемпионом по производительности, оба компонента продолжают очень активно развиваться, и мы надеемся, что в ближайшее время будет опубликовано больше новостей. месяцы
  26. ^ а б «Тесты компилятора Linux GCC 4.9 VS. LLVM Clang 3.5». OpenBenchmarking.org. 14 апреля 2014 г.. Получено 25 июн 2014.
  27. ^ "Clang vs GCC - что дает лучшие двоичные файлы?". stackoverflow.com. Получено 1 октября 2018.[ненадежный источник ]
  28. ^ Дивацкий, Роман. «[Объявление] clang / llvm может скомпилировать загружаемое ядро ​​FreeBSD на i386 / amd64».
  29. ^ Сборка FreeBSD с помощью Clang, Wiki.freebsd.org, 24 августа 2012 г., получено 18 сентября 2012
  30. ^ Хорнунг, Алекс. "llvm / clang еще раз".
  31. ^ Лязг, DragonFly BSD, получено 18 сентября 2012
  32. ^ "Clang может компилировать LLVM и Clang". Блог проекта LLVM.
  33. ^ "Clang Successfully Self-Hosts". Блог проекта LLVM.
  34. ^ Грегор, Дуг. "Clang ++ Builds Boost!". Блог проекта LLVM.
  35. ^ Дэвис, Брэд. «Отчеты о статусе FreeBSD, апрель – июнь 2010 г.».
  36. ^ Clang создает работающее ядро ​​Linux (загрузка RL5 с SMP, сетью и X, собственными хостами), Lists.cs.uiuc.edu, заархивировано с оригинал 7 сентября 2015 г., получено 18 сентября 2012
  37. ^ Грегор, Дуглас (26 января 2011 г.). «Поддержка новой функции C ++ 0x в Clang» (Список рассылки). Архивировано из оригинал 30 января 2011 г.. Получено 29 января 2011.
  38. ^ Зонненбергер, Йорг (19 января 2012 г.). «Статус NetBSD и LLVM». Архивировано из оригинал 21 сентября 2016 г.. Получено 26 февраля 2014.
  39. ^ Ледру, Сильвестр. «Восстановление архива Debian с лязгом».
  40. ^ "Официальный сайт Minix 3: Новости".
  41. ^ Герцо, Даниэль (12 мая 2012 г.). «Ежеквартальный отчет о состоянии FreeBSD, январь – март 2012 г.» (Список рассылки). Получено 14 мая 2012.
  42. ^ Дэвис, Брукс (5 ноября 2012 г.). "Внимание! Теперь Clang по умолчанию на x86" (Список рассылки). Получено 7 ноября 2012.
  43. ^ Вебстер, Бехан (18 февраля 2013 г.). «LLVMLinux: компиляция Android с LLVM» (PDF). Получено 11 мая 2013.
  44. ^ Тинти, Винисиус (17 марта 2013 г.). "LLVMLinux: Nexus 7". Получено 11 мая 2013.
  45. ^ Дю Туа, Стефан. «Clang - это функция C ++ 11, завершенная * только сейчас *!».
  46. ^ "[llvm-project] Ревизия 194194".
  47. ^ Ледру, Сильвестр. «Перестройка Debian с использованием Clang 3.5.0».
  48. ^ «История версий NDK | Разработчики Android». developer.android.com. Получено 6 марта 2018.
  49. ^ «История версий NDK | Android NDK | Разработчики Android». Разработчики Android. Получено 30 апреля 2018.
  50. ^ Надь, Роберт (26 июля 2017 г.). "переключить компилятор по умолчанию на amd64 и i386 на clang" (Список рассылки). Получено 30 сентября 2017.
  51. ^ Кеттенис, Марк (19 января 2018 г.). "Переключить компилятор по умолчанию на armv7 на clang" (Список рассылки). Получено 27 августа 2020.
  52. ^ «Clang теперь используется для создания Chrome для Windows». blog.llvm.org. Получено 7 апреля 2018.
  53. ^ «1443590 - Используйте clang-cl для сборок Windows, которые мы отправляем пользователям». bugzilla.mozilla.org. Получено 7 апреля 2018.
  54. ^ Ханкала, Visa (1 июля 2019 г.). "Переключить компилятор по умолчанию на октеон на clang" (Список рассылки). Получено 27 августа 2020.
  55. ^ «Выпуск LLVM 9 с официальной целевой поддержкой RISC-V, Asm Goto, Clang 9 и др.». riscv.org. 26 сентября 2019 г.. Получено 26 сентября 2019.
  56. ^ "FreeBSD svn совершает r358454".
  57. ^ Кеттенис, Марк (2 апреля 2020 г.). "Переключить компилятор по умолчанию на powerpc на clang" (Список рассылки). Получено 27 августа 2020.

внешняя ссылка