1. Compilador GCC
Prof. Dr. Almir Camolesi
15 de Setembro Ricardo L. Chikasawa
Disciplina: Compiladores
2. Introdução
Compilador
− Importância do Compilador e das Linguagens de programação
− Definição de um compilador
O Compilador GCC
− História
− O compilador e suas versões
− Exemplos de código fonte
− Estrutura e funcionamento
− Demo
15 de Setembro Compilador GCC
3. Compilador
Importância do Compilador
Os compiladores são ferramentas indispensáveis para programação. Pode-
se dizer que sem ele, seria quase impossível desenvolver programas muito
complexos.
As linguagens de programação de alto nível são projetadas para que
possam ser mais facilmente entendidas por programadores humanos. Elas
permitem ao programador expressar suas intenções mais facilmente, escrever
programas mais organizados e com mais rapidez do que se tivessem que
escrever os programas diretamente em código de máquina (linguagens de
baixo nível).
O compilador por sua vez, traduz um código fonte escrito numa linguagem
de alto nível (Ex: C/C++, Pascal, etc...), em um código alvo semanticamente
equivalente, escrito em código de máquina (Ex: Assembly). Esse código alvo
será enfim lido pela máquina e executado.
15 de Setembro Compilador GCC
5. GCC
História
O compilador GCC foi escrito por
Richard Stallman em 1987 para
servir de compilador para o Projeto
GNU.
GCC é uma abreviação do termo
GNU Compiler Collection. Ele leva
este nome pelo fato de que várias
versões do compilador estão
integradas, com suporte a
linguagens como C, C++, Objective-
C, Ada, Fortran, Java e Treelang.
15 de Setembro Compilador GCC
6. GCC
Principais características
Software Livre (GPL)
Desenvolvimento de processo Distribuido
Multiplataforma (Unix, Windows,Mac Os, Solaris)
Suportando a maioria das linguagens : C, C++, Java, Fortran 95,
Ada, Objective-C, Objective-C++, etc
Processadores suportados pelo GCC inclui: ARM, x86 e x86-64,
PowerPC, SPARC
15 de Setembro Compilador GCC
7. GCC
O compilador
É o compilador padrão do sistema operacional GNU/Linux e
também foi adotado por (ou portado para) vários outros sistemas
operacionais (inclusive S.O.s comerciais pagos), tais como HP-UX,
MS-Windows, MS-DOS, IBM OS2, IBM AIX, SUN OS, SUN Solaris etc,
além é claro do próprio GNU/Linux, onde este compilador é utilizado no
desenvolvimento do próprio sistema operacional e de todas as
ferramentas nele disponíveis (ou seja, é o compilador 'nativo' do
Linux).
Outro detalhe importante é que todas as distribuições Linux já vem
com um compilador GCC disponível, ou seja, se você tem um
computador com Linux instalado, você tem um compilador GCC pronto
para ser utilizado.
15 de Setembro Compilador GCC
8. Versões GCC
GCC 1 (1987)
− Inspirado no Compilador Pastel (Lawrence Livermore Labs)
− Compilava somente C
GCC 2 (1992)
− Adicionou C++
− Suporte a arquitetura RISC
EGCS (1997)
− Fork from GCC 2.x
− Novas Características: Java, novas otimizações
15 de Setembro Compilador GCC
9. Versões GCC
GCC 2.95 (1999)
− EGCS e GCC2 fudem o GCC
− Baseado no tipo de Análise
− Front end
− ISO C99
GCC 3 (2001)
− Integrabilidade libjava
− SSA, fase experimental formato de RTL
− Funções com árvores
GCC 4 (2005)
− Revisão da arquitetura interna (Árvore SSA)
− Fortran 95
− Vetorização Automática
15 de Setembro Compilador GCC
10. GCC
(Windows x Linux)
MinGW (Minimalist GNU for Windows)
Foi criado por Colin Peters em 1998. Ele usou uma versão muito inicial da suíte do
Cygwin para compilar a primeira versão do código do compilador MinGW.
É uma versão portada para Microsoft Windows do conjunto de ferramentas GNU (a
mesma instalada pelo ambiente Dev-C++ ou pelo CodeBlocks). Oferece um completo
conjunto de ferramentas Open Source de programação, apropriado para o
desenvolvimento de aplicativos nativos MS-Windows.
Code::Blocks é um ambiente integrado de desenvolvimento para as linguagens C e
C++. Ele usa a implementação MinGw do GCC (GNU Compiler Collection) como seu
compilador. Ele é "Free Software" (sob GNU General Public License).
Em 1999, a base de usuários do MinGW tornou-se grande o suficiente, para se
separar da “Cygwin mailing list”, e configurar ela própria uma lista de discussão
moderada pelo Earnie Boyd e Handerson Dale.
15 de Setembro Compilador GCC
11. GCC
(Windows x Linux)
O MinGW inclui:
• Uma porta do GNU Compiler Collection (GCC), incluindo compiladores C, C+
+, ADA e Fortran.
• GNU Binutils (coleção de ferramentas binárias) para Windows, ou seja,
vinculador, gerente de arquivo.
• MSYS, que é uma coleção de utilitários GNU, para permitir a construção de
aplicações e programas que dependem de instrumentos tradicionais do UNIX
para estar presente. Oferecido como uma alternativa para o cmd.exe da
Microsoft.
• Comunidade de apoio, ferramentas e bibliotecas (mingwPORTs).
• Um gráfico e um instalador de linha de comando para o Windows.
• Cross-compiladores para construir aplicações Windows em outras plataformas
(por exemplo, Linux).
15 de Setembro Compilador GCC
14. GCC
Funcionamento
Quando o GCC é invocado, ele
normalmente realiza quatro
etapas para gerar o executável:
pré-processamento, compilação,
montagem e ligação, sempre
nesta ordem.
Os primeiros três estágios
aplicam-se a um único arquivo
fonte, e encerram produzindo um
arquivo objeto.
15 de Setembro Compilador GCC
15. GCC
Fases da compilação
Pré-processamento: Esta etapa é responsável pela resolução de diretrizes
do pré-processador, como #define, #if, #include. Nesta fase, o GCC utiliza o
utilitário cpp.
Compilação: Nesta fase é gerada, a partir da fase anterior, o código
Assembly do programa.
Montagem: Produz o arquivo objeto .o, levando em conta a linguagem de
montagem dos arquivos de entrada. Nesta etapa, o GCC utiliza o utilitário
gas (GNU Assembler), ou o montador nativo as, caso ele não esteja
disponível.
Ligação: Nesta fase os arquivos .o e as bibliotecas são colocadas no
executável. O utilitário usado nessa fase é o ld (GNU Linker).
15 de Setembro Compilador GCC
17. GCC
Estrututra do Compilador
Front End: responsável por validar a estrutura sintática do programa de entrada,
emitir diagnósticos mais precisos sobre a conformidade linguagem, criando
estruturas de dados internas para tipos de dados e variáveis declaradas no
programa, as informações de depuração, como nomes de arquivo e números de
linha.
Middle End: responsável em analisar e transformar o programa. Todas as
transformações feitas no Middle End e no back-end geralmente têm dois objetivos:
• Tornar o código-objeto eficiente, rápido quanto possível (otimizações de desempenho).
• Tornar o código-objeto ter o mínimo de espaço possível (otimizações de espaço).
Back End: Nesta fase, o compilador precisa ter um conhecimento muito detalhado
sobre o hardware onde o programa será executado.
15 de Setembro Compilador GCC
18. GCC
Static Sigle Assignment (SSA)
Suporte para vetoriazação automática
Apresenta duas novas representações intermediárias: Generic e Gimple
SSA são convertida em RTL, usada pelo back-end para a geração de
código de destino
15 de Setembro Compilador GCC
19. GCC
Static Sigle Assignment (SSA)
GENERIC: é uma linguagem usada para definir a representação intermédiaria
do código usada por todas as fachadas do GCC.
GIMPLE: gerada a partir da forma GENERIC, permite muitas otimizações
globais independentes de linguagem e da arquitetura.
Estes dois processos intermediários de otimização na árvore tem sido
chamado de Middle-end e incluem:
• Propagação de constantes
• Eliminação de código morto
• Eliminação de redundância
• Alocação de registradores
15 de Setembro Compilador GCC
20. GCC
Otimização de Código
Otimizador de código, deixando o código mais rápido e compacto
Uma fase de recarga altera os registradores abstratos para
registradores reais, com base nos padrões de descrição dos conjuntos
de instruções da máquina alvo.
15 de Setembro Compilador GCC
21. GCC
Open MP
Programação Paralela
Suporta multi-plataforma
Memória compartilhada
15 de Setembro Compilador GCC
22. GCC - Demo
Programa:
#include <stdio.h> int main (void)
{
double test_loop(double d, unsigned n) double soma = 0.0;
{ unsigned i;
double x = 1.0; for (i = 1; i <= 100000000; i++)
unsigned j; {
for (j = 1; j <= n; j++) x *= d; soma += test_loop(i, i % 5);
return x; }
} printf ("s = %gn", soma);
return 0;
}
15 de Setembro Compilador GCC
23. GCC - Demo
Primeiro teste : Quarto teste:
gcc -Wall -O0 test.c -lm gcc -Wall -O3 test.c -lm
time ./a.out time ./a.out
Segundo teste:
Quinto teste:
gcc -Wall -O1 test.c -lm
time ./a.out gcc -Wall -O3 -funroll-loops test.c -lm
time ./a.out
Terceito teste:
gcc -Wall -O2 test.c -lm Sexto teste:
time ./a.out
gcc -fdump-tree-<generic> test.c
15 de Setembro Compilador GCC
24. Conclusão
Nós concluimos que o GCC é uma peça fundamental em quaisquer
desenvolvimento de software livre e de software fechado. Ele funciona
como ativador das arquiteturas e dos sistemas operacionais. Quando um
novo processador aparace, seu êxito depende de uma versão GCC que
irá fornecer suporte a ele.
Além de ser robusto, tem diversas ferramentas para sistema
distribuídos, onde hoje tudo é interligado a uma rede.
Por ser aberto, todos tem a oportunidade de evoluir e contrubuir
com o projeto da GNU.
15 de Setembro Compilador GCC
25. Bibliografia
• História do compilador : http://www.economicexpert.com/a/Compiler.html
• Tags de Otimização: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
• Pesquisa ranking dos linguagem mais utilizado:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
• Compilador IBM http://www.ibm.com/developerworks/br/library/l-gcc4/
• Wiki:
http://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/GNU_C_Compiler_Architecture_3_4
• GNU GCC http://gcc.gnu.org/wiki/HomePage
• Docs GNU http://gcc.gnu.org/onlinedocs/cpp/
• Otimização Gcc: http://www.clevitonmendes.blogspot.com/2008/06/opes-de-otimizao-do-
gcc.html
15 de Setembro Compilador GCC
26. Bibliografia
• UNIVERSIDADE DE LISBOA -FACULDADE DE CIÊNCIAS DEPARTAMENTO DE
INFORMÁTICA, Ferramenta de Análise de Código para Detecção de Vulnerabilidades Emanuel
Pedro Loureiro Teixeira MESTRADO EM ENGENHARIA INFORMÁTICA-Setembro de 2007
• An Introduction to GCC , Brian Gough Foreword by Richard M. Stallman
• Livro Introdução GCC online : http://www.network-theory.co.uk/gcc/intro/
• Códido fonte do gcc: http://www.network-theory.co.uk/gcc/intro/src/
• Slides do Diego Novillo , Google
15 de Setembro Compilador GCC