Вы находитесь на странице: 1из 51

Compiladores

Compiladores e fases da compilação


Prof. Sergio da Costa Ferreira
sergiodcf@anhanguera.com
Compiladores

Sumário
 Compilador
 Fases da compilação
 Análise Léxica
 Análise Sintática
 Análise Semântica
 Detecção de erros
 Geração de código intermediário
 Otimização
 Geração de código
Compiladores

Compilador
 É um programa que lê um programa
escrito em uma linguagem – a linguagem
fonte – e o traduz em um programa
equivalente em uma outra linguagem – a
linguagem alvo, relatando erros no
programa fonte.
 Resumindo, é um programa que
transforma um código-fonte em um
programa executável.
Compiladores

Compilador

Programa compilador Programa


fonte alvo

Mensagens
de erro
Compiladores

Demonstração
#include<stdio.h>
int main(void)
{
float B1, B2, MEDIA=0;
printf("Digite a media do 1o. bimestre: ");
scanf("%f",&B1);
printf("Digite a media do 2o. bimestre: ");
scanf("%f",&B2);
MEDIA=(B1*4+B2*6)/10;
printf("A media final do aluno e: %0.2f", MEDIA);
return(0);
}
Compiladores

O modelo de compilação de
análise e síntese
 A compilação é dividida em duas partes
 Análise
 Divide o programa-fonte (escrito em uma
linguagem de programação) nas diversas partes
que o constituem e cria uma representação
intermediária do mesmo.
 Síntese
 Constrói o programa-alvo (executável para uma
máquina alvo) a partir da representação
intermediária criada na fase de análise.
Compiladores

O modelo de compilação de
análise e síntese
 As fases da Análise
 Análise Léxica
 Análise Sintática Criam uma representação
intermediária do código
 Análise Semântica

 As fases da Síntese
 Geração de código intermediário
 Otimização de código Geram o código a partir
de uma representação
 Geração de código alvo Intermediária.
Compiladores
Compiladores

Fases da compilação

 Gerenciamento da tabela de símbolos


 Detecção de erros e geração de relatórios
 Análise
 Léxica
 Sintática
 Semântica
 Geração de código intermediário
 Otimização de código
 Geração de código
Compiladores
Compiladores

Tabela de símbolos

 Sua função é registrar os identificadores usados


no programa-fonte e identificar os seus
atributos, tais como, nome, endereço tipo e etc.
 Uma tabela de símbolos é uma estrutura de
dados contendo um registro para cada
identificador.
 Essa estrutura de dados deve permitir encontrar
rapidamente cada registro e armazenar e
recuperar dados do mesmo.
Compiladores

Tabela de símbolos

 Nela são armazenados os tokens.


 Seu preenchimento começa na análise léxica,
prossegue pela análise sintática e seu conteúdo
é utilizado pelas fases seguintes.
Compiladores

Tabela de símbolos
Compiladores

Detecção de erros

 Cada fase da análise pode encontrar erros,


porém deve prosseguir até o final para relatá-
los, permitindo a depuração do código-fonte.
 Na análise léxica os erros, normalmente, são
devidos a ocorrência de sequência de
caracteres que não formam qualquer token,
segundo a linguagem de programação utilizada.
 Os erros na fase de análise sintática,
geralmente ocorrem porque o fluxo hierárquico
de tokens viola regras estruturais da LP.
Compiladores

Detecção de erros

 Na análise semântica, busca-se detectar erros


na estrutura sintática das operações.
 Ex.: SOMA = SOMA + 35
 O identificador SOMA foi declarado? Caso negativo,
erro semântico.
 O identificador SOMA é uma variável? Caso negativo,
erro semântico.
 Qual o tipo da variável SOMA? o valor atribuído no
lado direito do comando de atribuição é compatível?
Compiladores

Detecção de erros

 Demonstração de erros no compilador


#include<stdio.h> erro léxico
int main()
{
flaot nota1, nota2, media=0;
printf("Digite a 1a. nota: "); erro sintático
scanf("%f",&nota1);
printf("\nDigite a 2a. nota: "); erro semântico?
scanf(%f,&nota2);
media=(nota1*4+nota2*6)/10;
printf("\nA media parcial do aluno e: %0.2c", media);
}
Compiladores

Análise Léxica

 Também conhecida como análise linear ou


scanning.
 Tem a função de identificar sequências de
caracteres com um significado, de acordo
com o dicionário da linguagem de
programação.
 Essas sequências de caracteres são
palavras ou símbolos, que são
reconhecidos e identificados.
Compiladores

Análise Léxica

 Tais palavras e símbolos são


denominados tokens.
 Cada símbolo do código-fonte é
analisado, sendo que cada um deles é um
token.
 Os tokens são escritos na tabela de
símbolos.
 A sequência de caracter que formam o
token é chamada de LEXEMA.
Compiladores

Análise Léxica

 Durante a análise léxica, os tokens são


classificados como palavras reservadas,
identificadores, símbolos especiais,
constantes de tipos básicos (inteiro real,
literal, etc.), entre outras categorias.
Compiladores

Análise Léxica

 Exemplo:
 montante = deposito_inicial + taxa_de_juros * 60
 Tokens
 Identificador: montante LEXEMA
 Símbolo de atribuição: =

 Identificador: deposito_inicial

 Sinal de adição: +

 Identificador: taxa_de_juros

 Sinal de multiplicação: *

 Número: 60
Compiladores

Análise Léxica

 Normalmente nesta fase são eliminados


espaços em branco entre os caracteres,
bem como comentários e etc.
 A análise léxica prepara o programa para
a fase de compilação seguinte, ou seja, a
análise sintática.
Compiladores

Análise Léxica
Compiladores

Análise Sintática

 Também chamada de análise hierárquica,


análise gramatical ou parsing.
 É o processo de análise de uma sequência de
entrada, para determinar sua estrutura
gramatical.
 A análise sintática transforma um texto na
entrada em uma estrutura de dados, em geral
uma árvore, para o processamento seguinte,
identificando a hierarquia implícita nesta
entrada.
Compiladores

Análise Sintática

 Os tokens são lidos na tabela de símbolos e são


agrupados hierarquicamente em coleções
aninhadas com significado coletivo, chamadas
árvores sintáticas.
+
 1+2*3 parsing
1 *

2 3
Compiladores

Análise Sintática
 montante := deposito_inicial + taxa_de_juros * 60
Compiladores

Análise Sintática
Compiladores

Análise Semântica
 É feita uma verificação para assegurar que os
componentes de um programa se combinam de
forma significativa.
 É procedida uma verificação de erros
semânticos no programa-fonte, ou seja, de
significado.
 Nesta fase é feita a verificação de tipo, ou seja,
é verificado se cada operador recebe os
operandos que são permitidos pela
especificação da linguagem fonte.
Compiladores

Análise Semântica
 A árvore sintática é utilizada para identificar os
operadores e operandos das expressões e
enunciados.
 Captura as informações de tipo para a fase
seguinte, que é a geração do código
intermediário.
Compiladores

Análise Semântica
 montante := deposito_inicial + taxa_de_juros * 60

float! montante +

float! deposito_inicia *
l

float! taxa_de_juro 6 inteiro?


s 0
Compiladores

Análise Semântica
 montante := deposito_inicial + taxa_de_juros * 60
Compiladores

Análise Semântica
Compiladores

Geração de Código
Intermediário
 O código intermediário nada mais é que
uma representação intermediária do
programa fonte.
 Uma representação intermediária é um
código para uma máquina abstrata
(arquitetura desconhecida).
 É um resumo da fase de análise, pronto
para virar um programa-alvo.
Compiladores

Geração de Código
Intermediário
 O código intermediário deve possuir duas
propriedades importantes:
 ser fácil de produzir
 Ser fácil de traduzir no programa objeto.

 Por exemplo, pode ser usada como forma


intermediária o código de três endereços,
que consiste em uma sequência de
instruções, cada uma possuindo no
máximo três operandos.
Compiladores

Geração de Código
Intermediário
Compiladores

Otimização
 Nesta fase tenta-se melhorar o código
intermediário, para resultar em menos
operações e um código de máquina mais
rápido em tempo de execução.
 Por exemplo:
 Um algoritmo para geração do código
intermediário pode derar uma instrução para
cada operador na árvore sintática,
independente de existir uma maneira mais
otimizada de realizar operação.
Compiladores

Otimização
Compiladores

Geração de código
 A fase final do compilador é a geração do código
para o programa objeto, consistindo
normalmente de código de máquina ou código
de montagem.
 As alocações de memória são selecionadas
para cada uma das variáveis.
 Cada uma das instruções intermediárias são
traduzidas para instruções de máquina que
realizar a mesma tarefa.
Compiladores

Geração de código

código
em
assembly
Compiladores

Processo
completo
Compiladores

Programas relacionados
 Editor
 Oferece uma interface para desenvolver o
programa, auxiliando o programador a
produzir o código-fonte.
 Pré-processador
 Recebe um texto e efetua conversões, que
podem incluir substituição de macros,
inclusão de arquivos, extensões da LP e etc.
Compiladores

Programas relacionados
 Montador (Assembler)
 Faz a tradução do código assembly em
linguagem de máquina, traduzindo cada
instrução do programa para a sequência de
bits que codifica a instrução de máquina.
 Como cada processador tem sua própria
linguagem, montadores são específicos para
processadores.
 Gera o arquivo objeto.
Compiladores

Programas relacionados
 Montador (Assembler)

assembly máquina
Compiladores

Programas relacionados
 Editor de ligação (Linkeditor)
 Resolve as referências que tenham sido
feitas, no código objeto, a dados e rotinas em
outros programas.
 Permite criar um único programa a partir de
diversos arquivos de código de máquina.
 Esses arquivos podem ter sido resultado de
diversas compilações ou ser arquivos de
bibliotecas de rotinas.
Compiladores

Programas relacionados
 Editor de ligação (Linkeditor)
 Os arquivos recebem links que se referem a
uma localização em outro arquivo.
 O resultado da execução do Linkeditor é o
código final pronto para ser executado pelo
computador, chamado módulo de carga ou
código executável.
 Carregadores
 Transferem o programa executável para a
memória principal e dá início à sua execução.
Compiladores

Programas relacionados
 Carregadores

Código de máquina relocável Código de máquina irrelocável


editor Compiladores
Compiladores

Agrupamento de fases
 Interface de Vanguarda (front-end)
Composto pelas fases que dependem primariamente da
linguagem fonte e são amplamente independentes da
máquina alvo.
 Análise Léxica
 Análise Sintática
 Análise Semântica
 Criação da tabela de símbolos
 Geração do código intermediário
 Primeira otimização do código
 Tratamento de erro associado a essas fases.
Compiladores

Agrupamento de fases
 Interface de Retaguarda (back-end)
Inclui a parte do compilador que depende da máquina alvo
e sim do código intermediário, mas geralmente não
depende da linguagem fonte.
 Otimização do código
 Geração do código
 Tratamento de erro associado a essas fases
 Manipulação da tabela de símbolos.
Compiladores
Compiladores

Agrupamento de fases
 Mantendo-se a mesma interface de vanguarda e
alterando-se somente a interface de retaguarda,
pode-se produzir compiladores, para a mesma
linguagem fonte, em máquinas alvos diferentes.
Compiladores

Bibliografia
 AHO, A.; ULLMANN, J.; REVI, S.. Compiladores:
princípios, técnicas e ferramentas. 3ª ed. Rio de
Janeiro: LTC – Livros Técnicos e Científicos,
2006.