Відповіді:
gcc дуже зрілий, простий в установці (принаймні для більшості систем), і є компілятором за замовчуванням для багатьох систем, тому у багатьох випадках люди встановлюють його майже навіть не усвідомлюючи цього. Його перенесли на мільйон архітектур, тому набагато більше шансів вийти з коробки, якщо вам доведеться націлити малопомітне обладнання.
кланг набагато новіший. Він часто видає набагато кращі повідомлення про помилки, особливо для шаблонів C ++. У багатьох випадках він працює набагато швидше. Він побудований головним чином як набір бібліотек, тому існує досить багато інших проектів (наприклад, аналізаторів коду), які використовують один і той же фронт-енд, розуміють ті самі входи і т. Д. Використання llvm в якості заднього кінця дає йому додаткову гнучкість у як ви генеруєте з нього код.
У Кланг набагато кращі повідомлення про помилки. Наприклад, якщо ви введете помилку друку в назві функції, яку ви викликаєте, Clang повідомить, що це, швидше за все, помилка друку (і запропонує правильну назву), тоді як GCC скаржиться на невідоме ім’я функції.
GCC зазвичай виробляє швидший код, якщо націлений на x86 / x86-64. Для ARM ситуація неоднозначна, часто Кланг оптимізується краще. Також AFAIK Clang не підтримує оптимізацію розміру коду.
GCC використовує багато евристики. Це добре для продуктивності (в типовому випадку), але жахливо, якщо ви хочете зробити оптимізацію рівня джерела (наприклад, розкручування циклу). Навіть невеликі зміни вихідного коду можуть змусити GCC генерувати зовсім інший вихід. Кланг більш передбачуваний, і зазвичай він генерує очікуваний вами код.
На відміну від Джері Коффіна, я вважаю, що створити GCC з джерела набагато важче, ніж Кланг. Процедура зі сторінки Кланга «Початок роботи» завжди працювала для мене. Подібний посібник для GCC ніколи не працював у першій спробі. GCC має залежність від конкретних версій GMP, MPFR, MPC, бібліотеки Parma Polyhedra та CLooG, і мені було потрібно кілька ітерацій, щоб знайти версії, які працювали б для певного випуску GCC (так, використання останніх версій цих бібліотек не працює ).
У мене є відчуття, що Кланг краще тестується, ніж GCC. Незважаючи на те, що я використовую лише офіційні випуски GCC, іноді він створював несправний код. Для Clang я зазвичай використовую магістральну версію (знову ж таки, тому, що її легко створити), але я ніколи не бачив, щоб вона давала неправильний вихід.
GCC майже стандартний у світі Linux, і він додає багато нестандартних функцій, які широко використовуються в програмному забезпеченні Linux. Кланг намагається бути сумісним з GCC, але іноді просто тихо їх ігнорує. Найголовніше, що Кланг не підтримує OpenMP. Однак він також має розширення, які не підтримуються GCC, але можуть бути корисними (наприклад, внутрішні функції доповнення з носієм __buildin_addc).
Якщо ви хочете зробити компіляторне дослідження або просто цікаво, як це працює, ви знайдете вихідний код Clang / LLVM більш доступним. Код Clang / LLVM читається людиною, не просто читається компілятором.
(Застосовується декларатор AINAL) Ліцензія Clang / LLVM дає вам більше свободи щодо того, що ви можете зробити з кодом, наприклад, використання в комерційних продуктах або продуктах із закритим кодом. Ліцензія на бібліотеки виконання GCC додає ще один рівень обмежень, тоді як час виконання компілятора Clang (бібліотека компілятора-rt) знаходиться під дозвольною ліцензією MIT.
Підсумок: компілюйте з Clang, коли розробляєте програму, та з GCC для остаточної збірки (але переконайтесь, що її швидше та не зламається). Дотримуйтесь Clang / LLVM, якщо ви робите дослідження компілятора.
__builtin_add
, ні __buildin_addc
. У будь-якому випадку, Кланг досить розумний, щоб генерувати, addc
коли він стикається з широким додаванням, використовуючи порівняння як переносити
__builtin_addc
ні__buildin_addc
Якщо у вас є нова архітектура процесора або нова оптимізація, і ви хочете відкрити їх під GPL, ви можете внести їх у gcc. Однак, gcc є менш модульним, тому це може зайняти більше роботи, щоб додати свої модифікації / доповнення. Якщо ви хочете внести нові архітектури чи оптимізації до проекту з відкритим кодом, але за ліцензією, що не стосується GPL, ви можете внести їх до LLVM / clang. Існують корпорації, юридичні управління яких дозволяють лише останні.
Сьогодні (8/11/2011) GCC підтримує набагато більше функцій C ++ 0x, ніж Кланг. Якщо ви хочете, щоб ці функції були, це не маневр; GCC - ваш варіант.