Clang - Clang

Лязг
LLVM New Logo.png
Информация о версии Clang 12.0.1 screenshot.png
Clang 12.0.1
Автор (ы) оригинала Крис Латтнер
Разработчики) Группа разработчиков LLVM
Первый выпуск 26 сентября 2007 г . ; 14 лет назад ( 2007-09-26 )
Стабильный выпуск
13.0.0 / 4 октября 2021 г . ; 12 дней назад ( 2021-10-04 )
Предварительный выпуск
13.0.0-rc2 / 27 августа 2021 г . ; 50 дней назад ( 2021-08-27 )
Репозиторий
Написано в C ++
Операционная система Unix-подобный
Платформа AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le
Тип Передняя часть компилятора
Лицензия Лицензия Apache 2.0 с исключениями LLVM
Веб-сайт clang .llvm .org

Clang / к л æ ŋ / является компилятор переднего конца для C , C ++ , Objective-C и Objective-C ++ , языки программирования , а также OpenMP , OpenCL , Renderscript , CUDA и HIP рамки. Он действует как замена для GNU Compiler Collection (GCC), поддерживающего большинство его компиляции флагов и неофициальных расширений языка. Он включает в себя статический анализатор и несколько инструментов для анализа кода.

Clang работает в тандеме с серверной частью компилятора LLVM и является подпроектом LLVM 2.6 и более поздних версий. Как и LLVM, это бесплатное программное обеспечение с открытым исходным кодом под лицензией Apache License 2.0 . Его участники включают Apple , Microsoft , Google , ARM , Sony , Intel и AMD .

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

Фон

Начиная с 2005 года Apple Inc. начала широко использовать LLVM в нескольких коммерческих продуктах, включая iOS SDK и Xcode 3.1. Одним из первых применений LLVM был компилятор кода OpenGL для OS X, который преобразует вызовы OpenGL в более фундаментальные вызовы для графических процессоров (GPU), которые не поддерживают определенные функции. Это позволило Apple поддерживать OpenGL на компьютерах, использующих наборы микросхем Intel GMA , увеличивая производительность на этих машинах.

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

В конце концов, Apple решила разработать Clang, новый интерфейс компилятора, поддерживающий C, Objective-C и C ++. В июле 2007 года проект получил одобрение на то, чтобы стать открытым.

Дизайн

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

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

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

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

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

Разработчики Clang стремятся уменьшить объем памяти и увеличить скорость компиляции по сравнению с конкурирующими компиляторами, такими как GCC. В октябре 2007 года они сообщили, что Clang скомпилировал библиотеки Carbon более чем в два раза быстрее, чем GCC, при этом использовала около одной шестой памяти и дискового пространства GCC. К 2011 году Clang, похоже, сохранит это преимущество в производительности компилятора. По состоянию на середину 2014 года Clang по-прежнему стабильно компилируется быстрее, чем GCC, при смешанном тесте производительности программ и времени компиляции. Однако к 2019 году Clang будет значительно медленнее при компиляции ядра Linux, чем GCC, оставаясь при этом немного быстрее при компиляции LLVM.

Хотя Clang исторически был быстрее, чем GCC при компиляции, качество вывода отставало. По состоянию на 2014 год производительность программ, скомпилированных с помощью Clang, отставала от производительности программы, скомпилированной GCC, иногда в больших факторах (до 5,5 раз), повторяя более ранние отчеты о более низкой производительности. С тех пор оба компилятора эволюционировали, чтобы повысить свою производительность, и разрыв сократился:

  • Сравнение GCC 4.8.2 и clang 3.4 в ноябре 2016 года на большом количестве тестовых файлов показывает, что GCC превосходит clang примерно на 17% по хорошо оптимизированному исходному коду. Результаты тестов зависят от кода, и неоптимизированный исходный код C может устранить такие различия. Таким образом, два компилятора кажутся в целом сопоставимыми.
  • Сравнения в 2019 году на Intel Ice Lake показали, что программы, созданные Clang 10, достигли 96% производительности GCC 10 в 41 различных тестах (при этом выиграли 22 и проиграли 19 из них).

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

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

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

Дата Особенности
11 июля 2007 г. Интерфейс Clang выпущен под лицензией с открытым исходным кодом
25 февраля 2009 г. Clang / LLVM может скомпилировать работающее ядро FreeBSD .
16 марта 2009 г. Clang / LLVM может скомпилировать работающее ядро DragonFly BSD .
23 октября 2009 г. Выпущен Clang 1.0, впервые с LLVM 2.6.
Декабрь 2009 г. Генерация кода для C и Objective-C достигает производственного качества. Поддержка C ++ и Objective-C ++ все еще не завершена. Clang C ++ может анализировать GCC 4.2 libstdc ++ и генерировать рабочий код для нетривиальных программ, а также может компилировать себя.
2 февраля 2010 г. Clang self-hosting .
20 мая 2010 г. Последняя версия Clang успешно построила библиотеки Boost C ++ и прошла почти все тесты.
10 июня 2010 г. Clang / LLVM становится неотъемлемой частью FreeBSD , но компилятором по умолчанию остается GCC.
25 октября 2010 г. Clang / LLVM может скомпилировать работающее модифицированное ядро Linux .
Январь 2011 г. Завершена предварительная работа по поддержке чернового варианта стандарта C ++ 0x , при этом некоторые из новых функций чернового варианта поддерживаются в разрабатываемой версии Clang.
10 февраля 2011 г. Clang может скомпилировать рабочую виртуальную машину HotSpot Java .
19 января 2012 г. Clang становится необязательным компонентом кроссплатформенной системы сборки NetBSD , но GCC по-прежнему используется по умолчанию.
29 февраля 2012 г. Clang 3.0 может восстановить 91,2% архива Debian .
29 февраля 2012 г. Clang становится компилятором по умолчанию в MINIX 3
12 мая 2012 Clang / LLVM объявили о замене GCC во FreeBSD .
5 ноября 2012 г. Clang становится компилятором по умолчанию в FreeBSD 10.x на amd64 / i386.
18 февраля 2013 г. Clang / LLVM может скомпилировать работающее модифицированное ядро Android Linux для Nexus 7 .
19 апреля 2013 г. Clang - это завершенная функция C ++ 11 .
6 ноября 2013 г. Clang - это завершенная функция C ++ 14 .
11 сентября 2014 г. Clang 3.5 может восстановить 94,3% архива Debian. Процент сбоев снизился на 1,2% на выпуск с января 2013 года, в основном из-за повышения совместимости с флагами GCC.
Октябрь 2016 г. Clang становится компилятором по умолчанию для Android (а позже - только компилятором, поддерживаемым Android NDK ).
13 марта 2017 г. Выпущен Clang 4.0.0
26 июля 2017 г. Clang становится компилятором по умолчанию в OpenBSD 6.2 на amd64 / i386.
7 сентября 2017 г. Выпущен Clang 5.0.0
19 января 2018 г. Clang становится компилятором по умолчанию в OpenBSD 6.3 на arm.
5 марта 2018 г. Clang теперь используется для создания Google Chrome для Windows.
8 марта 2018 г. Выпущен Clang 6.0.0
5 сентября 2018 г. Clang теперь используется для сборки Firefox для Windows.
19 сентября 2018 г. Выпущен Clang 7.0.0
20 марта 2019 г. Clang 8.0.0 выпущен
1 июля 2019 г. Clang становится компилятором по умолчанию в OpenBSD 6.6 на mips64.
19 Сентябрь 2019 г. Clang 9.0.0 выпущен с официальной целевой поддержкой RISC-V .
29 февраля 2020 г. Clang становится единственным компилятором C в базовой системе FreeBSD после удаления GCC .
24 марта 2020 г. Clang 10.0.0 выпущен
2 апреля 2020 Clang становится компилятором по умолчанию в OpenBSD 6.7 на powerpc.
12 Октябрь 2020 Clang 11.0.0 выпущен
21 декабря 2020 г. Clang становится компилятором по умолчанию в OpenBSD 6.9 на mips64el.
14 апреля 2021 г. Clang 12.0.0 выпущен

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

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

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