Кланг
![]() Кланг 13.0.1 | |
Оригинальный автор(ы) | Крис Лэттнер |
---|---|
Разработчик(и) | Группа разработчиков LLVM |
Первоначальный выпуск | 26 сентября 2007 г [1] |
Стабильная версия | 18.1.8 [2] ![]() |
Репозиторий | |
Написано в | С++ |
Операционная система | Unix-подобный |
Платформа | AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le [3] |
Тип | Интерфейс компилятора |
Лицензия | Лицензия Apache 2.0 с исключениями LLVM [4] [5] |
Веб-сайт | лязг |
Кланг ( / ˈ k l æ ŋ / ) [6] представляет собой интерфейс компилятора для C , C++ , Objective-C и Objective-C++ языков программирования , а также OpenMP . [7] OpenCL , RenderScript , CUDA , SYCL и HIP [8] рамки. Он действует как замена GNU Compiler Collection (GCC), поддерживая большинство флагов компиляции и неофициальных языковых расширений. [9] [10] Он включает в себя статический анализатор и несколько инструментов анализа кода. [11]
Clang работает в тандеме с LLVM серверной частью компилятора и является подпроектом LLVM 2.6 и более поздних версий. [12] Как и LLVM, это бесплатное программное обеспечение с открытым исходным кодом под Apache License 2.0 . лицензией [4] [5] В число его участников входят Apple , Microsoft , Google , ARM , Sony , Intel и AMD .
Clang 17, последняя основная версия Clang по состоянию на октябрь 2023 г., имеет полную поддержку всех опубликованных стандартов C++ до C++17 , реализует большинство функций C++20 и имеет начальную поддержку будущего C++23. стандарта . [13] Начиная с версии 16.0.0, Clang по умолчанию компилирует C++, используя диалект GNU++17, который включает в себя функции стандарта C++17 и соответствующие расширения GNU. [14]
Фон
[ редактировать ]В 2005 году Apple Inc. широко использовала LLVM в нескольких коммерческих продуктах. [15] включая iOS SDK и Xcode 3.1. Компилятор кода OpenGL для OS X , который преобразует вызовы OpenGL в более фундаментальные вызовы графических процессоров (GPU), которые не поддерживают определенные функции, был одним из первых применений LLVM. Это позволило Apple поддерживать OpenGL на компьютерах с чипсетами Intel GMA , повышая производительность на этих машинах. [16]
Первоначально проект LLVM намеревался использовать GCC интерфейс . Однако исходный код GCC большой и несколько громоздкий; как сказал один давний разработчик GCC, говоря о LLVM: «Пытаться заставить бегемота танцевать на самом деле не очень весело». [17] Кроме того, программное обеспечение Apple использует Objective-C , что является низким приоритетом для разработчиков GCC. Таким образом, GCC не легко интегрируется в интегрированную среду разработки (IDE) Apple. [18] Наконец, лицензионное соглашение GCC, GNU General Public License (GPL) версии 3 , требует от разработчиков, распространяющих расширения или модифицированные версии GCC, предоставлять свой исходный код LLVM , но разрешительная лицензия на программное обеспечение этого не требует. [4] [5]
По этим причинам Apple разработала Clang, новый интерфейс компилятора, поддерживающий C, Objective-C и C++. [18] В июле 2007 года проект получил одобрение на открытие открытого исходного кода. [19]
Дизайн
[ редактировать ]Clang работает в тандеме с LLVM. [20] Комбинация Clang и LLVM предоставляет большую часть набора инструментов GCC для замены стека . Одна из основных целей Clang — предоставить архитектуру на основе библиотек. [21] чтобы компилятор мог взаимодействовать с другими инструментами, взаимодействующими с исходным кодом, такими как интегрированные среды разработки (IDE). Напротив, GCC работает по схеме компиляция- линковка - отладка ; интегрировать его с другими инструментами не всегда легко. Например, GCC использует шаг, называемый свертыванием , который является ключевым для всего процесса компиляции, побочным эффектом которого является преобразование дерева кода в форму, непохожую на исходный исходный код. Если ошибка обнаружена во время или после этапа сгиба, может быть сложно перевести ее обратно в одно место исходного источника. Кроме того, поставщики, использующие стек GCC в IDE, должны использовать отдельные инструменты для индексации кода, чтобы обеспечить такие функции, как подсветка синтаксиса и интеллектуальное завершение кода .
Clang сохраняет больше информации в процессе компиляции, чем GCC, и сохраняет общую форму исходного кода, что упрощает отображение ошибок обратно в исходный источник. Отчеты об ошибках Clang более подробные, конкретные и машиночитаемые, поэтому IDE могут индексировать выходные данные компилятора. Модульная конструкция компилятора может обеспечивать индексацию исходного кода, проверку синтаксиса и другие функции, обычно связанные с системами быстрой разработки приложений . Дерево разбора также больше подходит для поддержки автоматического рефакторинга кода , поскольку оно непосредственно представляет исходный исходный код.
Clang компилирует только C-подобные языки, такие как C, C++, Objective-C и Objective-C++. Во многих случаях Clang может заменить GCC по мере необходимости без какого-либо другого влияния на инструментальную цепочку в целом. [ нужна ссылка ] Он поддерживает большинство часто используемых опций GCC. Проект Flang, проект Fortran, находился в разработке в 2022 году. Однако для других языков, таких как Ada , LLVM по-прежнему зависит от GCC или другого внешнего интерфейса компилятора.
Flang - Fortran
[ редактировать ]Проект Flang от Nvidia и The Portland Group добавляет поддержку Fortran . [22] Flang — это интерфейс Fortran от LLVM. Его часто называют «LLVM Flang», чтобы отличить его от «Classic Flang» — это два отдельных и независимых компилятора Фортрана. «LLVM Flang» находится в стадии активной разработки. По состоянию на октябрь 2023 года разработка версий Flang находилась в разработке. [update] и его можно загрузить из проекта LLVM. [23]
Производительность и совместимость с GCC
[ редактировать ]
Clang совместим с GCC. [10] Его интерфейс командной строки и параметры GCC использует многие флаги . Clang реализует множество расширений языка GNU и встроенных функций компилятора , некоторые из которых предназначены исключительно для совместимости. Например, хотя Clang реализует атомарные встроенные функции, которые точно соответствуют атомарным элементам C11 , он также реализует GCC. __sync_*
встроенные функции для совместимости с GCC и libstdc++ . Clang также поддерживает совместимость ABI , созданным GCC с объектным кодом . На практике Clang является полной заменой GCC. [24]
Разработчики Clang стремятся уменьшить объем памяти и увеличить скорость компиляции по сравнению с конкурирующими компиляторами, такими как GCC. В октябре 2007 года они сообщили, что Clang компилировал библиотеки Carbon более чем в два раза быстрее, чем GCC, используя при этом примерно одну шестую памяти и дискового пространства GCC. [25] К 2011 году Clang, казалось, сохранил это преимущество в производительности компилятора. [26] [27] По состоянию на середину 2014 года Clang по-прежнему стабильно компилируется быстрее, чем GCC, в тестах смешанного времени компиляции и производительности программы. [28] Однако к 2019 году Clang будет значительно медленнее компилировать ядро Linux, чем GCC, но при этом останется немного быстрее при компиляции LLVM. [29]
Хотя Clang исторически компилировал быстрее, чем GCC, качество вывода отставало. По состоянию на 2014 год производительность программ, скомпилированных с помощью Clang, отставала от производительности программ, скомпилированных с помощью GCC, иногда в больших количествах (до 5,5 раз). [28] повторение более ранних сообщений о снижении производительности. [26] С тех пор оба компилятора усовершенствовались, чтобы повысить свою производительность, а разрыв сократился:
- Сравнение GCC 4.8.2 и clang 3.4, проведенное в ноябре 2016 года на большом количестве тестовых файлов, показывает, что GCC превосходит clang примерно на 17 % в хорошо оптимизированном исходном коде. Результаты тестов зависят от кода, и неоптимизированный исходный код C может обратить вспять такие различия. Таким образом, оба компилятора кажутся в целом сопоставимыми. [30] [ ненадежный источник ]
- Сравнения в 2019 году на Intel Ice Lake показали, что программы, созданные с помощью Clang 10, достигли 96% производительности GCC 10 в 41 различном тесте (при этом выиграв 22 и проиграв 19 из них). [29]
- В 2023 году еще одно сравнение, проведенное четыре года спустя, показало, что программы, скомпилированные с использованием Clang, теперь соответствуют производительности программ, скомпилированных с помощью GCC. В среднем Clang 16 превосходит GCC 13 на 6%. [31]
Интерфейс
[ редактировать ]libclang
предоставляет интерфейс C, предоставляющий относительно небольшой API. Открытая функциональность включает в себя: синтаксический анализ исходного кода в AST , загрузку AST, перемещение по AST, связывание исходных расположений с элементами внутри AST.
История статусов
[ редактировать ]В этой таблице представлены только значимые шаги и релизы в истории Clang.
Дата | Основные моменты |
---|
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Примечания к выпуску LLVM 2.1» . llvm.org . Группа разработчиков LLVM. 27 сентября 2007. Архивировано из оригинала 17 ноября 2016 года . Проверено 30 апреля 2018 г.
- ^ «ЛЛВМ 18.1.8» . 18 июня 2024 г. Проверено 18 июня 2024 г.
- ^ «Выпуски» . репозиторий llvm/llvm-проекта . Группа разработчиков LLVM. 27 августа 2021 года. Архивировано из оригинала 12 сентября 2021 года . Получено 12 сентября 2021 г. — через GitHub.com .
- ^ Jump up to: а б с «LICENSE.TXT» , llvm.org , LLVM Developer Group, заархивировано из оригинала 11 ноября 2020 г. , получено 24 сентября 2019 г.
- ^ Jump up to: а б с «Политика разработчика LLVM» , llvm.org , Группа разработчиков LLVM, § Авторские права, лицензии и патенты, заархивировано из оригинала 13 ноября 2012 г. , получено 12 сентября 2021 г.
- ^ Кристофер, Эрик (3 июля 2008 г.). «Просто удивляюсь произношению Clang» . LLVMdev (список рассылки) . Проверено 22 сентября 2015 г.
- ^ «Поддержка OpenMP» . Блог проекта LLVM . 22 мая 2015. Архивировано из оригинала 26 марта 2016 года . Проверено 28 марта 2016 г.
- ^ «Интерфейс гетерогенных вычислений C++ для переносимости» . Гитхаб . Архивировано из оригинала 27 июня 2020 года . Проверено 18 февраля 2020 г.
- ^ «Расширения языка Clang» . Архивировано из оригинала 24 февраля 2014 года . Проверено 8 ноября 2017 г.
В дополнение к перечисленным здесь языковым расширениям Clang стремится поддерживать широкий спектр расширений GCC.
- ^ Jump up to: а б Clang — Возможности и цели: совместимость с GCC , 15 апреля 2013 г., заархивировано из оригинала 27 апреля 2018 г. , получено 30 апреля 2018 г.
- ^ «Статический анализатор Clang» . ЛЛВМ. Архивировано из оригинала 30 апреля 2018 года . Проверено 3 сентября 2009 г.
- ^ «Getting with the Clang Project» , clang.llvm.org , LLVM Developer Group, заархивировано из оригинала 27 апреля 2018 г. , получено 18 сентября 2012 г. ,
Clang является подпроектом проекта LLVM, но имеет свои собственные списки рассылки. потому что в сообществах есть люди с разными интересами.
- ^ Jump up to: а б «Поддержка C++ и C++'0x в Clang» . ЛЛВМ. Архивировано из оригинала 4 июля 2013 года . Проверено 12 марта 2023 г.
- ^ «Примечания к выпуску Clang 17.0.1» . ЛЛВМ . Проверено 25 октября 2023 г.
- ^ Трит, Адам (19 февраля 2005 г.). «mkspecs и патчи для компиляции LLVM Qt4» . Qt4-preview-feedback (список рассылки). Архивировано из оригинала 4 октября 2011 года.
- ^ Латтнер, Крис (25 мая 2007 г.). LLVM для OpenGL и прочего (Слайды) . Встреча разработчиков LLVM . Архивировано (PDF) из оригинала 8 мая 2016 г. Проверено 30 апреля 2018 г.
- ^ Задек, Кеннет (19 ноября 2005 г.). «Re: Предложение по интеграции LLVM/GCC» . Разработка GCC (список рассылки). Архивировано из оригинала 10 марта 2016 года . Проверено 25 июля 2016 г.
- ^ Jump up to: а б Наров, Стив (25 мая 2007 г.). Новый интерфейс LLVM C (слайды) . Встреча разработчиков LLVM . Архивировано (PDF) из оригинала 3 апреля 2019 г. Проверено 30 апреля 2018 г.
- ^ Латтнер, Крис (11 июля 2007 г.). «Новый интерфейс LLVM C: «clang» » . cfe-dev (список рассылки). Архивировано из оригинала 26 марта 2020 года . Проверено 26 марта 2020 г.
- ^ Jump up to: а б Команда Clang, clang: интерфейс семейства языков C для LLVM. Архивировано 12 ноября 2017 г. на Wayback Machine.
- ^ «Clang: Утилита и приложения: архитектура на основе библиотек» . Архивировано из оригинала 27 апреля 2018 года . Проверено 30 апреля 2018 г.
- ^ «FLANG: NVIDIA переносит Фортран в LLVM» . Архивировано из оригинала 20 мая 2017 года . Проверено 18 мая 2017 г.
- ^ «Добро пожаловать в документацию Flang — компилятор Flang» .
- ^ Clang часто можно использовать в качестве замены GCC , май 2020 г., заархивировано из оригинала 8 мая 2020 г. , получено 9 мая 2020 г.
- ^ Clang — Возможности и цели: быстрая компиляция и малое использование памяти , октябрь 2007 г., заархивировано из оригинала 27 апреля 2018 г. , получено 30 апреля 2018 г.
- ^ Jump up to: а б с Симонис, Волкер (10 февраля 2011 г.). «Компиляция виртуальной машины HotSpot с помощью Clang» . Архивировано из оригинала 18 февраля 2011 года . Проверено 13 февраля 2011 г.
Хотя общая совместимость GCC превосходна, а время компиляции впечатляет, производительность сгенерированного кода по-прежнему отстает от последней версии GCC.
- ^ «Сравнение LLVM и Clang с GCC 4.5» . Фороникс . 21 апреля 2010 года. Архивировано из оригинала 2 ноября 2016 года . Проверено 13 февраля 2011 г.
Двоичные файлы от LLVM-GCC и Clang изо всех сил пытались конкурировать с GCC 4.5.0 в синхронизированном тесте HMMer поиска в базе данных Pfam. LLVM-GCC и Clang были примерно на 23% медленнее(...) Хотя LLVM/Clang на данный момент не является лидером по производительности, оба компонента продолжают находиться в стадии очень активной разработки, и, надеюсь, в ближайшем будущем будет больше новостей, о которых можно будет сообщить. месяцы
- ^ Jump up to: а б «GCC 4.9 VS. LLVM Clang 3.5 Тесты компилятора Linux» . OpenBenchmarking.org. 14 апреля 2014 года. Архивировано из оригинала 23 октября 2017 года . Проверено 25 июня 2014 г.
- ^ Jump up to: а б Майкл Ларабель (23 декабря 2019 г.). «LLVM Clang достигает примерно 96% производительности GCC на Intel Ice Lake» . Архивировано из оригинала 15 января 2021 года . Проверено 14 января 2021 г.
- ^ «Clang против GCC — что дает лучшие двоичные файлы?» . stackoverflow.com . Архивировано из оригинала 1 июня 2017 года . Проверено 1 октября 2018 г.
- ^ Майкл Ларабель (11 мая 2023 г.). «Производительность компилятора LLVM Clang 16 и GCC 13 на Intel Raptor Lake» . Проверено 24 апреля 2024 г.
- ^ Дивацкий, Роман (25 февраля 2009 г.). «[Объявить] clang/llvm может скомпилировать загрузочное ядро FreeBSD на i386/amd64» . Архивировано из оригинала 1 мая 2018 года . Проверено 30 апреля 2018 г.
- ^ Сборка FreeBSD с помощью Clang , Wiki.freebsd.org, 24 августа 2012 г., заархивировано из оригинала 30 апреля 2018 г. , получено 18 сентября 2012 г.
- ^ Хорнунг, Алекс. «llvm/clang еще раз» . Архивировано из оригинала 30 апреля 2018 года . Проверено 30 апреля 2018 г.
- ^ Clang , DragonFly BSD, заархивировано из оригинала 30 апреля 2018 года , получено 18 сентября 2012 года.
- ^ «Clang может компилировать LLVM и Clang» . Блог проекта LLVM. 24 декабря 2009. Архивировано из оригинала 26 апреля 2012 года . Проверено 31 декабря 2009 г.
- ^ «Clang успешно размещается самостоятельно» . Блог проекта LLVM. 4 февраля 2010. Архивировано из оригинала 26 апреля 2012 года . Проверено 5 февраля 2010 г.
- ^ Грегор, Дуг (20 мая 2010 г.). «Clang++ увеличивает ускорение!» . Блог проекта LLVM. Архивировано из оригинала 26 апреля 2012 года . Проверено 21 мая 2010 г.
- ^ Дэвис, Брэд. «Отчеты о состоянии FreeBSD, апрель – июнь 2010 г.» . Архивировано из оригинала 24 июня 2018 года . Проверено 30 апреля 2018 г.
- ^ Clang собирает рабочее ядро Linux (загружается до RL5 с SMP, сетью и X, самостоятельными хостами) , Lists.cs.uiuc.edu, заархивировано из оригинала 7 сентября 2015 г. , получено 18 сентября 2012 г.
- ^ Грегор, Дуглас (26 января 2011 г.). «Поддержка новых функций C++0x в Clang» (список рассылки). Архивировано из оригинала 30 января 2011 года . Проверено 29 января 2011 г.
- ^ Зонненбергер, Йорг (19 января 2012 г.). «Состояние NetBSD и LLVM» . Архивировано из оригинала 21 сентября 2016 года . Проверено 26 февраля 2014 г.
- ^ Ледрю, Сильвестр. «Восстановление архива Debian с помощью clang» . Архивировано из оригинала 1 мая 2018 года . Проверено 30 апреля 2018 г.
- ^ «Официальный сайт Minix 3: Новости» . Архивировано из оригинала 17 декабря 2009 года . Проверено 7 декабря 2012 г.
- ^ Герцо, Дэниел (12 мая 2012 г.). «Ежеквартальный отчет о состоянии FreeBSD, январь – март 2012 г.» (список рассылки). Архивировано из оригинала 18 февраля 2018 года . Проверено 14 мая 2012 г.
- ^ Дэвис, Брукс (5 ноября 2012 г.). «Внимание: Clang теперь используется по умолчанию на x86» (список рассылки). Архивировано из оригинала 30 апреля 2018 года . Проверено 7 ноября 2012 г.
- ^ Вебстер, Бехан (18 февраля 2013 г.). «LLVMLinux: компиляция Android с помощью LLVM» (PDF) . Архивировано из оригинала (PDF) 12 мая 2014 года . Проверено 11 мая 2013 г.
- ^ Тинти, Винисиус (17 марта 2013 г.). «LLVMLinux: Nexus 7» . Архивировано из оригинала 11 июня 2014 года . Проверено 11 мая 2013 г.
- ^ Дю Туа, Стефанус. «Clang — это функция C++11, завершенная *только сейчас*!» . Архивировано из оригинала 24 сентября 2019 года . Проверено 20 апреля 2013 г.
- ^ «[llvm-project] Редакция 194194» . Архивировано из оригинала 18 ноября 2018 года . Проверено 30 апреля 2018 г.
- ^ Ледрю, Сильвестр. «Пересборка Debian с использованием Clang 3.5.0» . Архивировано из оригинала 1 мая 2018 года . Проверено 30 апреля 2018 г.
- ^ «История изменений NDK | Разработчики Android» . Developer.android.com . Архивировано из оригинала 6 марта 2018 года . Проверено 6 марта 2018 г.
- ^ «История изменений NDK | Android NDK | Разработчики Android» . Android-разработчики . Архивировано из оригинала 5 апреля 2019 года . Проверено 30 апреля 2018 г.
- ^ Надь, Роберт (26 июля 2017 г.). «переключите компилятор по умолчанию на amd64 и i386 на clang» (список рассылки). Архивировано из оригинала 25 октября 2018 года . Проверено 30 сентября 2017 г.
- ^ Кеттенис, Марк (19 января 2018 г.). «Переключите компилятор по умолчанию на Armv7 на clang» (список рассылки). Архивировано из оригинала 8 апреля 2022 года . Проверено 27 августа 2020 г.
- ^ «Clang теперь используется для сборки Chrome для Windows» . blog.llvm.org . 5 марта 2018 года. Архивировано из оригинала 5 марта 2018 года . Проверено 7 апреля 2018 г.
- ^ «Firefox Beta 63.0beta: все новые функции, обновления и исправления» . www.mozilla.org . Архивировано из оригинала 19 апреля 2021 года . Проверено 18 марта 2020 г.
- ^ Ханкала, Виза (1 июля 2019 г.). «Переключите компилятор по умолчанию с Octeon на clang» (список рассылки). Архивировано из оригинала 8 апреля 2022 года . Проверено 27 августа 2020 г.
- ^ «Выпуск LLVM 9 с официальной поддержкой RISC-V Target, Asm Goto, Clang 9 и т. д.» . riscv.org . 26 сентября 2019 года. Архивировано из оригинала 28 декабря 2019 года . Проверено 26 сентября 2019 г.
- ^ «FreeBSD svn commit r358454» . 29 февраля 2020 года. Архивировано из оригинала 10 марта 2020 года . Проверено 7 марта 2020 г.
- ^ Кеттенис, Марк (2 апреля 2020 г.). «Переключите компилятор по умолчанию на powerpc на clang» (список рассылки). Архивировано из оригинала 8 апреля 2022 года . Проверено 27 августа 2020 г.
- ^ Ханкала, Виза (21 декабря 2020 г.). «Сделать clang компилятором по умолчанию в loongson» (список рассылки). Архивировано из оригинала 13 января 2021 года . Проверено 1 января 2021 г.
Внешние ссылки
[ редактировать ]- Программное обеспечение Apple Inc.
- Компиляторы C (языка программирования)
- Компиляторы С++
- Бесплатные компиляторы и интерпретаторы
- Программное обеспечение, использующее лицензию NCSA
- Программное обеспечение, использующее лицензию Apache
- Инструменты статического анализа программ
- программное обеспечение 2007 года