LLVM vs clang no OS X

133

Eu tenho uma pergunta sobre llvm, clang e gcc no OS X.

Qual é a diferença entre o llvm-gcc 4.2, llvm 2.0 e clang? Eu sei que todos eles constroem no llvm, mas como eles são diferentes?

Além da compilação mais rápida, qual é a vantagem do llvm sobre o gcc?

dominik
fonte
9
O llvm é apenas um back-end, não pode haver um compilador independente do llvm ... existem apenas frontends diferentes para ele, como gcc e clang.
Smerlin #
4
@smerlin: "compilador LLVM" é o nome comercial da Apple para clang + llvm: developer.apple.com/technologies/tools/...
Stephen Canon
Outros detalhes aqui: stackoverflow.com/a/26724886/1938163
Marco A.

Respostas:

201

O LLVM originalmente significava "máquina virtual de baixo nível", apesar de agora apenas representar a si mesmo, pois cresceu para ser algo diferente de uma máquina virtual tradicional. É um conjunto de bibliotecas e ferramentas, bem como uma representação intermediária padronizada, que pode ser usada para ajudar a construir compiladores e compiladores just-in-time. Ele não pode compilar nada além de sua própria representação intermediária; ele precisa de um front-end específico do idioma para fazer isso. Se as pessoas se referem ao LLVM, provavelmente significam apenas a biblioteca e as ferramentas de baixo nível. Algumas pessoas podem se referir a Clang ou llvm-gcc incorretamente como "LLVM", o que pode causar alguma confusão.

O llvm-gcc é uma versão modificada do GCC, que usa o LLVM como back-end em vez do próprio GCC. Agora está obsoleto, em favor do DragonEgg, que usa o novo sistema de plug-ins do GCC para fazer a mesma coisa sem usar o GCC.

Clang é um compilador C / C ++ / Objective-C totalmente novo, que usa seu próprio front-end e LLVM como back-end. As vantagens que ele oferece são melhores mensagens de erro, tempo de compilação mais rápido e uma maneira mais fácil de outras ferramentas se conectarem ao processo de compilação (como o depurador LLDB e o analisador estático Clang ). Também é razoavelmente modular e, portanto, pode ser usado como uma biblioteca para outro software que precisa analisar o código C, C ++ ou Objective-C.

Cada uma dessas abordagens (GCC simples, GCC + LLVM e Clang) tem suas vantagens e desvantagens. Os últimos conjuntos de benchmarks que eu vi mostraram que o GCC produzia código um pouco mais rápido na maioria dos casos de teste (embora o LLVM tivesse uma leve vantagem em alguns), enquanto o LLVM e o Clang proporcionaram tempos de compilação significativamente melhores. O GCC e os combos GCC / LLVM têm a vantagem de muito mais código ter sido testado e funcionar com o sabor C do GCC; existem algumas extensões específicas do compilador que apenas o GCC possui e alguns locais em que o padrão permite que a implementação varie, mas o código depende de uma implementação específica. É muito mais provável que, se você obtiver uma grande quantidade de código C legado, ele funcione no GCC do que em Clang, embora isso melhore ao longo do tempo.

Brian Campbell
fonte
13
Para adicionar a esta maravilhosa resposta: clang também é um conjunto de bibliotecas (chamado libclang) que você pode usar para coisas como análise de código, preenchimento automático, destaque de sintaxe, etc. Isso é muito útil para IDEs.
5
Ao criar para o MacOS X ou iOS, considere que o Clang é o software que a Apple usa para criar todos os seus softwares MacOS X e iOS, incluindo o sistema operacional, e que o Clang é o que você obtém automaticamente, sem esforço, e o que todos que você já viu pedir ajuda está usando. A Apple nunca suportou o gcc anterior ao gcc 4.2 e não fornece mais nenhuma versão do gcc.
gnasher729
1
@ gnasher729 Sim, esta resposta foi escrita há 3 anos, quando a Apple ainda estava enviando o llvm-gcc e o Clang, com o llvm-gcc como compilador padrão. Os tempos mudaram desde então.
Brian Campbell
54

Existem 2 coisas diferentes aqui.

O LLVM é um compilador de back-end destinado a criar compiladores sobre ele. Ele lida com otimizações e produção de código adaptado à arquitetura de destino.

O CLang é um front end que analisa os códigos C, C ++ e Objective C e o converte em uma representação adequada para LLVM.

O llvm gcc era uma versão inicial de um compilador C ++ baseado no llvm baseado no gcc 4.2, que agora está obsoleto, pois o CLang pode analisar tudo o que poderia analisar e muito mais.

Finalmente, a principal diferença entre CLang e gcc não está no código produzido, mas na abordagem. Enquanto o gcc é monolítico, o CLang foi construído como um conjunto de bibliotecas. Esse design modular permite grandes oportunidades de reutilização para IDE ou ferramentas de conclusão, por exemplo.

No momento, o código produzido pelo gcc 4.6 é geralmente um pouco mais rápido, mas o CLang está diminuindo a diferença.

Matthieu M.
fonte
5

O llvm-gcc-4.2 usa o front-end do GCC para analisar seu código e, em seguida, gera a saída compilada usando o LLVM.

O "llvm compiler 2.0" usa o front-end clang para analisar seu código e gera a saída compilada usando LLVM. "clang" é na verdade apenas o nome desse front-end, mas geralmente é usado casualmente como um nome para o compilador como um todo.

Stephen Canon
fonte