Respostas:
O gcc é muito maduro, fácil de instalar (pelo menos para a maioria dos sistemas) e é o compilador padrão para muitos sistemas; portanto, em muitos casos, as pessoas o instalam quase sem perceber. Ele foi portado para um zilhão de arquiteturas, por isso é muito mais provável que funcione imediatamente se você precisar direcionar hardware obscuro.
clang é muito mais recente. Freqüentemente produz mensagens de erro muito melhores, especialmente para modelos C ++. Em muitos casos, ele roda muito mais rápido. Ele é construído principalmente como um conjunto de bibliotecas; portanto, existem alguns outros projetos (por exemplo, analisadores de código) que usam o mesmo front-end, entendem as mesmas entradas etc. O uso do llvm como back-end fornece uma flexibilidade extra em como você gera código a partir dele.
Clang possui relatórios de erro muito melhores. Por exemplo, se você digitar um erro de digitação no nome de uma função que você chama, Clang relatará que provavelmente é um erro de digitação (e sugerirá o nome correto), enquanto o GCC reclamará de um nome de função desconhecido.
O GCC geralmente produz um código mais rápido se você segmentar x86 / x86-64. Para o ARM, a situação é ambígua, geralmente Clang otimiza melhor. Além disso, o AFAIK Clang não suporta otimização para o tamanho do código.
O GCC usa muitas heurísticas. Isso é bom para o desempenho (em um caso típico), mas péssimo se você deseja fazer alguma otimização no nível da fonte (por exemplo, desenrolamento de loop). Mesmo pequenas alterações no código-fonte podem fazer com que o GCC gere uma saída completamente diferente. O clang é mais previsível e geralmente gera o código que você espera.
Ao contrário de Jerry Coffin, acho que construir o GCC a partir da fonte é muito mais difícil que Clang. O procedimento da página de introdução do Clang sempre funcionou para mim. Manual semelhante para o GCC nunca funcionou na primeira tentativa. O GCC depende de versões específicas do GMP, MPFR, MPC, Parma Polyhedra Library e CLooG, e eu precisei de várias iterações para encontrar as versões que funcionariam para uma versão específica do GCC (sim, o uso das versões mais recentes dessas bibliotecas não funciona )
Tenho a sensação de que Clang é melhor testado que o GCC. Embora eu só use versões oficiais do GCC, às vezes produzia código defeituoso. Para Clang, geralmente uso a versão do tronco (novamente, porque é fácil de construir), mas nunca a vi gerando resultados errados.
O GCC é quase padrão no mundo Linux e adiciona muitos recursos não-padrão amplamente utilizados no software Linux. Clang tenta ser compatível com o GCC, mas às vezes simplesmente os ignora. Mais importante, o Clang não suporta o OpenMP. No entanto, ele também possui extensões que não são suportadas pelo GCC, mas podem ser úteis (por exemplo, funções intrínsecas add-with-carry __buildin_addc).
Se você quiser fazer uma pesquisa de compilador, ou apenas curioso sobre como ele funciona, você encontrará o código-fonte do Clang / LLVM mais acessível. O código Clang / LLVM é legível por humanos, não apenas legível por compilador.
(O declamador AINAL se aplica) A licença Clang / LLVM oferece mais liberdade sobre o que você pode fazer com o código, por exemplo, uso em produtos comerciais ou de código fechado. A licença para bibliotecas de tempo de execução GCC adiciona outra camada de restrições enquanto o tempo de execução do compilador Clang (biblioteca compiler-rt) está sob licença permissiva do MIT.
Resumo: compile com o Clang ao desenvolver o programa e com o GCC para a compilação final (mas verifique se é mais rápido e não quebra). Fique com o Clang / LLVM se você pesquisar o compilador.
__builtin_add
, não __buildin_addc
. De qualquer forma, Clang é inteligente o suficiente para gerar addc
quando se deparar com uma ampla add usando comparação como carry
__builtin_addc
não__buildin_addc
Se você tem uma nova arquitetura de CPU ou novas otimizações e deseja abri-las de código-fonte na GPL, pode contribuir com o gcc. No entanto, o gcc é menos modular, portanto, isso pode envolver mais trabalho para adicionar modificações / adições. Se você deseja contribuir com novas arquiteturas ou otimizações para um projeto de código aberto, mas com uma licença que não seja da GPL, é possível contribuí-las para o LLVM / clang. Existem empresas cujos departamentos jurídicos apenas permitem o último.
Hoje (11/8/2011), o GCC suporta muito mais recursos do C ++ 0x do que o Clang. Se você deseja esses recursos, é um acéfalo; GCC é sua opção.