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]
По этим причинам Apple разработала Clang, новый компиляторный интерфейс, который поддерживает C, Objective-C и C++. [18] В июле 2007 года проект получил одобрение на открытие исходного кода. [19]
Дизайн
Clang работает в тандеме с LLVM. [20] Сочетание Clang и LLVM обеспечивает большую часть цепочки инструментов для замены стека GCC . Одной из основных целей Clang является предоставление архитектуры на основе библиотек, [21] чтобы компилятор мог взаимодействовать с другими инструментами, которые взаимодействуют с исходным кодом, такими как интегрированные среды разработки (IDE). Напротив, GCC работает в рабочем процессе компиляции - связывания - отладки ; интеграция его с другими инструментами не всегда проста. Например, GCC использует шаг, называемый fold , который является ключевым для общего процесса компиляции, побочным эффектом которого является перевод дерева кода в форму, которая выглядит непохожей на исходный исходный код. Если ошибка обнаружена во время или после шага fold, может быть сложно перевести ее обратно в одно место в исходном коде. Кроме того, поставщики, использующие стек GCC в IDE, должны использовать отдельные инструменты для индексации кода, чтобы обеспечить такие функции, как подсветка синтаксиса и интеллектуальное завершение кода .
Clang сохраняет больше информации во время процесса компиляции, чем GCC, и сохраняет общую форму исходного кода, что упрощает сопоставление ошибок с исходным кодом. Отчеты об ошибках Clang более подробны, конкретны и пригодны для машинного чтения, поэтому IDE могут индексировать вывод компилятора. Модульная конструкция компилятора может предложить индексацию исходного кода, проверку синтаксиса и другие функции, обычно связанные с системами быстрой разработки приложений . Дерево синтаксического анализа также больше подходит для поддержки автоматизированного рефакторинга кода , поскольку оно напрямую представляет исходный код.
Clang компилирует только языки типа C, такие как C, C++, Objective-C и Objective-C++. Во многих случаях Clang может заменить GCC по мере необходимости, без каких-либо других эффектов для всей цепочки инструментов. [ требуется цитата ] Он поддерживает большинство часто используемых опций GCC. Проект на Fortran, Flang, находился в стадии разработки в 2022 году. Однако для других языков, таких как Ada , LLVM остается зависимым от GCC или другого внешнего интерфейса компилятора.
Флэнг - Фортран
Проект Flang от Nvidia и The Portland Group добавляет поддержку Fortran . [22] Flang — это интерфейс LLVM для Fortran. Его часто называют «LLVM Flang», чтобы отличать его от «Classic Flang» — это два отдельных и независимых компилятора Fortran. «LLVM Flang» находится в стадии активной разработки. Версии Flang в разработке находились в процессе разработки по состоянию на октябрь 2023 года [обновлять]и могут быть загружены с сайта LLVM Project. [23]
Разработчики 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,5x), [28] повторяя более ранние отчеты о более медленной производительности. [26] Оба компилятора с тех пор эволюционировали, чтобы повысить свою производительность, и разрыв сократился:
Сравнение в ноябре 2016 года между GCC 4.8.2 и clang 3.4 на большом наборе тестовых файлов показывает, что 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 Release Notes". llvm.org . LLVM Developer Group. 27 сентября 2007 г. Архивировано из оригинала 17 ноября 2016 г. Получено 30 апреля 2018 г.
^ "LLVM 19.1.4". 19 ноября 2024 г. Получено 19 ноября 2024 г.
^ "Releases". llvm – llvm-project repo . LLVM Developer Group. 27 августа 2021 г. Архивировано из оригинала 12 сентября 2021 г. Получено 12 сентября 2021 г. – через GitHub.com .
^ abc "LICENSE.TXT", llvm.org , LLVM Developer Group, заархивировано из оригинала 11 ноября 2020 г. , извлечено 24 сентября 2019 г.
^ abc "Политика разработчиков LLVM", llvm.org , Группа разработчиков LLVM, § Авторские права, лицензии и патенты, архивировано из оригинала 13 ноября 2012 г. , извлечено 12 сентября 2021 г.
^ Кристофер, Эрик (3 июля 2008 г.). "просто интересно произношение Clang". LLVMdev (список рассылки) . Получено 22 сентября 2015 г.
^ "Поддержка OpenMP". Блог проекта LLVM . 22 мая 2015 г. Архивировано из оригинала 26 марта 2016 г. Получено 28 марта 2016 г.
^ "C++ Heterogeneous-Compute Interface for Portability". GitHub . Архивировано из оригинала 27 июня 2020 г. Получено 18 февраля 2020 г.
^ "Clang Language Extensions". Архивировано из оригинала 24 февраля 2014 г. Получено 8 ноября 2017 г. В дополнение к перечисленным здесь языковым расширениям Clang стремится поддерживать широкий спектр расширений GCC.
^ ab Clang - Возможности и цели: Совместимость с GCC, 15 апреля 2013 г., архивировано из оригинала 27 апреля 2018 г. , извлечено 30 апреля 2018 г.
^ "Clang Static Analyzer". LLVM. Архивировано из оригинала 30 апреля 2018 г. Получено 3 сентября 2009 г.
↑ «Присоединение к проекту Clang», clang.llvm.org , группа разработчиков LLVM, архивировано из оригинала 27 апреля 2018 г. , извлечено 18 сентября 2012 г. Clang является подпроектом проекта LLVM, но имеет свои собственные списки рассылки, поскольку в сообществах есть люди с разными интересами.
^ ab "Поддержка C++ и C++'0x в Clang". LLVM. Архивировано из оригинала 4 июля 2013 г. Получено 12 марта 2023 г.
^ "Clang 17.0.1 Release Notes". LLVM . Получено 25 октября 2023 г. .
^ Treat, Adam (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 г.
^ ab Naroff, Steve (25 мая 2007 г.). Новый интерфейс LLVM C (слайды) . Встреча разработчиков LLVM. Архивировано (PDF) из оригинала 3 апреля 2019 г. Получено 30 апреля 2018 г.
^ Латтнер, Крис (11 июля 2007 г.). "Новый интерфейс LLVM C: "clang"". cfe-dev (список рассылки). Архивировано из оригинала 26 марта 2020 г. . Получено 26 марта 2020 г. .
^ ab Clang team, clang: интерфейс семейства языков C для LLVM Архивировано 12 ноября 2017 г. на Wayback Machine
^ "Clang: Utility and Applications: Library Based Architecture". Архивировано из оригинала 27 апреля 2018 г. Получено 30 апреля 2018 г.
^ "FLANG: NVIDIA Brings Fortran To LLVM". Архивировано из оригинала 20 мая 2017 г. Получено 18 мая 2017 г.
^ «Добро пожаловать в документацию Flang — компилятор Flang».
^ Clang часто можно использовать в качестве замены GCC, май 2020 г., архивировано из оригинала 8 мая 2020 г. , извлечено 9 мая 2020 г.
^ Clang - Возможности и цели: Быстрая компиляция и низкое использование памяти, октябрь 2007 г., архивировано из оригинала 27 апреля 2018 г. , извлечено 30 апреля 2018 г.
^ abc Simonis, Volker (10 февраля 2011 г.). "Compiling the HotSpot VM with Clang". Архивировано из оригинала 18 февраля 2011 г. Получено 13 февраля 2011 г. Хотя общая совместимость с GCC превосходна, а время компиляции впечатляет, производительность сгенерированного кода все еще отстает от последней версии GCC.
^ "Benchmarking LLVM & Clang Against GCC 4.5". Phoronix . 21 апреля 2010 г. Архивировано из оригинала 2 ноября 2016 г. Получено 13 февраля 2011 г. Бинарные файлы из LLVM-GCC и Clang с трудом конкурировали с GCC 4.5.0 в хронометрированном тесте HMMer поиска в базе данных Pfam. LLVM-GCC и Clang были примерно на 23% медленнее(...)Хотя LLVM / Clang не являются чемпионами по производительности на данный момент, оба компонента продолжают активно разрабатываться, и, будем надеяться, в ближайшие месяцы будет больше новостей.
^ ab "GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks". OpenBenchmarking.org. 14 апреля 2014 г. Архивировано из оригинала 23 октября 2017 г. Получено 25 июня 2014 г.
^ ab Michael Larabel (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 vs. GCC 13 Compiler Performance On Intel Raptor Lake" . Получено 24 апреля 2024 г. .
^ Divacky, Roman (25 февраля 2009 г.). "[Анонс] clang/llvm может скомпилировать загрузку ядра FreeBSD на i386/amd64". Архивировано из оригинала 1 мая 2018 г. Получено 30 апреля 2018 г.
↑ Сборка FreeBSD с помощью Clang, Wiki.freebsd.org, 24 августа 2012 г., заархивировано из оригинала 30 апреля 2018 г. , извлечено 18 сентября 2012 г.
^ Хорнунг, Алекс. "llvm/clang once more". Архивировано из оригинала 30 апреля 2018 г. Получено 30 апреля 2018 г.
↑ Clang, DragonFly BSD, заархивировано из оригинала 30 апреля 2018 г. , извлечено 18 сентября 2012 г.
^ "Clang может компилировать LLVM и Clang". Блог проекта LLVM. 24 декабря 2009 г. Архивировано из оригинала 26 апреля 2012 г. Получено 31 декабря 2009 г.
^ "Clang Successfully Self-Hosts". Блог проекта LLVM. 4 февраля 2010 г. Архивировано из оригинала 26 апреля 2012 г. Получено 5 февраля 2010 г.
↑ Грегор, Дуг (20 мая 2010 г.). «Clang++ Builds Boost!». Блог проекта LLVM. Архивировано из оригинала 26 апреля 2012 г. Получено 21 мая 2010 г.
^ Дэвис, Брэд. «FreeBSD Status Reports April–June, 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 г.
^ Gerzo, Daniel (12 мая 2012 г.). "FreeBSD Quarterly Status Report January–March, 2012" (список рассылки). Архивировано из оригинала 18 февраля 2018 г. Получено 14 мая 2012 г.
^ Дэвис, Брукс (5 ноября 2012 г.). "Heads Up: Clang теперь по умолчанию на x86" (список рассылки). Архивировано из оригинала 30 апреля 2018 г. Получено 7 ноября 2012 г.
^ Вебстер, Бехан (18 февраля 2013 г.). "LLVMLinux: Компиляция Android с LLVM" (PDF) . Архивировано из оригинала (PDF) 12 мая 2014 г. . Получено 11 мая 2013 г. .
^ Tinti, Vinicius (17 марта 2013 г.). "LLVMLinux: Nexus 7". Архивировано из оригинала 11 июня 2014 г. Получено 11 мая 2013 г.
^ Дю Туа, Стефанус. «Clang is C++11 feature complete as from *just now*!». Архивировано из оригинала 24 сентября 2019 г. Получено 20 апреля 2013 г.
^ "[llvm-project] Revision 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 г.
^ Nagy, Robert (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 г. .
^ Hankala, Visa (1 июля 2019 г.). «Переключите компилятор по умолчанию на octeon на clang» (список рассылки). Архивировано из оригинала 8 апреля 2022 г. Получено 27 августа 2020 г.
^ «LLVM 9 Releases With Official RISC-V Target Support, Asm Goto, Clang 9, And More». 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 г.
^ Hankala, Visa (21 декабря 2020 г.). «Сделать clang компилятором по умолчанию на loongson» (список рассылки). Архивировано из оригинала 13 января 2021 г. . Получено 1 января 2021 г. .