Clang - Clang

Clang
LLVM New Logo.png
Clang 12.0.1 version information screenshot.png
Clang 12.0.1
Autor (es) original (is) Chris Lattner
Desenvolvedor (s) Grupo de desenvolvedores LLVM
lançamento inicial 26 de setembro de 2007 ; 14 anos atras ( 26-09-2007 )
Versão estável
13.0.0 / 4 de outubro de 2021 ; 12 dias atrás ( 2021-10-04 )
Versão de visualização
13.0.0-rc2 / 27 de agosto de 2021 ; 50 dias atrás ( 2021-08-27 )
Repositório
Escrito em C ++
Sistema operacional Tipo Unix
Plataforma AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le
Modelo Front-end do compilador
Licença Licença Apache 2.0 com exceções LLVM
Local na rede Internet clang .llvm .org

Tinido / k l Æ ŋ / é uma extremidade dianteira compilador para os C , C ++ , Objective-C , e Objective-C ++ linguagens de programação , bem como o OpenMP , OpenCL , Renderscript , CUDA , e HIP quadros. Ele atua como um substituto imediato para a GNU Compiler Collection (GCC), suportando a maioria de seus sinalizadores de compilação e extensões de linguagem não oficiais. Inclui um analisador estático e várias ferramentas de análise de código.

O Clang opera em conjunto com o back-end do compilador LLVM e tem sido um subprojeto do LLVM 2.6 e posterior. Tal como acontece com o LLVM, é um software gratuito e de código aberto sob a licença de software Apache License 2.0 . Seus colaboradores incluem Apple , Microsoft , Google , ARM , Sony , Intel e AMD .

Clang 12, a versão principal mais recente do Clang em abril de 2021, tem suporte total para todos os padrões C ++ publicados até C ++ 17 , implementa a maioria dos recursos do C ++ 20 e adiciona suporte inicial para o próximo padrão C ++ 23 . Desde a v6.0.0, o Clang compila C ++ usando o dialeto GNU ++ 14 por padrão, que inclui recursos do padrão C ++ 14 e extensões GNU em conformidade.

Fundo

A partir de 2005, a Apple Inc. começou a usar extensivamente o LLVM em vários produtos comerciais, incluindo iOS SDK e Xcode 3.1. Um dos primeiros usos do LLVM foi um compilador de código OpenGL para OS X que converte chamadas OpenGL em chamadas mais fundamentais para unidades de processamento gráfico (GPU) que não oferecem suporte a determinados recursos. Isso permitiu que a Apple suportasse OpenGL em computadores que usam chipsets Intel GMA , aumentando o desempenho nessas máquinas.

O projeto LLVM originalmente pretendia usar o front end do GCC . O código-fonte do GCC, no entanto, é grande e um tanto complicado; como um desenvolvedor GCC de longa data colocou, referindo-se ao LLVM, "Tentar fazer o hipopótamo dançar não é realmente muito divertido". Além disso, o software da Apple usa Objective-C , que é uma baixa prioridade para desenvolvedores GCC. Como tal, o GCC não se integra perfeitamente ao ambiente de desenvolvimento integrado (IDE) da Apple . Finalmente, o contrato de licença do GCC, a GNU General Public License (GPL) versão 3 , requer que os desenvolvedores que distribuem extensões ou versões modificadas do GCC disponibilizem seu código-fonte , mas a licença de software permissiva do LLVM é desprovida de tal impedimento.

No final, a Apple optou por desenvolver o Clang, um novo front-end de compilador que suporta C, Objective-C e C ++. Em julho de 2007, o projeto recebeu a aprovação para se tornar open-source.

Projeto

O Clang funciona em conjunto com o LLVM. A combinação de Clang e LLVM fornece a maior parte do conjunto de ferramentas para substituir a pilha GCC . Um dos principais objetivos do Clang é fornecer uma arquitetura baseada em biblioteca, para que o compilador possa interoperar com outras ferramentas que interagem com o código-fonte, como ambientes de desenvolvimento integrado (IDE). Em contraste, o GCC funciona em um link de compilação - fluxo de trabalho de depuração ; integrá-lo a outras ferramentas nem sempre é fácil. Por exemplo, o GCC usa uma etapa chamada fold que é a chave para o processo geral de compilação, que tem o efeito colateral de traduzir a árvore de código em uma forma diferente do código-fonte original. Se um erro for encontrado durante ou após a etapa de dobra, pode ser difícil traduzir de volta para um local na fonte original. Além disso, os fornecedores que usam a pilha GCC dentro de IDEs devem usar ferramentas separadas para indexar o código, para fornecer recursos como destaque de sintaxe e conclusão de código inteligente .

O Clang retém mais informações durante o processo de compilação do que o GCC e preserva a forma geral do código original, tornando mais fácil mapear os erros de volta à fonte original. Os relatórios de erros do Clang são mais detalhados, específicos e legíveis por máquina, de modo que os IDEs podem indexar a saída do compilador. O design modular do compilador pode oferecer indexação de código-fonte, verificação de sintaxe e outros recursos normalmente associados a sistemas de desenvolvimento rápido de aplicativos . A árvore de análise também é mais adequada para suportar a refatoração de código automatizada , pois representa diretamente o código-fonte original.

O Clang compila apenas linguagens semelhantes a C, como C, C ++, Objective-C e Objective-C ++. Em muitos casos, o Clang pode substituir o GCC conforme necessário, sem outros efeitos na cadeia de ferramentas como um todo. Ele suporta a maioria das opções GCC comumente usadas. O projeto Flang da Nvidia e The Portland Group adiciona suporte para Fortran . No entanto, para outras linguagens, como Ada , o LLVM permanece dependente do GCC ou de outro front-end do compilador.

Desempenho e compatibilidade com GCC

Clang é compatível com GCC. Sua interface de linha de comando compartilha muitos sinalizadores e opções do GCC . Clang implementa muitas extensões de linguagem GNU e intrínsecos do compilador, alguns dos quais são puramente para compatibilidade. Por exemplo, apesar de implementos Clang intrínsecos atômicas que correspondem exatamente com C11 Atomics , ele também implementa do GCC __sync_*intrínsecos para compatibilidade com GCC e libstdc ++ . O Clang também mantém a compatibilidade da ABI com o código de objeto gerado pelo GCC . Na prática, o Clang é um substituto imediato para o GCC.

Os desenvolvedores do Clang têm como objetivo reduzir o consumo de memória e aumentar a velocidade de compilação em comparação com os compiladores concorrentes, como o GCC. Em outubro de 2007, eles relataram que o Clang compilou as bibliotecas Carbon mais de duas vezes mais rápido que o GCC, usando cerca de um sexto da memória e do espaço em disco do GCC. Em 2011, o Clang parece manter essa vantagem no desempenho do compilador. Em meados de 2014, o Clang ainda compila consistentemente mais rápido do que o GCC em um tempo de compilação misto e benchmark de desempenho do programa. No entanto, em 2019, o Clang é significativamente mais lento na compilação do kernel do Linux do que o GCC, embora permaneça um pouco mais rápido na compilação do LLVM.

Embora o Clang tenha sido historicamente mais rápido do que o GCC na compilação, a qualidade da saída ficou para trás. Em 2014, o desempenho dos programas compilados pelo Clang ficou atrás do desempenho do programa compilado pelo GCC, às vezes por grandes fatores (até 5,5x), replicando relatórios anteriores de desempenho mais lento. Ambos os compiladores evoluíram para aumentar seu desempenho desde então, com a redução da lacuna:

  • As comparações em novembro de 2016 entre o GCC 4.8.2 e o clang 3.4, em um grande conjunto de arquivos de teste, mostram que o GCC supera o clang em aproximadamente 17% no código-fonte bem otimizado. Os resultados dos testes são específicos do código, e o código-fonte C não otimizado pode reverter essas diferenças. Os dois compiladores, portanto, parecem amplamente comparáveis.
  • Comparações em 2019 no Intel Ice Lake mostraram que os programas gerados pelo Clang 10 alcançaram 96% do desempenho do GCC 10 em 41 benchmarks diferentes (enquanto ganhava 22 e perdia 19 deles).

Em 2021, foi feito um benchmark para comparar o desempenho e os tempos de compilação do LLVM 2.7 vs LLVM 11. A conclusão foi que o LLVM 11 tende a levar 2x mais tempo para compilar o código com otimizações e, como resultado, produz um código que é executado de 10 a 20% mais rápido (com discrepâncias ocasionais em qualquer direção), em comparação com o LLVM 2.7, que tem mais de 10 anos.

Histórico de status

Esta tabela apresenta apenas etapas e liberações significativas na história do Clang.

Encontro Destaques
11 de julho de 2007 Frontend Clang lançado sob licença de código aberto
25 de fevereiro de 2009 O Clang / LLVM pode compilar um kernel do FreeBSD funcional .
16 de março de 2009 Clang / LLVM pode compilar um kernel BSD do DragonFly .
23 de outubro de 2009 Clang 1.0 lançado, com LLVM 2.6 pela primeira vez.
Dezembro de 2009 Geração de código para qualidade de produção de alcance C e Objective-C. Suporte para C ++ e Objective-C ++ ainda incompleto. Clang C ++ pode analisar GCC 4.2 libstdc ++ e gerar código de trabalho para programas não triviais, e pode compilar a si mesmo.
2 de fevereiro de 2010 Clang self-hosting .
20 de maio de 2010 A versão mais recente do Clang construiu as bibliotecas Boost C ++ com sucesso e passou em quase todos os testes.
10 de junho de 2010 Clang / LLVM torna-se parte integrante do FreeBSD , mas o compilador padrão ainda é o GCC.
25 de outubro de 2010 Clang / LLVM pode compilar um kernel Linux modificado funcional .
Janeiro de 2011 Trabalho preliminar concluído para oferecer suporte ao padrão C ++ 0x de rascunho , com alguns dos novos recursos do rascunho suportados na versão de desenvolvimento do Clang.
10 de fevereiro de 2011 O Clang pode compilar uma máquina virtual Java HotSpot funcional .
19 de janeiro de 2012 O Clang se torna um componente opcional no sistema de construção de plataforma cruzada do NetBSD , mas o GCC ainda é o padrão.
29 de fevereiro de 2012 Clang 3.0 pode reconstruir 91,2% do arquivo Debian .
29 de fevereiro de 2012 Clang se torna o compilador padrão no MINIX 3
12 de maio de 2012 Clang / LLVM anunciou a substituição do GCC no FreeBSD .
5 de novembro de 2012 O Clang se torna o compilador padrão no FreeBSD 10.x no amd64 / i386.
18 de fevereiro de 2013 O Clang / LLVM pode compilar um kernel Linux do Android modificado funcional para o Nexus 7 .
19 de abril de 2013 O Clang é um recurso do C ++ 11 completo.
6 de novembro de 2013 O Clang é um recurso do C ++ 14 completo.
11 de setembro de 2014 O Clang 3.5 pode reconstruir 94,3% do arquivo Debian. A porcentagem de falhas caiu 1,2% por versão desde janeiro de 2013, principalmente devido ao aumento da compatibilidade com sinalizadores GCC.
Outubro 2016 Clang torna-se o compilador padrão para Android (e posteriormente apenas compilador compatível com Android NDK ).
13 de março de 2017 Clang 4.0.0 lançado
26 de julho de 2017 Clang se torna o compilador padrão no OpenBSD 6.2 em amd64 / i386.
7 de setembro de 2017 Clang 5.0.0 lançado
19 de janeiro de 2018 Clang se torna o compilador padrão no OpenBSD 6.3 on arm.
5 de março de 2018 Clang agora é usado para construir o Google Chrome para Windows.
8 de março de 2018 Clang 6.0.0 lançado
5 de setembro de 2018 O Clang agora é usado para construir o Firefox para Windows.
19 de setembro de 2018 Clang 7.0.0 lançado
20 de março de 2019 Clang 8.0.0 lançado
1 de julho de 2019 O Clang se torna o compilador padrão no OpenBSD 6.6 no mips64.
19 de setembro de 2019 Clang 9.0.0 lançado com suporte oficial de destino RISC-V .
29 de fevereiro de 2020 O Clang se torna o único compilador C no sistema base do FreeBSD , com a remoção do GCC .
24 de março de 2020 Clang 10.0.0 lançado
2 de abril de 2020 O Clang se torna o compilador padrão no OpenBSD 6.7 no powerpc.
12 de outubro de 2020 Clang 11.0.0 lançado
21 de dezembro de 2020 O Clang se torna o compilador padrão no OpenBSD 6.9 no mips64el.
14 de abril de 2021 Clang 12.0.0 lançado

Veja também

Referências

links externos