stringtranslate.com

Лязг

Clang ( / ˈ 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 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 не интегрируется гладко в интегрированную среду разработки Apple (IDE). [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 использует шаг, называемый 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]

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

Clang компилирует htop

Clang совместим с GCC. [10] Его интерфейс командной строки разделяет многие флаги и опции GCC . Clang реализует множество расширений языка GNU и встроенных функций компилятора , некоторые из которых предназначены исключительно для совместимости. Например, хотя Clang реализует атомарные встроенные функции, которые точно соответствуют атомарным функциям C11 , он также реализует встроенные функции GCC __sync_*для совместимости с GCC и стандартной библиотекой C++ (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,5x), [28] повторяя более ранние отчеты о более медленной производительности. [26] Оба компилятора с тех пор эволюционировали, чтобы повысить свою производительность, и разрыв сократился:

Интерфейс

libclangпредоставляет интерфейс C, предоставляя относительно небольшой API. Раскрытая функциональность включает: разбор исходного кода в AST , загрузку AST, обход AST, связывание исходных местоположений с элементами в AST.

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

В этой таблице представлены только значимые этапы и релизы в истории Clang.

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

Ссылки

  1. ^ "LLVM 2.1 Release Notes". llvm.org . LLVM Developer Group. 27 сентября 2007 г. Архивировано из оригинала 17 ноября 2016 г. Получено 30 апреля 2018 г.
  2. ^ "LLVM 19.1.4". 19 ноября 2024 г. Получено 19 ноября 2024 г.
  3. ^ "Releases". llvm – llvm-project repo . LLVM Developer Group. 27 августа 2021 г. Архивировано из оригинала 12 сентября 2021 г. Получено 12 сентября 2021 г. – через GitHub.com .
  4. ^ abc "LICENSE.TXT", llvm.org , LLVM Developer Group, заархивировано из оригинала 11 ноября 2020 г. , извлечено 24 сентября 2019 г.
  5. ^ abc "Политика разработчиков LLVM", llvm.org , Группа разработчиков LLVM, § Авторские права, лицензии и патенты, архивировано из оригинала 13 ноября 2012 г. , извлечено 12 сентября 2021 г.
  6. ^ Кристофер, Эрик (3 июля 2008 г.). "просто интересно произношение Clang". LLVMdev (список рассылки) . Получено 22 сентября 2015 г.
  7. ^ "Поддержка OpenMP". Блог проекта LLVM . 22 мая 2015 г. Архивировано из оригинала 26 марта 2016 г. Получено 28 марта 2016 г.
  8. ^ "C++ Heterogeneous-Compute Interface for Portability". GitHub . Архивировано из оригинала 27 июня 2020 г. Получено 18 февраля 2020 г.
  9. ^ "Clang Language Extensions". Архивировано из оригинала 24 февраля 2014 г. Получено 8 ноября 2017 г. В дополнение к перечисленным здесь языковым расширениям Clang стремится поддерживать широкий спектр расширений GCC.
  10. ^ ab Clang - Возможности и цели: Совместимость с GCC, 15 апреля 2013 г., архивировано из оригинала 27 апреля 2018 г. , извлечено 30 апреля 2018 г.
  11. ^ "Clang Static Analyzer". LLVM. Архивировано из оригинала 30 апреля 2018 г. Получено 3 сентября 2009 г.
  12. «Присоединение к проекту Clang», clang.llvm.org , группа разработчиков LLVM, архивировано из оригинала 27 апреля 2018 г. , извлечено 18 сентября 2012 г. Clang является подпроектом проекта LLVM, но имеет свои собственные списки рассылки, поскольку в сообществах есть люди с разными интересами.
  13. ^ ab "Поддержка C++ и C++'0x в Clang". LLVM. Архивировано из оригинала 4 июля 2013 г. Получено 12 марта 2023 г.
  14. ^ "Clang 17.0.1 Release Notes". LLVM . Получено 25 октября 2023 г. .
  15. ^ Treat, Adam (19 февраля 2005 г.). "mkspecs и патчи для компиляции LLVM Qt4". Qt4-preview-feedback (список рассылки). Архивировано из оригинала 4 октября 2011 г.
  16. ^ Латтнер, Крис (25 мая 2007 г.). LLVM для OpenGL и другие материалы (слайды) . Встреча разработчиков LLVM. Архивировано (PDF) из оригинала 8 мая 2016 г. Получено 30 апреля 2018 г.
  17. ^ Задек, Кеннет (19 ноября 2005 г.). "Re: Предложение по интеграции LLVM/GCC". Разработка GCC (список рассылки). Архивировано из оригинала 10 марта 2016 г. Получено 25 июля 2016 г.
  18. ^ ab Naroff, Steve (25 мая 2007 г.). Новый интерфейс LLVM C (слайды) . Встреча разработчиков LLVM. Архивировано (PDF) из оригинала 3 апреля 2019 г. Получено 30 апреля 2018 г.
  19. ^ Латтнер, Крис (11 июля 2007 г.). "Новый интерфейс LLVM C: "clang"". cfe-dev (список рассылки). Архивировано из оригинала 26 марта 2020 г. . Получено 26 марта 2020 г. .
  20. ^ ab Clang team, clang: интерфейс семейства языков C для LLVM Архивировано 12 ноября 2017 г. на Wayback Machine
  21. ^ "Clang: Utility and Applications: Library Based Architecture". Архивировано из оригинала 27 апреля 2018 г. Получено 30 апреля 2018 г.
  22. ^ "FLANG: NVIDIA Brings Fortran To LLVM". Архивировано из оригинала 20 мая 2017 г. Получено 18 мая 2017 г.
  23. ^ «Добро пожаловать в документацию Flang — компилятор Flang».
  24. ^ Clang часто можно использовать в качестве замены GCC, май 2020 г., архивировано из оригинала 8 мая 2020 г. , извлечено 9 мая 2020 г.
  25. ^ Clang - Возможности и цели: Быстрая компиляция и низкое использование памяти, октябрь 2007 г., архивировано из оригинала 27 апреля 2018 г. , извлечено 30 апреля 2018 г.
  26. ^ abc Simonis, Volker (10 февраля 2011 г.). "Compiling the HotSpot VM with Clang". Архивировано из оригинала 18 февраля 2011 г. Получено 13 февраля 2011 г. Хотя общая совместимость с GCC превосходна, а время компиляции впечатляет, производительность сгенерированного кода все еще отстает от последней версии GCC.
  27. ^ "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 не являются чемпионами по производительности на данный момент, оба компонента продолжают активно разрабатываться, и, будем надеяться, в ближайшие месяцы будет больше новостей.
  28. ^ ab "GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks". OpenBenchmarking.org. 14 апреля 2014 г. Архивировано из оригинала 23 октября 2017 г. Получено 25 июня 2014 г.
  29. ^ ab Michael Larabel (23 декабря 2019 г.). "LLVM Clang достигает ~96% производительности GCC на Intel Ice Lake". Архивировано из оригинала 15 января 2021 г. Получено 14 января 2021 г.
  30. ^ "Clang против GCC — что производит лучшие двоичные файлы?". stackoverflow.com . Архивировано из оригинала 1 июня 2017 г. . Получено 1 октября 2018 г. .
  31. ^ Майкл Ларабель (11 мая 2023 г.). "LLVM Clang 16 vs. GCC 13 Compiler Performance On Intel Raptor Lake" . Получено 24 апреля 2024 г. .
  32. ^ Divacky, Roman (25 февраля 2009 г.). "[Анонс] clang/llvm может скомпилировать загрузку ядра FreeBSD на i386/amd64". Архивировано из оригинала 1 мая 2018 г. Получено 30 апреля 2018 г.
  33. Сборка FreeBSD с помощью Clang, Wiki.freebsd.org, 24 августа 2012 г., заархивировано из оригинала 30 апреля 2018 г. , извлечено 18 сентября 2012 г.
  34. ^ Хорнунг, Алекс. "llvm/clang once more". Архивировано из оригинала 30 апреля 2018 г. Получено 30 апреля 2018 г.
  35. Clang, DragonFly BSD, заархивировано из оригинала 30 апреля 2018 г. , извлечено 18 сентября 2012 г.
  36. ^ "Clang может компилировать LLVM и Clang". Блог проекта LLVM. 24 декабря 2009 г. Архивировано из оригинала 26 апреля 2012 г. Получено 31 декабря 2009 г.
  37. ^ "Clang Successfully Self-Hosts". Блог проекта LLVM. 4 февраля 2010 г. Архивировано из оригинала 26 апреля 2012 г. Получено 5 февраля 2010 г.
  38. Грегор, Дуг (20 мая 2010 г.). «Clang++ Builds Boost!». Блог проекта LLVM. Архивировано из оригинала 26 апреля 2012 г. Получено 21 мая 2010 г.
  39. ^ Дэвис, Брэд. «FreeBSD Status Reports April–June, 2010». Архивировано из оригинала 24 июня 2018 г. Получено 30 апреля 2018 г.
  40. ^ Clang собирает работающее ядро ​​Linux (загружается в RL5 с SMP, сетевыми возможностями и X, собственными хостами), Lists.cs.uiuc.edu, заархивировано из оригинала 7 сентября 2015 г. , извлечено 18 сентября 2012 г.
  41. Грегор, Дуглас (26 января 2011 г.). "Поддержка новых возможностей C++0x в Clang" (список рассылки). Архивировано из оригинала 30 января 2011 г. Получено 29 января 2011 г.
  42. ^ Зонненбергер, Йорг (19 января 2012 г.). «Состояние NetBSD и LLVM». Архивировано из оригинала 21 сентября 2016 г. Получено 26 февраля 2014 г.
  43. ^ Ледрю, Сильвестр. «Пересборка архива Debian с помощью clang». Архивировано из оригинала 1 мая 2018 г. Получено 30 апреля 2018 г.
  44. ^ "Официальный сайт Minix 3: Новости". Архивировано из оригинала 17 декабря 2009 г. Получено 7 декабря 2012 г.
  45. ^ Gerzo, Daniel (12 мая 2012 г.). "FreeBSD Quarterly Status Report January–March, 2012" (список рассылки). Архивировано из оригинала 18 февраля 2018 г. Получено 14 мая 2012 г.
  46. ^ Дэвис, Брукс (5 ноября 2012 г.). "Heads Up: Clang теперь по умолчанию на x86" (список рассылки). Архивировано из оригинала 30 апреля 2018 г. Получено 7 ноября 2012 г.
  47. ^ Вебстер, Бехан (18 февраля 2013 г.). "LLVMLinux: Компиляция Android с LLVM" (PDF) . Архивировано из оригинала (PDF) 12 мая 2014 г. . Получено 11 мая 2013 г. .
  48. ^ Tinti, Vinicius (17 марта 2013 г.). "LLVMLinux: Nexus 7". Архивировано из оригинала 11 июня 2014 г. Получено 11 мая 2013 г.
  49. ^ Дю Туа, Стефанус. «Clang is C++11 feature complete as from *just now*!». Архивировано из оригинала 24 сентября 2019 г. Получено 20 апреля 2013 г.
  50. ^ "[llvm-project] Revision 194194". Архивировано из оригинала 18 ноября 2018 г. Получено 30 апреля 2018 г.
  51. ^ Ледрю, Сильвестр. "Пересборка Debian с использованием Clang 3.5.0". Архивировано из оригинала 1 мая 2018 г. Получено 30 апреля 2018 г.
  52. ^ "История редакций NDK | Разработчики Android". developer.android.com . Архивировано из оригинала 6 марта 2018 г. . Получено 6 марта 2018 г. .
  53. ^ "История редакций NDK | Android NDK | Разработчики Android". Разработчики Android . Архивировано из оригинала 5 апреля 2019 г. Получено 30 апреля 2018 г.
  54. ^ Nagy, Robert (26 июля 2017 г.). "переключите компилятор по умолчанию на amd64 и i386 на clang" (список рассылки). Архивировано из оригинала 25 октября 2018 г. Получено 30 сентября 2017 г.
  55. ^ Кеттенис, Марк (19 января 2018 г.). «Переключите компилятор по умолчанию в armv7 на clang» (список рассылки). Архивировано из оригинала 8 апреля 2022 г. Получено 27 августа 2020 г.
  56. ^ «Clang теперь используется для сборки Chrome для Windows». blog.llvm.org . 5 марта 2018 г. Архивировано из оригинала 5 марта 2018 г. Получено 7 апреля 2018 г.
  57. ^ "Firefox Beta 63.0beta, см. все новые функции, обновления и исправления". www.mozilla.org . Архивировано из оригинала 19 апреля 2021 г. . Получено 18 марта 2020 г. .
  58. ^ Hankala, Visa (1 июля 2019 г.). «Переключите компилятор по умолчанию на octeon на clang» (список рассылки). Архивировано из оригинала 8 апреля 2022 г. Получено 27 августа 2020 г.
  59. ^ «LLVM 9 Releases With Official RISC-V Target Support, Asm Goto, Clang 9, And More». riscv.org . 26 сентября 2019 г. Архивировано из оригинала 28 декабря 2019 г. Получено 26 сентября 2019 г.
  60. ^ "FreeBSD svn commit r358454". 29 февраля 2020 г. Архивировано из оригинала 10 марта 2020 г. Получено 7 марта 2020 г.
  61. ^ Кеттенис, Марк (2 апреля 2020 г.). «Переключите компилятор по умолчанию на powerpc на clang» (список рассылки). Архивировано из оригинала 8 апреля 2022 г. Получено 27 августа 2020 г.
  62. ^ Hankala, Visa (21 декабря 2020 г.). «Сделать clang компилятором по умолчанию на loongson» (список рассылки). Архивировано из оригинала 13 января 2021 г. . Получено 1 января 2021 г. .

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