В двух словах:
Компиляторы в основном разделены на две части. Одним из них является интерфейс, содержащий синтаксический анализатор и семантический анализ для языка программирования. Фронт-энд производит какое-то промежуточное представление вашего кода. Кроме того, есть серверная часть, которая берет материал, созданный интерфейсом, оптимизирует его и в конечном итоге генерирует код сборки.
- GCC : хорошо известный компилятор, содержит как интерфейсы для различных языков, так и фоны для многих процессорных архитектур
- LLVM : набор серверных частей для различных архитектур (и других низкоуровневых компонентов)
- clang : новый интерфейс для C, Objective-C и C ++; использует бэк-энды LLVM. Вы получите больше читаемых ошибок и предупреждений от вашего компилятора и более короткое время компиляции. Вы также можете столкнуться с несовместимостью или ошибками; Clang - очень молодой проект.
- LLVM-GCC: внешний интерфейс GCC с внутренним интерфейсом LLVM. Серверная часть LLVM работает быстрее, чем GCC.
Поддержка Clang (Objective-) C ++ далека от завершения, поэтому она вызывает llvm-gcc при обнаружении исходного файла C ++. Он также содержит статический анализатор, который теперь интегрирован в XCode. Некоторые люди говорят, что бэкэнд LLVM генерирует лучший код, чем GCC, но ваш пробег может отличаться. LLVM также поддерживает оптимизацию времени соединения (которую вы можете включить в настройках проекта XCode). Они могут генерировать более быстрый код.
Apple хочет заменить GCC на clang в будущем, потому что у них есть политика в отношении лицензионного кода GPLv3 (GCC 4.2 - последняя версия, лицензированная под GPLv2).