gcc

26
15 de Setembro Ricardo L. Chikasawa Prof. Dr. Almir Camolesi Disciplina: Compiladores Compilador GCC Compilador GCC

Upload: ricardo-chikasawa

Post on 12-Jun-2015

2.447 views

Category:

Technology


2 download

DESCRIPTION

Trabalho sobre GCC

TRANSCRIPT

Page 1: Gcc

15 de Setembro Ricardo L. ChikasawaProf. Dr. Almir CamolesiDisciplina: Compiladores

Compilador GCCCompilador GCC

Page 2: Gcc

15 de Setembro Compilador GCC

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

Page 3: Gcc

15 de Setembro Compilador GCC

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.

Page 4: Gcc

15 de Setembro Compilador GCC

Richard Stallman

Page 5: Gcc

15 de Setembro Compilador GCC

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.

Page 6: Gcc

15 de Setembro Compilador GCC

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

Page 7: Gcc

15 de Setembro Compilador GCC

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.

Page 8: Gcc

15 de Setembro Compilador GCC

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

Page 9: Gcc

15 de Setembro Compilador GCC

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

Page 10: Gcc

15 de Setembro Compilador GCC

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.

Page 11: Gcc

15 de Setembro Compilador GCC

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

GCC(Windows x Linux)

Page 12: Gcc

15 de Setembro Compilador GCC

Código fonte

Page 13: Gcc

15 de Setembro Compilador GCC

Código fonte

Page 14: Gcc

15 de Setembro Compilador GCC

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.

Page 15: Gcc

15 de Setembro Compilador GCC

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

Page 16: Gcc

15 de Setembro Compilador GCC

GCC

Estrutura do compilador

Page 17: Gcc

15 de Setembro Compilador GCC

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.

Page 18: Gcc

15 de Setembro Compilador 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

GCC

Page 19: Gcc

15 de Setembro Compilador 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

GCC

Page 20: Gcc

15 de Setembro Compilador GCC

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.

Page 21: Gcc

15 de Setembro Compilador GCC

GCC

Open MP Programação Paralela

Suporta multi-plataforma

Memória compartilhada

Page 22: Gcc

15 de Setembro Compilador GCC

GCC - Demo

Programa:

#include <stdio.h>

double test_loop(double d, unsigned n)

{

double x = 1.0;

unsigned j;

for (j = 1; j <= n; j++) x *= d;

return x;

}

int main (void)

{

double soma = 0.0;

unsigned i;

for (i = 1; i <= 100000000; i++)

{

soma += test_loop(i, i % 5);

}

printf ("s = %g\n", soma);

return 0;

}

Page 23: Gcc

15 de Setembro Compilador GCC

GCC - Demo

Primeiro teste :

gcc -Wall -O0 test.c -lm

time ./a.out

Segundo teste:

gcc -Wall -O1 test.c -lm

time ./a.out

Terceito teste:

gcc -Wall -O2 test.c -lm

time ./a.out

Quarto teste:

gcc -Wall -O3 test.c -lm

time ./a.out

Quinto teste:

gcc -Wall -O3 -funroll-loops test.c -lm

time ./a.out

Sexto teste:

gcc -fdump-tree-<generic> test.c

Page 24: Gcc

15 de Setembro Compilador GCC

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.

Page 25: Gcc

15 de Setembro Compilador GCC

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

Page 26: Gcc

15 de Setembro Compilador GCC

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