Плюсы / минусы для кого? LLVM явно превосходит бэкэнд для компиляторов, за исключением случаев, когда вам требуется смешное количество поддерживаемых архитектур. Но я предполагаю, что вы говорите о конечных пользователях.
Ответы:
19
gcc очень зрел, прост в установке (по крайней мере, для большинства систем) и является компилятором по умолчанию для многих систем, поэтому во многих случаях люди устанавливают его практически даже не осознавая этого. Он был портирован на миллионы архитектур, так что с большей вероятностью он будет работать сразу после установки, если вам придется ориентироваться на малоизвестное оборудование.
лязг намного новее. Он часто генерирует гораздо лучшие сообщения об ошибках, особенно для шаблонов C ++. Во многих случаях он работает намного быстрее. Он построен в основном как набор библиотек, поэтому существует довольно много других проектов (например, анализаторов кода), которые используют один и тот же интерфейс, понимают одни и те же входные данные и т. Д. Использование в качестве внутреннего интерфейса llvm дает ему дополнительную гибкость в как вы генерируете код из него.
Clang имеет гораздо лучшие сообщения об ошибках. Например, если вы сделаете опечатку в названии функции, которую вы вызываете, Clang сообщит, что это, скорее всего, опечатка (и предложит правильное имя), в то время как GCC будет жаловаться на неизвестное имя функции.
GCC обычно производит более быстрый код, если вы нацелены на x86 / x86-64. Для ARM ситуация неоднозначная, часто Clang оптимизирует лучше. Кроме того, AFAIK Clang не поддерживает оптимизацию по размеру кода.
GCC использует много эвристики. Это хорошо для производительности (в типичном случае), но ужасно, если вы хотите провести некоторую оптимизацию на уровне источника (например, развертывание цикла). Даже небольшие изменения исходного кода могут заставить GCC генерировать совершенно другой вывод. Clang более предсказуем и обычно генерирует ожидаемый код.
В отличие от Джерри Коффина, я нахожу создание GCC из источника намного сложнее, чем Clang. Процедура со страницы «Начало работы» Кланга всегда работала для меня. Подобное руководство для GCC никогда не работало с первой попытки. GCC зависит от определенных версий GMP, MPFR, MPC, Parma Polyhedra Library и CLooG, и мне потребовалось несколько итераций, чтобы найти версии, которые будут работать для определенного выпуска GCC (да, использование последних версий этих библиотек не работает ).
У меня такое ощущение, что Clang лучше тестируется, чем GCC. Несмотря на то, что я использую только официальные выпуски GCC, иногда он генерирует некорректный код. Для Clang я обычно использую транковую версию (опять же, потому что ее легко собрать), но я никогда не видел, чтобы она генерировала неправильный вывод.
GCC является почти стандартом в мире Linux и добавляет множество нестандартных функций, которые широко используются в программном обеспечении Linux. Clang пытается быть совместимым с GCC, но иногда он просто тихо игнорирует их. Самое главное, Clang не поддерживает OpenMP. Тем не менее, он также имеет расширения, которые не поддерживаются GCC, но могут быть полезны (например, встроенные функции add-with-carry __buildin_addc).
Если вы хотите исследовать компилятор или просто хотите узнать, как он работает, вы найдете более доступным исходный код Clang / LLVM. Код Clang / LLVM читается человеком, а не только компилятором.
(Применяется декларатор AINAL) Лицензия Clang / LLVM дает вам больше свободы в отношении того, что вы можете делать с кодом, например, использовать в коммерческих продуктах или продуктах с закрытым исходным кодом. Лицензия для библиотек времени выполнения GCC добавляет еще один уровень ограничений, в то время как время выполнения компилятора Clang (библиотека compiler-rt) находится под разрешающей лицензией MIT.
Резюме: скомпилируйте с Clang при разработке программы и с GCC для окончательной сборки (но убедитесь, что она быстрее и не ломается). Придерживайтесь Clang / LLVM, если вы проводите исследование компилятора.
Интересно, я никогда не знал, что у Clang есть надстройка с переносом. Но так и должно быть __builtin_add, нет __buildin_addc. Во всяком случае, Clang достаточно умен, чтобы генерировать, addcкогда он встречает большое добавление, используя сравнение как carry
phuclv
Я имею в виду __builtin_addcнет__buildin_addc
phuclv
Сравнения производительности здесь устарели. Согласно более поздним тестам, clang работает быстрее, чем gcc на x86 / 64 в чуть более чем половине тестов (например, openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Жюль
3
Если у вас новая архитектура процессора или новые оптимизации, и вы хотите открыть их под GPL, вы можете добавить их в gcc. Тем не менее, gcc менее модульный, так что это может потребовать больше работы для добавления своих модификаций / дополнений. Если вы хотите внести новые архитектуры или оптимизации в проект с открытым исходным кодом, но под лицензией не-GPL, вы можете передать их в LLVM / clang. Существуют корпорации, юридические отделы которых разрешают только последнее.
Этот ответ является точным и информативным в сроки, указанные в моих исследованиях.
8
Но на самом деле это не очень хороший ответ, потому что на сегодняшний день (28/07/2012) его точка зрения больше не действительна. Clang поддерживает больше, чем GCC, если что.
Ответы:
gcc очень зрел, прост в установке (по крайней мере, для большинства систем) и является компилятором по умолчанию для многих систем, поэтому во многих случаях люди устанавливают его практически даже не осознавая этого. Он был портирован на миллионы архитектур, так что с большей вероятностью он будет работать сразу после установки, если вам придется ориентироваться на малоизвестное оборудование.
лязг намного новее. Он часто генерирует гораздо лучшие сообщения об ошибках, особенно для шаблонов C ++. Во многих случаях он работает намного быстрее. Он построен в основном как набор библиотек, поэтому существует довольно много других проектов (например, анализаторов кода), которые используют один и тот же интерфейс, понимают одни и те же входные данные и т. Д. Использование в качестве внутреннего интерфейса llvm дает ему дополнительную гибкость в как вы генерируете код из него.
источник
Clang имеет гораздо лучшие сообщения об ошибках. Например, если вы сделаете опечатку в названии функции, которую вы вызываете, Clang сообщит, что это, скорее всего, опечатка (и предложит правильное имя), в то время как GCC будет жаловаться на неизвестное имя функции.
GCC обычно производит более быстрый код, если вы нацелены на x86 / x86-64. Для ARM ситуация неоднозначная, часто Clang оптимизирует лучше. Кроме того, AFAIK Clang не поддерживает оптимизацию по размеру кода.
GCC использует много эвристики. Это хорошо для производительности (в типичном случае), но ужасно, если вы хотите провести некоторую оптимизацию на уровне источника (например, развертывание цикла). Даже небольшие изменения исходного кода могут заставить GCC генерировать совершенно другой вывод. Clang более предсказуем и обычно генерирует ожидаемый код.
В отличие от Джерри Коффина, я нахожу создание GCC из источника намного сложнее, чем Clang. Процедура со страницы «Начало работы» Кланга всегда работала для меня. Подобное руководство для GCC никогда не работало с первой попытки. GCC зависит от определенных версий GMP, MPFR, MPC, Parma Polyhedra Library и CLooG, и мне потребовалось несколько итераций, чтобы найти версии, которые будут работать для определенного выпуска GCC (да, использование последних версий этих библиотек не работает ).
У меня такое ощущение, что Clang лучше тестируется, чем GCC. Несмотря на то, что я использую только официальные выпуски GCC, иногда он генерирует некорректный код. Для Clang я обычно использую транковую версию (опять же, потому что ее легко собрать), но я никогда не видел, чтобы она генерировала неправильный вывод.
GCC является почти стандартом в мире Linux и добавляет множество нестандартных функций, которые широко используются в программном обеспечении Linux. Clang пытается быть совместимым с GCC, но иногда он просто тихо игнорирует их. Самое главное, Clang не поддерживает OpenMP. Тем не менее, он также имеет расширения, которые не поддерживаются GCC, но могут быть полезны (например, встроенные функции add-with-carry __buildin_addc).
Если вы хотите исследовать компилятор или просто хотите узнать, как он работает, вы найдете более доступным исходный код Clang / LLVM. Код Clang / LLVM читается человеком, а не только компилятором.
(Применяется декларатор AINAL) Лицензия Clang / LLVM дает вам больше свободы в отношении того, что вы можете делать с кодом, например, использовать в коммерческих продуктах или продуктах с закрытым исходным кодом. Лицензия для библиотек времени выполнения GCC добавляет еще один уровень ограничений, в то время как время выполнения компилятора Clang (библиотека compiler-rt) находится под разрешающей лицензией MIT.
Резюме: скомпилируйте с Clang при разработке программы и с GCC для окончательной сборки (но убедитесь, что она быстрее и не ломается). Придерживайтесь Clang / LLVM, если вы проводите исследование компилятора.
источник
__builtin_add
, нет__buildin_addc
. Во всяком случае, Clang достаточно умен, чтобы генерировать,addc
когда он встречает большое добавление, используя сравнение как carry__builtin_addc
нет__buildin_addc
Если у вас новая архитектура процессора или новые оптимизации, и вы хотите открыть их под GPL, вы можете добавить их в gcc. Тем не менее, gcc менее модульный, так что это может потребовать больше работы для добавления своих модификаций / дополнений. Если вы хотите внести новые архитектуры или оптимизации в проект с открытым исходным кодом, но под лицензией не-GPL, вы можете передать их в LLVM / clang. Существуют корпорации, юридические отделы которых разрешают только последнее.
источник
Сегодня (8/11/2011) GCC поддерживает гораздо больше возможностей C ++ 0x, чем Clang. Если вы хотите, чтобы эти функции, это не просто; GCC ваш выбор.
источник