Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Clang / к л æ ŋ / [5] является компилятор переднего конца для C , C ++ , Objective-C и Objective-C ++ языки программирования , а также OpenMP , [6] OpenCL , Renderscript , CUDA и ХИП [7 ] фреймворки. Он использует инфраструктуру компилятора LLVM в качестве серверной части и является частью цикла выпуска LLVM, начиная с LLVM 2.6.

Он предназначен для использования в качестве замены GNU Compiler Collection (GCC), поддерживая большинство его флагов компиляции и неофициальных языковых расширений. [8] [9] Его разработчики включают Apple , Microsoft , Google , ARM , Sony , Intel и Advanced Micro Devices (AMD). Это с открытым исходным кодом , [10] с исходным кодом , распространяемое по лицензии Университета Иллинойса / NCSA , в разрешительном свободной лицензии на программное обеспечение . Начиная с версии 9.0.0, он был перелицензирован наЛицензия Apache 2.0 с исключениями LLVM. [4]

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

Проект Clang включает интерфейс Clang , статический анализатор и несколько инструментов анализа кода. [13]

Фон [ править ]

Начиная с 2005 года Apple Inc. широко использовала LLVM в ряде коммерческих продуктов [14], включая iOS SDK и 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], чтобы позволить компилятору быть более тесно связанным с инструментами, которые взаимодействуют с исходным кодом, такими как графический пользовательский интерфейс (GUI) интегрированной среды разработки (IDE ). В отличие от этого , GCC предназначен для работы в compile- ссылку - отладки рабочего процесса, и его интеграции с другими инструментами , не всегда легко. Например, GCC использует шаг под названием foldэто ключ к общему процессу компиляции, побочным эффектом которого является перевод дерева кода в форму, которая не похожа на исходный исходный код. Если ошибка обнаружена во время или после этапа сворачивания, может быть трудно перевести ее обратно в одно место в исходном источнике. Кроме того, поставщики, использующие стек GCC в среде IDE, используют отдельные инструменты для индексации кода, чтобы обеспечить такие функции, как подсветка синтаксиса и автозаполнение .

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

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

Производительность и совместимость с GCC [ править ]

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

Разработчики Clang стремятся уменьшить объем памяти и увеличить скорость компиляции по сравнению с конкурирующими компиляторами, такими как GCC. В октябре 2007 года они сообщают, что Clang скомпилировал библиотеки Carbon более чем в два раза быстрее, чем 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] [ ненадежный источник ]

По состоянию на 2019 год сравнение Intel Ice Lake показало, что Clang 10 достиг 96% производительности GCC 10 в 41 различных тестах (при этом выиграв 22 и проиграв 19 из них). [28]

В 2021 году был проведен тест для сравнения производительности и времени компиляции LLVM 2.7 и LLVM 11. [29] Был сделан вывод, что LLVM 11 имеет тенденцию занимать в 2 раза больше времени для компиляции кода с оптимизацией и в результате производит код, который работает на 10-20% быстрее (со случайными выбросами в любом направлении), по сравнению с LLVM 2.7, который более 10 лет.

История статуса [ править ]

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

См. Также [ править ]

  • Оптимизирующий компилятор AMD C / C ++
  • LLDB
  • Портативный компилятор C

Ссылки [ править ]

  1. ^ «Примечания к выпуску LLVM 2.1» .
  2. ^ "Загрузить релизы LLVM" .
  3. ^ Страница загрузки LLVM
  4. ^ a b 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. ^ a b Clang - Возможности и цели: совместимость с GCC , 15 апреля 2013 г.
  10. ^ Инструкции по началу работы Clang , Clang.llvm.org , получено 18 сентября 2012 г.
  11. ^ a b «Поддержка C ++ и C ++ '0x в Clang» . LLVM.
  12. ^ {cite web | publisher = LLVM | url = https://releases.llvm.org/6.0.0/tools/clang/docs/ReleaseNotes.html%7Ctitle=Clang 6.0.0 Release Notes}}
  13. ^ "Статический анализатор Clang" . LLVM . Проверено 3 сентября 2009 года .
  14. Лечить, Адам (19 февраля 2005 г.). "mkspecs и патчи для LLVM-компиляции Qt4" . Qt4-preview-feedback (список рассылки). Архивировано из оригинала 4 октября 2011 года.
  15. ^ Латтнер, Крис (25 мая 2007 г.). LLVM для OpenGL и прочего (слайды) . Встреча разработчиков LLVM .
  16. ^ Zadeck, Кеннет (19 ноября 2005). "Re: Предложение по интеграции LLVM / GCC" . Разработка GCC (список рассылки).
  17. ^ a b Нарофф, Стив (25 мая 2007 г.). Новый интерфейс LLVM C (слайды) . Встреча разработчиков LLVM .
  18. ^ a b c Команда Clang, clang: интерфейс семейства языков C для LLVM
  19. ^ Латтнер, Крис (11 июля 2007 г.). "Новый интерфейс LLVM C:" clang " " . cfe-dev (список рассылки).
  20. ^ Clang: Утилита и приложения: архитектура на основе библиотек
  21. ^ FLANG: NVIDIA переносит Fortran в LLVM
  22. ^ Clang часто можно использовать как замену GCC , май 2020 г.
  23. ^ Clang - Features and Goals: Fast compiles and Low Memory Use , October 2007.
  24. ^ a b 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. ^ a b «Тесты компилятора Linux GCC 4.9 VS LLVM Clang 3.5» . OpenBenchmarking.org. 14 апреля 2014 . Проверено 25 июня 2014 года .
  27. ^ "Clang vs GCC - что дает лучшие двоичные файлы?" . stackoverflow.com . Проверено 1 октября 2018 года .[ ненадежный источник ]
  28. ^ Майкл Ларабел (23 декабря 2019). «LLVM Clang достигает ~ 96% производительности GCC на Intel Ice Lake» .
  29. ^ https://gist.github.com/zeux/3ce4fcc3a43072b4315abde95319ecb6
  30. ^ Дивацкий, Роман. «[Объявление] clang / llvm может скомпилировать загружаемое ядро ​​FreeBSD на i386 / amd64» .
  31. ^ Сборка FreeBSD с помощью Clang , Wiki.freebsd.org, 24 августа 2012 г. , получено 18 сентября 2012 г.
  32. Хорнунг, Алекс. "llvm / clang еще раз" .
  33. ^ Clang , DragonFly BSD , извлекаться +18 сентября, +2012
  34. ^ "Clang может компилировать LLVM и Clang" . Блог проекта LLVM.
  35. ^ "Успешно лязгать самостоятельно" . Блог проекта LLVM.
  36. ^ Грегор, Дуг. "Clang ++ Builds Boost!" . Блог проекта LLVM.
  37. ^ Дэвис, Брэд. «Отчеты о состоянии FreeBSD, апрель – июнь 2010 г.» .
  38. ^ Clang создает рабочее ядро ​​Linux (загружается в RL5 с SMP, сетью и X, собственными хостами) , Lists.cs.uiuc.edu, заархивировано из оригинала 7 сентября 2015 г. , получено 18 сентября 2012 г.
  39. Грегор, Дуглас (26 января 2011 г.). «Поддержка новой функции C ++ 0x в Clang» (список рассылки). Архивировано из оригинала на 30 января 2011 года . Проверено 29 января 2011 года .
  40. Зонненбергер, Йорг (19 января 2012 г.). «Статус NetBSD и LLVM» . Архивировано из оригинального 21 сентября 2016 года . Проверено 26 февраля 2014 года .
  41. Ледру, Сильвестр. «Перестроить архив Debian с лязгом» .
  42. ^ "Официальный сайт Minix 3: Новости" .
  43. ^ Gerzo, Daniel (12 мая 2012). «Ежеквартальный отчет о состоянии FreeBSD, январь – март 2012 г.» (список рассылки) . Проверено 14 мая 2012 года .
  44. Дэвис, Брукс (5 ноября 2012 г.). «Внимание! Теперь Clang по умолчанию на x86» (список рассылки) . Проверено 7 ноября 2012 года .
  45. Рианна Вебстер, Бехан (18 февраля 2013 г.). «LLVMLinux: компиляция Android с помощью LLVM» (PDF) . Проверено 11 мая 2013 года .
  46. ^ Tinti, Виниций (17 марта 2013). «LLVMLinux: Nexus 7» . Проверено 11 мая 2013 года .
  47. ^ Du Toit, Стефан. «Clang - это функция C ++ 11, завершенная * только сейчас *!» .
  48. ^ "[llvm-project] Редакция 194194" .
  49. Ледру, Сильвестр. «Перестройка Debian с использованием Clang 3.5.0» .
  50. ^ «История версий NDK | Разработчики Android» . developer.android.com . Проверено 6 марта 2018 года .
  51. ^ «История версий NDK | Android NDK | Разработчики Android» . Разработчики Android . Проверено 30 апреля 2018 года .
  52. Надь, Роберт (26 июля 2017 г.). "переключить компилятор по умолчанию на amd64 и i386 на clang" (список рассылки) . Проверено 30 сентября 2017 года .
  53. ^ Kettenis, Марк (19 января 2018). «Переключить компилятор по умолчанию на armv7 на clang» (Список рассылки) . Проверено 27 августа 2020 года .
  54. ^ «Clang теперь используется для создания Chrome для Windows» . blog.llvm.org . Проверено 7 апреля 2018 года .
  55. ^ «1443590 - Используйте clang-cl для сборок Windows, которые мы отправляем пользователям» . bugzilla.mozilla.org . Проверено 7 апреля 2018 года .
  56. ^ Ханкала, Visa (1 июля 2019). «Переключить компилятор по умолчанию на octeon на clang» (Список рассылки) . Проверено 27 августа 2020 года .
  57. ^ «Выпуск LLVM 9 с официальной целевой поддержкой RISC-V, Asm Goto, Clang 9 и др.» . riscv.org . 26 сентября 2019 . Проверено 26 сентября 2019 года .
  58. ^ "FreeBSD svn совершает r358454" .
  59. ^ Kettenis, Марк (2 апреля 2020). «Переключить компилятор по умолчанию на powerpc на clang» (Список рассылки) . Проверено 27 августа 2020 года .
  60. ^ Ханкала, Visa (21 декабря 2020). «Сделать clang компилятором по умолчанию для loongson» (Список рассылки) . Проверено 1 января 2021 года .

Внешние ссылки [ править ]

  • Официальный веб-сайт