GCC vs LLVM: Qual é o melhor compilador ?

Como compilar em cada um, benchmarks, quem usa e outros.


GCC vs LLVM

Introdução

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:

  • Segurança;
  • Velocidade;
  • e Confiabilidade.

Vamos ver informações e testes com análises(benchmarks) nesse artigo e chegaremos a uma conclusão.


Compilando com o GCC:

Linguagem C:

  • Único arquivo:
gcc main.c -o binary
  • Múltiplos arquivos:
gcc main.c outro.c -o binary

Você pode trocar o comando gcc por somente cc que é um link simbólico para ele:

which cc
# /usr/bin/cc
ls -l /usr/bin/cc
## lrwxrwxrwx 1 root root 42 nov 23 19:41 /usr/bin/cc -> /usr/x86_64-pc-linux-gnu/gcc-bin/9.2.0/gcc

Linguagem C++:

  • Único arquivo:
g++ main.cpp -o binary
  • Múltiplos arquivos:
g++ main.cpp outro.cpp -o binary

Você pode trocar o comando g++ por somente c++ que é um link simbólico para ele:

ls -l $(which c++)
lrwxrwxrwx 1 root root 42 nov 23 19:41 /usr/bin/c++ -> /usr/x86_64-pc-linux-gnu/gcc-bin/9.2.0/c++

Compilando com LLVM:

Clang é um front-end de um compilador para as linguagens C, C++, Objective-C e Objective-C++ que utiliza o LLVM como back-end.

Linguagem C:

  • Único arquivo:
clang main.c -o binary
  • Múltiplos arquivos:
clang main.c outro.c -o binary

Linguagem C++:

  • Único arquivo:
clang++ main.cpp -o binary
  • Múltiplos arquivos:
clang++ main.cpp outro.cpp -o binary

Conceito do GCC:

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.

Conceito do LLVM:

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++.


História do GCC:

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.

História do LLVM:

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.


Linguagens suportadas pelo GCC:

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.

Linguagens suportadas pelo LLVM:

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 ).


Quem usa o 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.

Quem usa o LLVM:

Apple, Adobe, Ageia Technologies, Google, Intel, NVIDIA, Sony, Universidade da Califórnia, Stanford, Universidade de Nova Iorque, Ericsson e entre muitas outras.


Arquiteturas suportadas pelo GCC:

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.

Arquiteturas suportadas pelo LLVM:

X86, X86-64, PowerPC, PowerPC-64, ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ, WebAssembly e XCore.


Testes de desempenho por um especialista em Compiladores

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).


Conclusã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!

Referências


gcc llvm clang cpp linguagemc compiladores


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!