Clang: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
мНет описания правки
 
(не показаны 84 промежуточные версии 57 участников)
Строка 1: Строка 1:
{{Карточка программы
{{Карточка программы
|название = Clang
| название = Clang
|логотип = LLVM_Logo.png
| логотип = LLVM_Logo.png
|ширина логотипа = 220x220px
| ширина логотипа = 220x220px
|снимок экрана = <!-- только имя файла -->
| снимок экрана = <!-- только имя файла -->
|подпись =
| подпись =
| тип = [[Компилятор]]
|автор =
| автор = Крис Латтнер
|разработчик = [[Apple]] и другие
| разработчик = [[Apple]] и другие
|тип = [[Компилятор]]
| написана на = [[C++]]
|языки интерфейса =
|операционные системы = [[Кроссплатформенное программное обеспечение]]
| операционные системы = [[Кроссплатформенное программное обеспечение]]
| языки интерфейса =
|написана на = [[C++]]
|первый выпуск =
| первый выпуск = 26 сентября 2007
| последняя версия = 18.1.8<ref>{{Cite news|title=LLVM 16.0.0 Release|url=https://discourse.llvm.org/t/llvm-16-0-0-release/69326|accessdate=2023-03-17|archivedate=2023-03-18|archiveurl=https://web.archive.org/web/20230318081420/https://discourse.llvm.org/t/llvm-16-0-0-release/69326}}</ref>
|последняя версия = 3.7.0
|дата последней версии =
| дата последней версии = {{Start date and age|2024|06|18}}
|состояние = Активное
| состояние = Активное
|лицензия = [[лицензия Университета Иллинойса]] ([[:en:University of Illinois/NCSA Open Source License|англ.]])
| лицензия = [[лицензия Университета Иллинойса]] ([[:en:University of Illinois/NCSA Open Source License|англ.]])
|сайт = http://clang.llvm.org/
| сайт = http://clang.llvm.org/
}}
}}
'''Clang''' (произносится «клэнг»<ref>[http://lists.cs.uiuc.edu/pipermail/llvmdev/2008-July/015624.html Обсуждение произношения названия на рассылке llvmdev]</ref>) является [[Front and back ends|фронтендом]] для [[язык программирования|языков программирования]] [[Си (язык программирования)|C]], [[C++]], [[Objective-C]], [[Objective-C++]] ([[:en:Objective-C++|англ.]]) и [[OpenCL C|OpenCL]], использующим для оптимизации и [[кодогенерация|кодогенерации]] [[фреймворк]] [[LLVM]].


'''Clang''' (произносится «клэнг»<ref>[http://lists.cs.uiuc.edu/pipermail/llvmdev/2008-July/015624.html Обсуждение произношения названия на рассылке llvmdev] {{webarchive|url=https://web.archive.org/web/20120208050747/http://lists.cs.uiuc.edu/pipermail/llvmdev/2008-July/015624.html |date=2012-02-08 }}</ref>) является [[Front and back ends|фронтендом]] для [[язык программирования|языков программирования]] [[Си (язык программирования)|C]], [[C++]], [[Objective-C]], [[Objective-C++]] и [[OpenCL|OpenCL C]], использующимся совместно с [[фреймворк]]ом [[LLVM]]. Clang транслирует [[Исходный код|исходные коды]] в [[байт-код]] LLVM, затем фреймворк производит оптимизации и [[кодогенерация|кодогенерацию]].
Целью проекта является создание замены GNU Compiler Collection ([[GCC]]). Разработка ведётся согласно концепции [[Открытое программное обеспечение|open source]].


Целью проекта является создание замены GNU Compiler Collection ([[GCC]]). Разработка ведётся согласно концепции [[Открытое программное обеспечение|open source]] в рамках проекта LLVM.
В проекте участвуют работники нескольких корпораций, в том числе, [[Google]] и [[Apple]]. Исходный код доступен на условиях [[Лицензия BSD|BSD]]-подобной лицензии.


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


В проекте участвуют работники нескольких корпораций, в том числе [[Google (компания)|Google]] и [[Apple]]. Исходный код доступен на условиях [[Лицензия BSD|BSD]]-подобной лицензии.
Clang — это компилятор для C-подобных языков, созданный специально для работы на базе LLVM. Комбинация Clang и LLVM предоставляет набор инструментов, позволяющих полностью заменить GCC. Благодаря архитектуре, основанной на [[Библиотека (программирование)|библиотеках]], Clang (как и LLVM) легко встраивается в другие приложения.


== Обзор ==
Одной из главных задач Clang является поддержка инкрементной компиляции, позволяющей более тесно интегрировать компилятор и графический интерфейс [[Интегрированная среда разработки|среды разработки]], в отличие от GCC, который был создан для работы в классическом цикле «компиляция-линковка-отладка». В отличие от GCC, ориентированного преимущественно на [[кодогенерация|кодогенерацию]], Clang стремится предоставить универсальный фреймворк для [[парсинг]]а, индексации, статического анализа и компиляции языков семейства Си. В частности, Clang не производит упрощений исходного кода на этапе парсинга (как это делает GCC), гарантируя точное воспроизведение исходного текста в [[абстрактное синтаксическое дерево]].
Clang — это [[транслятор]] для C-подобных языков, созданный специально для работы на базе LLVM. Комбинация Clang и LLVM представляет собой полноценный компилятор и предоставляет набор инструментов, позволяющих полностью заменить GCC. Благодаря архитектуре, основанной на [[Библиотека (программирование)|библиотеках]], Clang (как и LLVM) легко встраивается в другие приложения.


Одной из главных задач Clang является поддержка инкрементной компиляции, позволяющей более тесно интегрировать компилятор и графический интерфейс [[Интегрированная среда разработки|среды разработки]], в отличие от GCC, который был создан для работы в классическом цикле «компиляция-линковка-отладка». В отличие от GCC, ориентированного преимущественно на [[кодогенерация|кодогенерацию]], Clang стремится предоставить универсальный фреймворк для [[парсинг]]а, индексации, [[Статический анализ кода|статического анализа]] и [[Компилятор|компиляции]] языков семейства Си. В частности, Clang не производит упрощений исходного кода на этапе парсинга (как это делает GCC), гарантируя точное воспроизведение исходного текста в [[абстрактное синтаксическое дерево]].
В отличие от GCC, Clang изначально спроектирован для максимального сохранения информации в ходе процесса компиляции, в том числе сохранения «внешнего вида» исходного кода. Эта особенность позволяет Clang создавать развернутые контекстно-ориентированные сообщения об ошибках, понятные как для программистов, так и для сред разработки. Модульный дизайн компилятора позволяет использовать его в составе среды разработки для индексирования кода, подсветки синтаксиса и [[реорганизация кода|реорганизации кода]].

В отличие от GCC, Clang изначально спроектирован для максимального сохранения информации в ходе процесса компиляции, в том числе сохранения «внешнего вида» исходного кода. Эта особенность позволяет Clang создавать развернутые контекстно-ориентированные сообщения об ошибках, понятные как для программистов, так и для сред разработки. Модульный дизайн компилятора позволяет использовать его в составе среды разработки для индексирования кода, [[Подсветка синтаксиса|подсветки синтаксиса]] и [[Рефакторинг|переработки кода]].


Clang поддерживает большинство распространенных опций GCC.
Clang поддерживает большинство распространенных опций GCC.


== История развития ==
== История развития ==

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


Строка 44: Строка 45:
|-
|-
|25 февраля 2009||Clang/LLVM позволяют скомпилировать [[Ядро операционной системы|ядро]] [[FreeBSD]]<ref>{{cite web
|25 февраля 2009||Clang/LLVM позволяют скомпилировать [[Ядро операционной системы|ядро]] [[FreeBSD]]<ref>{{cite web
| first = Roman
|first = Roman
| last = Divacky
|last = Divacky
| url = http://lists.freebsd.org/pipermail/freebsd-current/2009-February/003743.html
|url = http://lists.freebsd.org/pipermail/freebsd-current/2009-February/003743.html
| title = &#91;ANNOUNCE&#93; clang/llvm can compile booting FreeBSD kernel on i386/amd64
|title = &#91;ANNOUNCE&#93; clang/llvm can compile booting FreeBSD kernel on i386/amd64
| archiveurl = http://www.webcitation.org/67JxI0H6j
|archiveurl = https://www.webcitation.org/67JxI0H6j?url=http://lists.freebsd.org/pipermail/freebsd-current/2009-February/003743.html
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref><ref>[http://wiki.freebsd.org/BuildingFreeBSDWithClang BuildingFreeBSDWithClang — FreeBSD Wiki<!-- Заголовок добавлен ботом -->]</ref>. Сейчас весь исходный код FreeBSD — как ядро, так и пользовательские программы — может быть скомпилирован с помощью Clang.
}}</ref><ref>{{Cite web |url=http://wiki.freebsd.org/BuildingFreeBSDWithClang |title=BuildingFreeBSDWithClang — FreeBSD Wiki<!-- Заголовок добавлен ботом --> |access-date=2011-03-17 |archive-date=2012-10-01 |archive-url=https://web.archive.org/web/20121001103027/http://wiki.freebsd.org/BuildingFreeBSDWithClang |deadlink=no }}</ref>. Сейчас весь исходный код FreeBSD — как ядро, так и пользовательские программы — может быть скомпилирован с помощью Clang.
|-
|-
|-
|-
|16 марта 2009||Clang/LLVM компилирует работоспособное ядро [[DragonFly BSD]]<ref>{{cite web
|16 марта 2009||Clang/LLVM компилирует работоспособное ядро [[DragonFly BSD]]<ref>{{cite web
| first = Alex
|first = Alex
| last = Hornung
|last = Hornung
| url = http://leaf.dragonflybsd.org/mailarchive/kernel/2009-03/msg00067.html
|url = http://leaf.dragonflybsd.org/mailarchive/kernel/2009-03/msg00067.html
| title = llvm/clang once more
|title = llvm/clang once more
| archiveurl = http://www.webcitation.org/67JxIQ63x
|archiveurl = https://www.webcitation.org/67JxIQ63x?url=http://leaf.dragonflybsd.org/mailarchive/kernel/2009-03/msg00067.html
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref><ref>[http://www.dragonflybsd.org/docs/developer/clang/ DragonFlyBSD: clang<!-- Заголовок добавлен ботом -->]</ref>.
}}</ref><ref>{{Cite web |url=http://www.dragonflybsd.org/docs/developer/clang/ |title=DragonFlyBSD: clang<!-- Заголовок добавлен ботом --> |access-date=2011-03-17 |archive-date=2012-10-05 |archive-url=https://web.archive.org/web/20121005113539/http://www.dragonflybsd.org/docs/developer/clang/ |deadlink=no }}</ref>.
|-
|-
|23 октября 2009||Clang 1.0 впервые выпущен в составе LLVM 2.6.
|23 октября 2009||Clang 1.0 впервые выпущен в составе LLVM 2.6.
|-
|-
|Декабрь 2009||Кодогенерация для языков C и Objective-C достигла промышленного качества (поддержка C++ и Objective-C++ ещё не завершена). Компилятор C++ может осуществлять лексический разбор [[libstdc++]] из GCC 4.2 и генерировать работоспособный код для нетривиальных программ<ref name=clang>Clang team, ''[http://clang.llvm.org/ clang: a C language family frontend for LLVM]''</ref>, а также компилирует себя<ref>{{cite web
|Декабрь 2009||Кодогенерация для языков C и Objective-C достигла промышленного качества (поддержка C++ и Objective-C++ ещё не завершена). Компилятор C++ может осуществлять лексический разбор [[libstdc++]] из GCC 4.2 и генерировать работоспособный код для нетривиальных программ<ref name=clang>Clang team, ''[http://clang.llvm.org/ clang: a C language family frontend for LLVM] {{Wayback|url=http://clang.llvm.org/ |date=20110313095638 }}''</ref>, а также компилирует себя<ref>{{cite web
| publisher = Блог проекта LLVM
|publisher = Блог проекта LLVM
| url = http://blog.llvm.org/2009/12/clang-builds-llvm.html
|url = http://blog.llvm.org/2009/12/clang-builds-llvm.html
| title = Clang can compile LLVM and Clang
|title = Clang can compile LLVM and Clang
| archiveurl = http://www.webcitation.org/67JxJ28Q3
|archiveurl = https://www.webcitation.org/67JxJ28Q3?url=http://blog.llvm.org/2009/12/clang-builds-llvm.html
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|2 февраля 2010||Clang осуществил [[:en:Self-hosting|self-hosting]] (скомпилировал работоспособную версию clang+llvm)<ref>{{cite web
|2 февраля 2010||Clang осуществил [[Самодостаточность (компиляторы)|self-hosting]] (скомпилировал работоспособную версию clang+llvm)<ref>{{cite web
| publisher = Блог проекта LLVM
|publisher = Блог проекта LLVM
| url = http://blog.llvm.org/2010/02/clang-successfully-self-hosts.html
|url = http://blog.llvm.org/2010/02/clang-successfully-self-hosts.html
| title = Clang Successfully Self-Hosts
|title = Clang Successfully Self-Hosts
| archiveurl = http://www.webcitation.org/67JxJWr58
|archiveurl = https://www.webcitation.org/67JxJWr58?url=http://blog.llvm.org/2010/02/clang-successfully-self-hosts.html
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|20 февраля 2010||Исходный код [[HelenOS]] был изменен для успешной компиляции с помощью Clang и прошел все регрессионные тесты для ядра и пользовательских программ на платформе [[IA-32]]<ref>{{cite web
|20 февраля 2010||Исходный код [[HelenOS]] был изменён для успешной компиляции с помощью Clang и прошёл все регрессионные тесты для ядра и пользовательских программ на платформе [[IA-32]]<ref>{{cite web
| title = HelenOS mainline changeset head,294
|title = HelenOS mainline changeset head,294
| url = http://trac.helenos.org/trac.fcgi/changeset/mainline%2C294
|url = http://trac.helenos.org/trac.fcgi/changeset/mainline%2C294
| archiveurl = http://www.webcitation.org/67JxK0Hvu
|archiveurl = https://www.webcitation.org/67JxK0Hvu?url=http://trac.helenos.org/changeset/mainline,294
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|20 мая 2010||Последняя версия Clang успешно собирает [[Boost (библиотека)|Boost]] и проходит большинство тестов<ref>{{cite web
|20 мая 2010||Последняя версия Clang успешно собирает [[Boost (библиотека)|Boost]] и проходит большинство тестов<ref>{{cite web
| title = Clang++ Builds Boost!
|title = Clang++ Builds Boost!
| first = Doug
|first = Doug
| last = Gregor
|last = Gregor
| url = http://blog.llvm.org/2010/05/clang-builds-boost.html
|url = http://blog.llvm.org/2010/05/clang-builds-boost.html
| publisher = Блог проекта LLVM
|publisher = Блог проекта LLVM
| archiveurl = http://www.webcitation.org/67JxKWoOp
|archiveurl = https://www.webcitation.org/67JxKWoOp?url=http://blog.llvm.org/2010/05/clang-builds-boost.html
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|10 июня 2010||Clang и LLVM становятся частью [[FreeBSD]] (хотя компилятором по умолчанию остается GCC)<ref>{{cite web
|10 июня 2010||Clang и LLVM становятся частью [[FreeBSD]] (хотя компилятором по умолчанию остаётся GCC)<ref>{{cite web
| first = Brad
|first = Brad
| last = Davis
|last = Davis
| url = http://www.freebsd.org/news/status/report-2010-04-2010-06.html#Clang-Replacing-GCC-in-the-Base-System
|url = http://www.freebsd.org/news/status/report-2010-04-2010-06.html#Clang-Replacing-GCC-in-the-Base-System
| title = FreeBSD Status Reports April - June, 2010
|title = FreeBSD Status Reports April - June, 2010
| archiveurl = http://www.webcitation.org/67JxL3rcf
|archiveurl = https://www.webcitation.org/67JxL3rcf?url=http://www.freebsd.org/news/status/report-2010-04-2010-06.html#Clang-Replacing-GCC-in-the-Base-System
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|25 октября 2010||Clang/LLVM успешно компилирует ядро [[Linux]] (частично)<ref>[http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-October/011711.html &#91;ANNOUNCE&#93; Clang builds a working Linux Kernel (Boots to RL5 with SMP, networking and X, self hosts)]</ref>. До полной поддержки остаётся исправить несколько ошибок в clang<ref>
|25 октября 2010||Clang/LLVM успешно компилирует ядро [[Linux]] (частично)<ref>[http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-October/011711.html &#91;ANNOUNCE&#93; Clang builds a working Linux Kernel (Boots to RL5 with SMP, networking and X, self hosts)] {{webarchive|url=https://web.archive.org/web/20150907044958/http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-October/011711.html |date=2015-09-07 }}</ref>. До полной поддержки остаётся исправить несколько ошибок в clang<ref>{{Cite web |url=http://llvm.org/bugs/show_bug.cgi?id=4068 |title=Страница отслеживания ошибок llvm, препятствующих сборке ядра Linux |access-date=2011-10-17 |archive-date=2014-06-09 |archive-url=https://web.archive.org/web/20140609150754/http://llvm.org/bugs/show_bug.cgi?id=4068 |deadlink=no }}</ref> и избавиться от некоторых gnu-специфичных конструкций в ядре.
[http://llvm.org/bugs/show_bug.cgi?id=4068 Страница отслеживания ошибок llvm, препятствующих сборке ядра Linux]</ref> и избавиться от некоторых gnu-специфичных конструкций в ядре.
|-
|-
|Январь 2011||Проведена предварительная работа по поддержке черновика стандарта [[C++0x]], в разрабатываемой версии Clang поддерживаются некоторые новые возможности<ref>{{cite mailing list
|Январь 2011||Проведена предварительная работа по поддержке черновика стандарта [[C++0x]], в разрабатываемой версии Clang поддерживаются некоторые новые возможности<ref>{{cite mailing list
Строка 114: Строка 121:
| last=Gregor
| last=Gregor
| title=New C++0x feature support in Clang
| title=New C++0x feature support in Clang
| date=26 January 2011
|date=2011-01-26
| accessdate=29 января 2011
| accessdate=2011-01-29
| url-status=dead
}}</ref><ref>{{cite web
| archiveurl=https://web.archive.org/web/20110130065354/http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-January/013013.html
| publisher = LLVM
| archivedate=2011-01-30
| url = http://clang.llvm.org/cxx_status.html
}}</ref><ref>{{cite web
| title = C++ and C++'0x Support in Clang
|publisher = LLVM
| archiveurl = http://www.webcitation.org/67JxLYdwB
|url = http://clang.llvm.org/cxx_status.html
| archivedate = 2012-05-01
|title = C++ and C++'0x Support in Clang
|archiveurl = https://www.webcitation.org/67JxLYdwB?url=http://clang.llvm.org/cxx_status.html
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|10 февраля 2011||Clang успешно компилирует [[Java Virtual Machine|виртуальную машину Java]] [[HotSpot]]<ref name="Simonis">{{cite web
|10 февраля 2011||Clang успешно компилирует [[Java Virtual Machine|виртуальную машину Java]] [[HotSpot]]<ref name="Simonis">{{cite web
| url = http://weblogs.java.net/blog/simonis/archive/2011/02/10/compiling-hotspot-vm-clang
|url = http://weblogs.java.net/blog/simonis/archive/2011/02/10/compiling-hotspot-vm-clang
| first = Volker
|first = Volker
| last = Simonis
|last = Simonis
| title = Compiling the HotSpot VM with Clang
|title = Compiling the HotSpot VM with Clang
| date = 10 February 2011
|date = 2011-02-10
| quote = ''While the overall GCC compatibility is excellent and the compile times are impressive, the performance of the generated code is still lacking behind a recent GCC version. ''
|quote = ''While the overall GCC compatibility is excellent and the compile times are impressive, the performance of the generated code is still lacking behind a recent GCC version. ''
| accessdate = 13 февраля 2011
|accessdate = 2011-02-13
| archiveurl = http://www.webcitation.org/67JxM051z
|archiveurl = https://www.webcitation.org/67JxM051z?url=http://weblogs.java.net/blog/simonis/archive/2011/02/10/compiling-hotspot-vm-clang
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|18 августа 2011||Неофициальная версия Clang с поддержкой [[SafeCode]], технологией отслеживания возможных проблем при работе с памятью в разрабатываемом приложении<ref name="SafeCode">{{cite web
|18 августа 2011||Неофициальная версия Clang с поддержкой [[SafeCode]], технологией отслеживания возможных проблем при работе с памятью в разрабатываемом приложении<ref name="SafeCode">{{cite web
| url = http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-August/042506.html
|url = http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-August/042506.html
| first = John
|first = John
| last = Criswell
|last = Criswell
| title = &#91;LLVMdev&#93; Clang + SAFECode Release Announcement
|title = &#91;LLVMdev&#93; Clang + SAFECode Release Announcement
| date = 18 august 2011
|date = 2011-08-18
| accessdate = 25 августа 2011
|accessdate = 2011-08-25
| archiveurl = http://www.webcitation.org/67JxMWDqM
|archiveurl = https://www.webcitation.org/67JxMWDqM?url=http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-August/042506.html
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|22 октября 2011||Обеспечена возможность сборки [[LibreOffice]] компилятором Clang<ref>{{cite web
|22 октября 2011||Обеспечена возможность сборки [[LibreOffice]] компилятором Clang<ref>{{cite web
| url = http://lists.freedesktop.org/archives/libreoffice/2011-October/019632.html
|url = http://lists.freedesktop.org/archives/libreoffice/2011-October/019632.html
| title = Building LibreOffice with Clang
|title = Building LibreOffice with Clang
| date = 22 october 2011
|date = 2011-10-22
| accessdate = 23 октября 2011
|accessdate = 2011-10-23
| archiveurl = http://www.webcitation.org/67JxN1ZVJ
|archiveurl = https://www.webcitation.org/67JxN1ZVJ?url=http://lists.freedesktop.org/archives/libreoffice/2011-October/019632.html
| archivedate = 2012-05-01
|archivedate = 2012-04-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|28 февраля 2012||Clang 3.0 смог скомпилировать более 91 % пакетов Debian<ref>{{cite web
|28 февраля 2012||Clang 3.0 смог скомпилировать более 91 % пакетов Debian<ref>{{cite web
| first = Sylvestre
|first = Sylvestre
| last = Ledru
|last = Ledru
| url = http://clang.debian.net/
|url = http://clang.debian.net/
| title = Rebuild of the Debian archive with clang
|title = Rebuild of the Debian archive with clang
| archiveurl = http://www.webcitation.org/68WUnYciw
|archiveurl = https://www.webcitation.org/68WUnYciw?url=http://clang.debian.net/
| archivedate = 2012-06-19
|archivedate = 2012-06-18
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|29 февраля 2012||Clang стал основным компилятором для [[Minix]] 3<ref>{{cite web
|29 февраля 2012||Clang стал основным компилятором для [[Minix]] 3<ref>{{cite web
| first = Releases
|first = Releases
| last = Minix 3.2.0
|last = Minix 3.2.0
| url = http://wiki.minix3.org/en/MinixReleases
|url = http://wiki.minix3.org/en/MinixReleases
| title = Clang is the default compiler
|title = Clang is the default compiler
| archiveurl = http://www.webcitation.org/68WUo9Bot
|archiveurl = https://www.webcitation.org/68WUo9Bot?url=http://wiki.minix3.org/en/MinixReleases
| archivedate = 2012-06-19
|archivedate = 2012-06-18
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|12 мая 2012||Объявлено о замене [[GCC]] на Clang в базовой системе [[FreeBSD]]<ref>{{cite web
|12 мая 2012||Объявлено о замене [[GCC]] на Clang в базовой системе [[FreeBSD]]<ref>{{cite web
| first = Daniel
|first = Daniel
| last = Gerzo
|last = Gerzo
| url = http://lists.freebsd.org/pipermail/freebsd-stable/2012-May/067486.html
|url = http://lists.freebsd.org/pipermail/freebsd-stable/2012-May/067486.html
| title = FreeBSD Quarterly Status Report January-March, 2012
|title = FreeBSD Quarterly Status Report January-March, 2012
| archiveurl = http://www.webcitation.org/68oC9gNMN
|archiveurl = https://www.webcitation.org/68oC9gNMN?url=http://lists.freebsd.org/pipermail/freebsd-stable/2012-May/067486.html
| archivedate = 2012-06-30
|archivedate = 2012-06-30
|deadurl = yes
}}</ref>.
}}</ref>.
|-
|-
|14 июля 2012||Продемонстрирован запуск openSUSE с ядром Linux, собранным при помощи Clang<ref>{{cite web
|14 июля 2012||Продемонстрирован запуск openSUSE с ядром Linux, собранным при помощи Clang<ref>{{cite web
| url = http://www.opennet.ru/opennews/art.shtml?num=34333
|url = http://www.opennet.ru/opennews/art.shtml?num=34333
| title = OpenNews: Продемонстрирован запуск openSUSE с ядром Linux, собранным при помощи Clang
|title = OpenNews: Продемонстрирован запуск openSUSE с ядром Linux, собранным при помощи Clang
|deadurl = yes
| archiveurl = http://www.webcitation.org/69lqdYqwj
| archivedate = 2012-08-08
|accessdate = 2012-07-16
|archive-date = 2012-07-18
}}</ref>.
|archive-url = https://web.archive.org/web/20120718014354/http://www.opennet.ru/opennews/art.shtml?num=34333
}}</ref>.
|-
|-
|19 апреля 2013||Объявлено о поддержке Clang’ом стандарта языка C++11<ref>{{cite web
|19 апреля 2013||Объявлено о поддержке Clang’ом стандарта языка C++11<ref>{{cite web
Строка 195: Строка 214:
| url=https://twitter.com/sdt_intel/status/325289093170864129
| url=https://twitter.com/sdt_intel/status/325289093170864129
| title=Clang is C++11 feature complete as of *just now*!
| title=Clang is C++11 feature complete as of *just now*!
| access-date=2013-04-22
}}</ref>.
| archive-date=2019-09-24
| archive-url=https://web.archive.org/web/20190924204137/https://twitter.com/stefanusdutoit/status/325289093170864129
| deadlink=no
}}</ref>.
|-
|-
|18 июня 2013||Релиз Clang 3.3 поддерживает 100 % возможностей C++11.
|18 июня 2013||Релиз Clang 3.3 поддерживает 100 % возможностей C++11.
|-
|-
|07 ноября 2013||Clang поддерживает 100 % возможностей C++14<ref>[http://llvm.org/viewvc/llvm-project?view=revision&revision=194194 [llvm-project&#93; Revision 194194<!-- Заголовок добавлен ботом -->]</ref>.
|07 ноября 2013||Clang поддерживает 100 % возможностей C++14<ref>[http://llvm.org/viewvc/llvm-project?view=revision&revision=194194]{{Wayback|url=http://llvm.org/viewvc/llvm-project?view=revision&revision=194194|date=20170130114326}}<span> [llvm-project</span>&#x5D;<span> Revision 194194<!-- Заголовок добавлен ботом --></span></ref>.
|-
|11 сентября 2014
|С помощью Clang 3.5 можно пересобрать 94,3 % архива Debian. Доля неудач при сборках снизилась с января 2013 г. на 1,2 % на релиз, в основном вследствие повышения совместимости с флагами GCC<ref>{{Cite web|url=http://sylvestre.ledru.info/blog/2014/09/11/rebuild-of-debian-using-clang-3-5|title=Rebuild of Debian using Clang 3.5.0|publisher=sylvestre.ledru.info|accessdate=2016-05-06|archive-date=2016-04-19|archive-url=https://web.archive.org/web/20160419003014/http://sylvestre.ledru.info/blog/2014/09/11/rebuild-of-debian-using-clang-3-5|deadlink=no}}</ref>.
|-
|13 марта 2017
|Clang 4.0.0 [http://releases.llvm.org/4.0.0/docs/ReleaseNotes.html Релиз].
|-
|26 июля 2017||Clang становится компилятором по умолчанию в [[OpenBSD]] 6.2.<ref>{{cite mailing list
| url=https://marc.info/?l=openbsd-cvs&m=150109829003860&w=2
| first=Robert
| last=Nagy
| title=switch the default compiler on amd64 and i386 to clang
|date=2017-07-26
| accessdate=2017-09-30
| archivedate=2018-10-25
| archiveurl=https://web.archive.org/web/20181025144820/https://marc.info/?l=openbsd-cvs&m=150109829003860&w=2
}}</ref>.
|-
|7 сентября 2017
|Clang 5.0.0 [https://releases.llvm.org/5.0.0/tools/clang/docs/ReleaseNotes.html Релиз].
|-
|5 марта 2018||Clang становится компилятором по умолчанию сборок [[Google Chrome]] для всех поддерживаемых платформ.<ref>{{Cite web|url=http://blog.llvm.org/2018/03/clang-is-now-used-to-build-chrome-for.html|title=Clang is now used to build Chrome for Windows|accessdate=2018-03-06|archive-date=2018-03-05|archive-url=https://web.archive.org/web/20180305220009/http://blog.llvm.org/2018/03/clang-is-now-used-to-build-chrome-for.html|deadlink=no}}</ref>
|-
|8 марта 2018
|Clang 6.0.0 [https://releases.llvm.org/6.0.0/tools/clang/docs/ReleaseNotes.html Релиз].
|-
|19 сентября 2018
|Clang 7.0.0 [https://releases.llvm.org/7.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|20 марта 2019
|Clang 8.0.0 [https://releases.llvm.org/8.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|19 сентября 2019
|Clang 9.0.0 [https://releases.llvm.org/9.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|24 марта 2020
|Clang 10.0.0 [https://releases.llvm.org/10.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|6 января 2021
|Clang 11.0.0 [https://releases.llvm.org/11.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|14 апреля 2021
|Clang 12.0.0 [https://releases.llvm.org/12.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|4 октября 2021
|Clang 13.0.0 [https://releases.llvm.org/13.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|25 марта 2022
|Clang 14.0.0 [https://releases.llvm.org/14.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|6 сентября 2022
|Clang 15.0.0 [https://releases.llvm.org/15.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|-
|17 марта 2023
|Clang 16.0.0 [https://releases.llvm.org/16.0.0/tools/clang/docs/ReleaseNotes.html Релиз]
|}
|}


Строка 206: Строка 284:


== Ссылки ==
== Ссылки ==

* [http://clang.llvm.org/ Официальная страница проекта]
* [http://clang.llvm.org/ Официальная страница проекта]


Строка 213: Строка 290:
[[Категория:Компиляторы C++]]
[[Категория:Компиляторы C++]]
[[Категория:Компиляторы Obj-C]]
[[Категория:Компиляторы Obj-C]]
[[Категория:Программное обеспечение для OS X]]
[[Категория:Статические анализаторы кода]]
[[Категория:Программное обеспечение для macOS]]
[[Категория:Программное обеспечение для Linux]]
[[Категория:Программное обеспечение для Linux]]
[[Категория:Свободные компиляторы и интерпретаторы]]
[[Категория:Свободные компиляторы и интерпретаторы]]
[[Категория:Программное обеспечение Apple]]

Текущая версия от 03:46, 8 ноября 2024

Clang
Логотип программы Clang
Скриншот программы Clang
Тип Компилятор
Автор Крис Латтнер
Разработчики Apple и другие
Написана на C++
Операционная система Кроссплатформенное программное обеспечение
Первый выпуск 26 сентября 2007
Аппаратные платформы кроссплатформенность, Linux, FreeBSD, NetBSD, OpenBSD, Миникс 3, DragonFly BSD, BSD, X86, x86-64, RISC-V, ARM, PowerPC и WebAssembly
Последняя версия 18.1.8[1] (18 июня 2024; 6 месяцев назад (2024-06-18))
Репозиторий github.com/llvm/llvm-pro…
Состояние Активное
Лицензия лицензия Университета Иллинойса (англ.)
Сайт clang.llvm.org
Логотип Викисклада Медиафайлы на Викискладе

Clang (произносится «клэнг»[2]) является фронтендом для языков программирования C, C++, Objective-C, Objective-C++ и OpenCL C, использующимся совместно с фреймворком LLVM. Clang транслирует исходные коды в байт-код LLVM, затем фреймворк производит оптимизации и кодогенерацию.

Целью проекта является создание замены GNU Compiler Collection (GCC). Разработка ведётся согласно концепции open source в рамках проекта LLVM.

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

В проекте участвуют работники нескольких корпораций, в том числе Google и Apple. Исходный код доступен на условиях BSD-подобной лицензии.

Clang — это транслятор для C-подобных языков, созданный специально для работы на базе LLVM. Комбинация Clang и LLVM представляет собой полноценный компилятор и предоставляет набор инструментов, позволяющих полностью заменить GCC. Благодаря архитектуре, основанной на библиотеках, Clang (как и LLVM) легко встраивается в другие приложения.

Одной из главных задач Clang является поддержка инкрементной компиляции, позволяющей более тесно интегрировать компилятор и графический интерфейс среды разработки, в отличие от GCC, который был создан для работы в классическом цикле «компиляция-линковка-отладка». В отличие от GCC, ориентированного преимущественно на кодогенерацию, Clang стремится предоставить универсальный фреймворк для парсинга, индексации, статического анализа и компиляции языков семейства Си. В частности, Clang не производит упрощений исходного кода на этапе парсинга (как это делает GCC), гарантируя точное воспроизведение исходного текста в абстрактное синтаксическое дерево.

В отличие от GCC, Clang изначально спроектирован для максимального сохранения информации в ходе процесса компиляции, в том числе сохранения «внешнего вида» исходного кода. Эта особенность позволяет Clang создавать развернутые контекстно-ориентированные сообщения об ошибках, понятные как для программистов, так и для сред разработки. Модульный дизайн компилятора позволяет использовать его в составе среды разработки для индексирования кода, подсветки синтаксиса и переработки кода.

Clang поддерживает большинство распространенных опций GCC.

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

[править | править код]

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

Дата Событие
25 февраля 2009 Clang/LLVM позволяют скомпилировать ядро FreeBSD[3][4]. Сейчас весь исходный код FreeBSD — как ядро, так и пользовательские программы — может быть скомпилирован с помощью Clang.
16 марта 2009 Clang/LLVM компилирует работоспособное ядро DragonFly BSD[5][6].
23 октября 2009 Clang 1.0 впервые выпущен в составе LLVM 2.6.
Декабрь 2009 Кодогенерация для языков C и Objective-C достигла промышленного качества (поддержка C++ и Objective-C++ ещё не завершена). Компилятор C++ может осуществлять лексический разбор libstdc++ из GCC 4.2 и генерировать работоспособный код для нетривиальных программ[7], а также компилирует себя[8].
2 февраля 2010 Clang осуществил self-hosting (скомпилировал работоспособную версию clang+llvm)[9].
20 февраля 2010 Исходный код HelenOS был изменён для успешной компиляции с помощью Clang и прошёл все регрессионные тесты для ядра и пользовательских программ на платформе IA-32[10].
20 мая 2010 Последняя версия Clang успешно собирает Boost и проходит большинство тестов[11].
10 июня 2010 Clang и LLVM становятся частью FreeBSD (хотя компилятором по умолчанию остаётся GCC)[12].
25 октября 2010 Clang/LLVM успешно компилирует ядро Linux (частично)[13]. До полной поддержки остаётся исправить несколько ошибок в clang[14] и избавиться от некоторых gnu-специфичных конструкций в ядре.
Январь 2011 Проведена предварительная работа по поддержке черновика стандарта C++0x, в разрабатываемой версии Clang поддерживаются некоторые новые возможности[15][16].
10 февраля 2011 Clang успешно компилирует виртуальную машину Java HotSpot[17].
18 августа 2011 Неофициальная версия Clang с поддержкой SafeCode, технологией отслеживания возможных проблем при работе с памятью в разрабатываемом приложении[18].
22 октября 2011 Обеспечена возможность сборки LibreOffice компилятором Clang[19].
28 февраля 2012 Clang 3.0 смог скомпилировать более 91 % пакетов Debian[20].
29 февраля 2012 Clang стал основным компилятором для Minix 3[21].
12 мая 2012 Объявлено о замене GCC на Clang в базовой системе FreeBSD[22].
14 июля 2012 Продемонстрирован запуск openSUSE с ядром Linux, собранным при помощи Clang[23].
19 апреля 2013 Объявлено о поддержке Clang’ом стандарта языка C++11[24].
18 июня 2013 Релиз Clang 3.3 поддерживает 100 % возможностей C++11.
07 ноября 2013 Clang поддерживает 100 % возможностей C++14[25].
11 сентября 2014 С помощью Clang 3.5 можно пересобрать 94,3 % архива Debian. Доля неудач при сборках снизилась с января 2013 г. на 1,2 % на релиз, в основном вследствие повышения совместимости с флагами GCC[26].
13 марта 2017 Clang 4.0.0 Релиз.
26 июля 2017 Clang становится компилятором по умолчанию в OpenBSD 6.2.[27].
7 сентября 2017 Clang 5.0.0 Релиз.
5 марта 2018 Clang становится компилятором по умолчанию сборок Google Chrome для всех поддерживаемых платформ.[28]
8 марта 2018 Clang 6.0.0 Релиз.
19 сентября 2018 Clang 7.0.0 Релиз
20 марта 2019 Clang 8.0.0 Релиз
19 сентября 2019 Clang 9.0.0 Релиз
24 марта 2020 Clang 10.0.0 Релиз
6 января 2021 Clang 11.0.0 Релиз
14 апреля 2021 Clang 12.0.0 Релиз
4 октября 2021 Clang 13.0.0 Релиз
25 марта 2022 Clang 14.0.0 Релиз
6 сентября 2022 Clang 15.0.0 Релиз
17 марта 2023 Clang 16.0.0 Релиз

Примечания

[править | править код]
  1. "LLVM 16.0.0 Release". Архивировано 18 марта 2023. Дата обращения: 17 марта 2023.
  2. Обсуждение произношения названия на рассылке llvmdev Архивировано 8 февраля 2012 года.
  3. Divacky, Roman [ANNOUNCE] clang/llvm can compile booting FreeBSD kernel on i386/amd64. Архивировано из оригинала 30 апреля 2012 года.
  4. BuildingFreeBSDWithClang — FreeBSD Wiki. Дата обращения: 17 марта 2011. Архивировано 1 октября 2012 года.
  5. Hornung, Alex llvm/clang once more. Архивировано из оригинала 30 апреля 2012 года.
  6. DragonFlyBSD: clang. Дата обращения: 17 марта 2011. Архивировано 5 октября 2012 года.
  7. Clang team, clang: a C language family frontend for LLVM Архивная копия от 13 марта 2011 на Wayback Machine
  8. Clang can compile LLVM and Clang. Блог проекта LLVM. Архивировано из оригинала 30 апреля 2012 года.
  9. Clang Successfully Self-Hosts. Блог проекта LLVM. Архивировано из оригинала 30 апреля 2012 года.
  10. HelenOS mainline changeset head,294. Архивировано из оригинала 30 апреля 2012 года.
  11. Gregor, Doug Clang++ Builds Boost! Блог проекта LLVM. Архивировано из оригинала 30 апреля 2012 года.
  12. Davis, Brad FreeBSD Status Reports April - June, 2010. Архивировано из оригинала 30 апреля 2012 года.
  13. [ANNOUNCE] Clang builds a working Linux Kernel (Boots to RL5 with SMP, networking and X, self hosts) Архивировано 7 сентября 2015 года.
  14. Страница отслеживания ошибок llvm, препятствующих сборке ядра Linux. Дата обращения: 17 октября 2011. Архивировано 9 июня 2014 года.
  15. Gregor, Douglas (2011-01-26). "New C++0x feature support in Clang" (Mailing list). Архивировано из оригинала 30 января 2011. Дата обращения: 29 января 2011.
  16. C++ and C++'0x Support in Clang. LLVM. Архивировано из оригинала 30 апреля 2012 года.
  17. Simonis, Volker Compiling the HotSpot VM with Clang (10 февраля 2011). — «While the overall GCC compatibility is excellent and the compile times are impressive, the performance of the generated code is still lacking behind a recent GCC version. ». Дата обращения: 13 февраля 2011. Архивировано из оригинала 30 апреля 2012 года.
  18. Criswell, John [LLVMdev] Clang + SAFECode Release Announcement (18 августа 2011). Дата обращения: 25 августа 2011. Архивировано из оригинала 30 апреля 2012 года.
  19. Building LibreOffice with Clang (22 октября 2011). Дата обращения: 23 октября 2011. Архивировано из оригинала 30 апреля 2012 года.
  20. Ledru, Sylvestre Rebuild of the Debian archive with clang. Архивировано из оригинала 18 июня 2012 года.
  21. Minix 3.2.0, Releases Clang is the default compiler. Архивировано из оригинала 18 июня 2012 года.
  22. Gerzo, Daniel FreeBSD Quarterly Status Report January-March, 2012. Архивировано из оригинала 30 июня 2012 года.
  23. OpenNews: Продемонстрирован запуск openSUSE с ядром Linux, собранным при помощи Clang. Дата обращения: 16 июля 2012. Архивировано из оригинала 18 июля 2012 года.
  24. Du Toit, Stefanus Clang is C++11 feature complete as of *just now*! Дата обращения: 22 апреля 2013. Архивировано 24 сентября 2019 года.
  25. [1]Архивная копия от 30 января 2017 на Wayback Machine [llvm-project] Revision 194194
  26. Rebuild of Debian using Clang 3.5.0. sylvestre.ledru.info. Дата обращения: 6 мая 2016. Архивировано 19 апреля 2016 года.
  27. Nagy, Robert (2017-07-26). "switch the default compiler on amd64 and i386 to clang" (Mailing list). Архивировано 25 октября 2018. Дата обращения: 30 сентября 2017.
  28. Clang is now used to build Chrome for Windows. Дата обращения: 6 марта 2018. Архивировано 5 марта 2018 года.