Prós / Contras para quem? O LLVM é claramente superior como back-end para compiladores, exceto se você precisar de uma quantidade ridícula de arquiteturas suportadas. Mas suponho que você esteja falando sobre usuários finais.
Respostas:
19
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.
Interessante, nunca soube que Clang é intrínseco ao add-with-carry. Mas deveria ser __builtin_add, não __buildin_addc. De qualquer forma, Clang é inteligente o suficiente para gerar addcquando se deparar com uma ampla add usando comparação como carry
phuclv
Quero dizer que __builtin_addcnão__buildin_addc
phuclv 19/03/2015
As comparações de desempenho aqui estão desatualizadas. De acordo com valores de referência mais recentes, tinido é mais rápido do que o gcc na x 86/64 em ligeiramente mais de metade testes (por exemplo openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Jules
3
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.
Esta resposta é precisa e informativa dentro do prazo especificado de acordo com minha pesquisa.
8
Mas não é realmente uma resposta muito boa, porque a partir de hoje (28/07/2012) seu ponto não é mais válido. Clang suporta mais do que o GCC, se houver.
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.
fonte
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.
fonte
__builtin_add
, não__buildin_addc
. De qualquer forma, Clang é inteligente o suficiente para geraraddc
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.
fonte
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.
fonte