O GCC é o compilador mais utilizado e confiável no mundo. Diversos dos softwares mais utilizados do mundo foram(e são) compilados por ele.
No entanto, os desenvolvedores são movidos à novidades e de alguma maneira à especulações . E muitos já ouviram do LLVM e na maioria das vezes, obtiveram boas informações. Desta forma, muitos tem passado à utilizá-lo, mas ainda tem receio sobre 3 quesitos essenciais:
Vamos ver informações e testes com análises(benchmarks) nesse artigo e chegaremos a uma conclusão.
Você pode trocar o comando
gcc
por somentecc
que é um link simbólico para ele:
Você pode trocar o comando
g++
por somentec++
que é um link simbólico para ele:
Clang é um front-end de um compilador para as linguagens C, C++, Objective-C e Objective-C++ que utiliza o LLVM como back-end.
O GNU Compiler Collection (chamado usualmente por GCC) é um conjunto de compiladores de linguagens de programação produzido pelo projeto GNU para construir um sistema operativo semelhante ao Unix livre. Faz parte do sistema operativo GNU e FSF, sendo uma das ferramentas essenciais para manter o software livre, pois permite compilar o código-fonte em binários executáveis para as várias plataformas informáticas mais comuns. É distribuído pela Free Software Foundation (FSF) sob os termos da GNU GPL, disponível para sistemas operativos UNIX e Linux e certos sistemas operativos derivados tais como o Mac OS X.
O GCC foi escrito principalmente em C.
LLVM (anteriormente Low Level Virtual Machine) é uma infraestrutura de compilador desenvolvida para otimizar em tempos de compilação, ligação e execução de programas escritos em linguagens de programação variadas. Implementada originalmente para C e C++, sua arquitetura permitiu a expansão para outras linguagens posteriormente, incluindo Objective-C, Fortran, Ada, Haskell, bytecode Java, Python, Ruby, ActionScript, GLSL, Julia, Kotlin entre outras.
O LLVM foi escrito em C++.
O compilador GCC foi escrito por Richard Stallman em 1987 para servir de compilador para o Projeto GNU. Em 1997, um grupo de desenvolvedores descontentes com o ritmo lento e a natureza fechada do desenvolvimento oficial do compilador GCC, formou-se o projeto EGCS, que juntou várias bifurcações experimentais num único projeto bifurcado do GCC. O desenvolvimento do EGCS, ao provar-se suficientemente mais vital que o GCC, foi finalmente “abençoado” como a versão oficial do GCC em Abril de 1999. O projeto GCC é agora mantido por um grupo variado de programadores de todo o mundo e até à data tem sido adaptado a mais tipos de processadores e sistemas operacionais que qualquer outro compilador.
O projeto LLVM começou em 2000 na Universidade de Illinois em Urbana – Champaign , sob a direção de Vikram Adve e Chris Lattner .Em 2005, a Apple Inc. contratou Lattner e formou uma equipe para trabalhar no sistema LLVM para vários usos nos sistemas de desenvolvimento da Apple.
Ada (GCC for Ada ou GNAT), C, C++ (GCC for C++ ou G++), Fortran (GCC for Fortran ou GFortran), Java (GCC for Java ou GCJ), Objective-C e Pascal.
Ada , C , C ++ , D , Delphi , Fortran , Haskell , Julia , Objective-C , Rust e Swift usando vários front-ends , alguns derivados das versões 4.0.1 e 4.2 da GNU Compiler Collection (GCC ).
NASA, Intel, MIT(Massachusetts Institute of Technology), AMD, Linux, IBM, Dell, Red Hat, GNOME, KDE e entre outros. O número de Universidades, Instituições, Empresas que usam é muito extenso e não há um local que consegue reunir todos.
Apple, Adobe, Ageia Technologies, Google, Intel, NVIDIA, Sony, Universidade da Califórnia, Stanford, Universidade de Nova Iorque, Ericsson e entre muitas outras.
Alpha, ARM, AVR, Blackfin, Epiphany (GCC 4.8), H8/300, HC12, IA-32 (x86), IA-64 (Intel Itanium), MIPS, Motorola 68000, PA-RISC, PDP-11, PowerPC, R8C / M16C / M32C, SPARC, SPU, SuperH, System/390 / zSeries, VAX, x86-64, 68HC11, A29K, CR16, C6x, D30V, DSP16xx, ETRAX CRIS, FR-30, FR-V, Intel i960, IP2000, M32R, MCORE, MIL-STD-1750A, MMIX, MN10200, MN10300, Motorola 88000, NS32K, IBM ROMP, RL78, Stormy16, V850, Xtensa, Cortus APS3, ARC, AVR32, C166 and C167, D10V, EISC, eSi-RISC, Hexagon, LatticeMico32, LatticeMico8, MeP, MicroBlaze, Motorola 6809, MSP430, NEC SX architecture, Nios II and Nios, OpenRISC, PDP-10, PIC24/dsPIC, PIC32, Propeller, RISC-V, Saturn (HP48XGCC), System/370, TIGCC (m68k variant), TriCore, Z8000 e ZPU.
X86, X86-64, PowerPC, PowerPC-64, ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ, WebAssembly e XCore.
Esses testes e análises foram feitos por Mike Kinghan um Engenheiro de Software da Oxford.
Os testes foram realizados em diferentes arquiteturas e também em diferentes quantidades de núcleos do processador . Com as versões GCC 4.7.2 e o Clang 3.2 . Pode se notar que o Clang(LLVM) leva a melhor em maiores quantidades de núcleos e o GCC para quantidades menores e/ou híbridas .
Os números estão representados em microssegundos, ex.: 0.000231 secs .
Compilador | -O2 | -O3 | O2/O3 |
---|---|---|---|
GCC-4.7.2 | 231 | 237 | 0.97 |
Clang-3.2 | 234 | 186 | 1.25 |
Palavras do Mike Kinghan
Comparei o desempenho do equipamento de teste entre o GCC 4.7.2 e o Clang 3.2, todos iguais, exceto os pré-processadores. No Clang 3.2, não era mais necessária nenhuma diferenciação de pré-processador entre os intervalos de código que o GCC compilaria e as alternativas do Clang. Criei na mesma biblioteca C++ (GCC) em cada caso e executei todas as comparações consecutivamente na mesma sessão do terminal.
O nível de otimização padrão para minha versão é -O2. Também testei com êxito compilações em -O3. Testei cada configuração três vezes consecutivas e calculei a média dos três resultados, com os seguintes resultados. O número em uma célula de dados é o número médio de microssegundos consumidos pelo executável coan para processar cada um dos ~70K arquivos de entrada (leitura, análise e saída e diagnóstico de gravação).
Eu sei que não dá pra chegar muito longe com essa comparação. Existem diversos quesitos que estão longe do nosso entendimento pelo fato de ser técnico demais.
Mas tentei resumir tudo que pesquisei, documentei para relatar aqui de forma mais simples possível. Eu particularmente uso os dois (para meus programas pequenos) e acho os dois excelentes. Inclusive eu compilei o LLVM com o GCC!
Eu estava pensando em alterar as variáveis do make.conf
do meu Gentoo para o [LLVM/Clang] , mas daí eu pensei, para quê mudar algo que está dando certo ? No entanto, acho muito legal essa iniciativa de um substituto pro GCC, aliás, quanto mais alternativas houverem, melhor pra gente.
Espero que vocês tenham gostado dessa análise. Resumindo, as escolhas ficam por conta de cada um, o que na maioria das vezes são feitas por motivos extra-software :) !!!
Abraços!
gcc llvm clang cpp linguagemc compiladores