Diapositivos das aulas teóricas: Introdução

Propaganda
Compiladores
INTRODUÇÃO
www.pedrofreire.com
Este documento tem alguns direitos reservados:
Atribuição-Uso Não-Comercial-Não a Obras Derivadas 2.5 Portugal
http://creativecommons.org/licenses/by-nc-nd/2.5/pt/
Isto significa que podes usá-lo para fins de estudo.
Para outras utilizações, leia a licença completa.
Crédito ao autor deve incluir o nome (“Pedro Freire”) e referência a www.pedrofreire.com.
www.pedrofreire.com
2
INTRODUÇÃO
www.pedrofreire.com
3
C / C++
Java
C#
PHP
Perl
O que são
Um compilador prepara um ficheiro
de texto com código-fonte para
execução.
O resultado final pode ser outro
ficheiro, preparado para execução
direta pelo processador (código
máquina) ou preparado para
execução por uma máquina virtual
dedicada (byte code ou CIL), ou
uma representação em memória
para interpretação.
Compilador
Código máquina
Byte code
CIL
Representação em
memória
www.pedrofreire.com
4
Exemplos de uso
•  Compiladores
–  C / C++ / Objective C
–  Pascal
•  Intérpretes/Interpretadores
– 
– 
– 
– 
– 
JavaScript
PHP
XML / HTML / CSS
Rich Text Format (RTF)
Postscript
•  Tradutores de linguagens
Java é um exemplo de uma
linguagem com um compilador que
não gera código executável. Gera
“Java Byte Codes” que são depois
interpretados por outra aplicação.
–  Java
–  C#
•  Extractores de informação textual
www.pedrofreire.com
5
Analisador léxico
Tokens
Etapas
de compilação.
Analisador sintático
Árvore sintática
Analisador semântico
Árvore sintática
Gerador de código intermédio
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
6
Pré-processador
Etapas
Tokens
Analisador sintático
Árvore sintática
de compilação.
O pré-processador transforma um
ou mais ficheiros de código-fonte
noutro ficheiro de código-fonte. É
usado em linguagens como C para
implementar #include, #define
e outras diretivas semelhantes.
Analisador léxico
Compilador
Analisador semântico
Árvore sintática
Gerador de código intermédio
Representação intermédia
O linker liga um ou mais ficheiros
de código máquina (ficheiros
objecto, um por cada ficheiro de
código-fonte) num último ficheiro
executável pronto para execução.
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Assembler
Optimizador de código
Linker
www.pedrofreire.com
Código máquina
7
Analisador léxico
Tokens
Etapas:
Analisador léxico
Analisador sintático
Árvore sintática
Também conhecido como scanner.
Lê a sequência de caracteres do
ficheiro fonte original e agrupa-os
em sequências significativas
chamadas lexemas.
Analisador semântico
Árvore sintática
Gerador de código intermédio
Constrói tokens para cada lexema
que são um par com o nome do
token e um atributo que o ajuda a
especificar.
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
8
Analisador léxico
Tokens
Etapas:
Analisador sintático
Analisador sintático
Árvore sintática
Também conhecido como parser.
Lê a sequência de tokens
produzida pela etapa anterior e
produz uma árvore que representa
a sua estrutura gramatical.
Analisador semântico
Árvore sintática
Gerador de código intermédio
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
9
Analisador léxico
Tokens
Etapas:
Analisador semântico
Analisador sintático
Árvore sintática
Lê a árvore gerada pela etapa
anterior e verifica-a para
consistência semântica de acordo
com a definição da linguagem (e.g.:
verificação de consistência e
conversão de tipos de dados).
Analisador semântico
Árvore sintática
Gerador de código intermédio
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
10
Analisador léxico
Tokens
Etapas:
Gerador de código intermédio
Analisador sintático
Árvore sintática
Lê a árvore gerada pela etapa
anterior e transforma-a numa
sequência de instruções de uma
máquina hipotética.
Analisador semântico
Árvore sintática
Esta máquina hipotética permite
que as etapas seguintes sejam as
mesmas para todas as versões do
compilador para qualquer tipo de
plataforma.
Gerador de código intermédio
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
11
Analisador léxico
Tokens
Etapas:
Optimizador de código intermédio
Analisador sintático
Árvore sintática
Lê a sequência de instruções
gerada pela etapa anterior e
optimiza-a de acordo com algum
objectivo (código mais rápido ou
mais pequeno).
Analisador semântico
Árvore sintática
Algumas das optimizações triviais
executadas nesta fase são a
remoção de variáveis temporárias
desnecessárias geradas pela etapa
anterior e cálculo antecipado de
expressões e outras operações
constantes.
Gerador de código intermédio
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
12
Analisador léxico
Tokens
Etapas:
Gerador de código
Analisador sintático
Árvore sintática
Lê a sequência de instruções
gerada pela etapa anterior e
transforma-a numa sequência de
instruções da plataforma destino
desejada.
Analisador semântico
Árvore sintática
Gerador de código intermédio
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
13
Analisador léxico
Tokens
Etapas:
Optimizador de código
Analisador sintático
Árvore sintática
Lê a sequência de instruções
gerada pela etapa anterior e
optimiza-a de acordo com algum
objectivo (código mais rápido ou
mais pequeno).
Analisador semântico
Árvore sintática
Algumas das optimizações triviais
executadas nesta fase são a
optimização do uso de registos do
processador e a reordenação de
instruções para aproveitar
oportunidades de paralelização
(e.g.: pipelining).
Gerador de código intermédio
Representação intermédia
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
14
lex / flex
Ferramentas
de geração de compiladores.
yacc / bison
O lex (ou a sua versão opensource, flex) gera scanners.
Analisador léxico
Tokens
Analisador sintático
Árvore sintática
Analisador semântico
Árvore sintática
O yacc (ou a sua versão opensource, bison) gera parsers.
Gerador de código intermédio
Representação intermédia
São ferramentas com décadas de
uso, mas hoje em dia temos outras
que nos geram em simultâneo um
scanner e um parser (e.g.: ANTLR).
Optimizador de código intermédio
Representação intermédia
Gerador de código
Código máquina
Optimizador de código
Código máquina
www.pedrofreire.com
15
Hiperligações úteis
BIBLIOGRAFIA
www.pedrofreire.com
16
•  Compilers: Principles, Techniques and Tools – 2nd edition
(2ª edição)
–  Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman
–  Addison Wesley
–  http://dragonbook.stanford.edu
•  Compiler Construction Toolkit
–  http://hackingoff.com/compilers/
•  GNU Flex
–  http://www.gnu.org/software/flex/
•  GNU Bison
–  http://www.gnu.org/software/bison/
•  ANTLR
–  http://www.antlr.org
www.pedrofreire.com
17
Download