INE5317 - LINGUAGENS FORMAIS E COMPILADORES

Propaganda
INE5421 – LINGUAGENS FORMAIS E
COMPILADORES
 PLANO DE ENSINO
 Objetivo geral
 Conhecer a teoria das linguagens formais visando sua
aplicação na especificação de linguagens de programação
e na construção de compiladores.
 Objetivos específicos
 Adquirir uma visão geral do processo de compilação sob o
ponto de vista de implementação.
 Correlacionar a Teoria das Linguagens Formais com a
Teoria da Computação e esta com a Ciência da
Computação.
 Adquirir sólidas noções de linguagens formais e suas
representações.
 Ser capaz de especificar linguagens através de autômatos e
gramáticas.
 Conhecer e saber usar as técnicas formais de análise
sintática.
 Programa
 Avaliação
 Bibliografia
1
Capítulo I – Introdução
I.1 - Introducão a Compiladores
I.1.1 - Definições preliminares
Tradutor
 É um programa que traduz um programa fonte escrito em
uma linguagem qualquer (denominada linguagem fonte)
para um programa objeto equivalente escrito em outra
linguagem (denominada linguagem objeto)
Pf / Lf
Tradutor
Po / Lo
Compilador
 É um Tradutor em que a linguagem fonte é uma linguagem
de alto nível e a linguagem objeto é uma linguagem de
baixo nível (assembly ou máquina)
Po / La
Pf / Lan
Compilador
Po / Lm
Interpretador
 É um programa que interpreta diretamente as instruções do
programa fonte, gerando o resultado.
Pf / Lq
Interpretador
Resultados
2
Tradutor / Interpretador
 Esquema híbrido para implementação de linguagens de
programação
Pf / Lan
Tradutor
Po / Lint
Interpretador
Resultados
Montador
 É um Tradutor em que o programa fonte está escrito em
linguagem assembly e o programa objeto resultante está em
linguagem de máquina
Pf / La
Montador
Po / Lm
Pré-processador
 É um Tradutor em que tanto o programa fonte quanto o
programa objeto estão escritos em linguagens de alto nível
Pf/Lan1
Pré-Proc.
Po/Lan2
Cross - Compiler
 Compilador que gera código para uma máquina diferente da
utilizada na compilação.
3
I.1.2 - Estrutura geral de um Compilador
P. Fonte
Compilador
Análise
Análise Léxica
Análise Sintática
Análise Semântica
Síntese
Geração de Código Intermediário
Otimização de Código
Geração de Código
P. Objeto
4
I.1.3 - Formas de Implementação de
Compiladores
Fase - Procedimento que realiza uma função bem
definida no processo de compilação.
Passo - Passagem completa do programa compilador
sobre o programa fonte que está sendo compilado.
Formas de Implementação
 Compiladores de 1 e de vários passos
 Depende da quantidade de vezes que o P.F. é
analisado até que o código objeto seja gerado
 Diferentes composições (agrupamento de fases)
 Exemplos :
 Critérios para def. do num. de passos




Memória disponível
Tempo de Compilação
Tempo de execução
Características da Linguagem
 Referências futuras





Características das Aplicações
Importância da Otimização
Tamanho / Experiência da Equipe
Disponibilidade de Ferramentas de Apoio
Prazo para desenvolvimento
 Vantagens X Desvantagens
5
I.1.4 - Fases de um Compilador
I.1.4.1 - Analisador Léxico
 Interface entre o programa fonte e o compilador
 Funções básicas:
 Ler o programa fonte
 Agrupar caracteres em itens léxicos (tokens)
* Identificadores
* Palavras Reservadas
* Constantes (numéricas e literais)
* Símbolos especiais (simples, duplos, ...)
 Ignorar elementos sem valor sintático
* Esp. em branco, comentários e caract. de controle
 Detectar e diagnosticar erros léxicos
* Símbolos inválidos, elementos mal formados
* Tam. inválido de constantes, literais e identif.
 Exemplo:
Programa Fonte
program exemplo;
var A, B : integer;
begin
(* Inicio do programa *)
read ( A );
B := A + 2.5;
...
end.
Tokens Reconhecidos
program
exemplo
;
var
A
,
...
end
.
1 - PR
2 - ID
3 - SE
4 - PR
2 - ID
5 - SE
...
37 - PR
38 - SE
6
I.1.4.2 - Analisador Sintático
 Funções básicas
 Agrupar TOKENS em estruturas sintáticas
(expressões, comandos, declarações, etc. ...)
 Verificar se a sintaxe da linguagem na qual o
programa foi escrito está sendo respeitada
 Detectar/Diagnosticar erros sintáticos
 Exemplos:
B
:=
<var>
A * 2.5
<expressão>
<comando>
var
A , B :
integer
<lista-var>
<tipo>
<declaração>
7
I.1.4.3 - Analisador Semântico
SEMÂNTICA  COERÊNCIA  SIGNIFICADO 
SENTIDO LÓGICO
 Funções básicas:
 Verificar se as construções utilizadas no P.F.
estão semanticamente corretas
 Detectar e diagnosticar erros semânticos
 Extrair informações do programa fonte que
permitam a geração de código
 Verificações Semânticas Usuais
 Análise de escopo
 Variáveis não declaradas
 Múltiplas declarações de uma mesma variável
 Compatibilidade de tipos
 Coerência entre
identificadores
declaração
e
uso
de
 Correlação entre parâmetros formais e atuais
 Referências não resolvidas
o Procedimentos e desvios
8
Tabela de Símbolos :
Definição - Estrutura onde são guardadas as
informações (os atributos) essenciais sobre cada
identificador utilizado no programa fonte.
Atributos mais comuns
 nome
 endereço relativo (nível e deslocamento)
 categoria
 variável
 simples - tipo
 array - dimensões, tipo dos elementos
 record - campos (quant. e apontadores)
 ...
 constante
 tipo e valor
 procedimentos
 procedure ou função
 número de parâmetros
 ponteiro para parâmetros
 se função, tipo do resultado
 parâmetro
 tipo
 forma de passagem (valor , referência)
 campo de record
 tipo, deslocamento dentro do Record
9
Tratamento ou Recuperação de ERROS:
 Funções
 Diagnosticar erros léxicos, sintáticos e
semânticos encontrados na etapa de análise
 Tratar os erros encontrados, de forma que a
análise possa ser concluída
I.1.4.4 - Gerador de Código Intermediário
 Função
 Consiste na geração de um conjunto de
instruções (equivalentes ao programa fonte de
entrada) para uma máquina hipotética (virtual)
 Exemplo
E := ( A + B ) * ( C + D )
Quadrupla
( + , A , B , T1)
( + , C , D , T2)
( + , T1 , T2 , E)
Máquina de acumulador
carregue A
some B
armazene T1
carregue C
some D
armazene T2
carregue T1
multiplique T2
armazene E
10
I.1.4.5 - Otimizador de código
 Função
 Melhorar o código, de forma que a execução
seja mais eficiente quanto ao tempo e/ou espaço
ocupado
 Otimizações mais comuns
 Agrupamento de sub-expressões comuns
ex. c := (a + b ) * ( a + b )
 Eliminação de desvios para a próxima instrução
 Retirada de comandos invariantes ao LOOP
 Eliminação de código inalcançável
 Redução em força
 Transformação/avaliação parcial
 Alocação ótima de registradores
I.1.4.6 - Gerador de Código
 Função :
 Converter o programa fonte (diretamente ou a
partir de sua representação na forma de código
intermediário) para uma sequência de instruções
(assembler ou máquina) de uma máquina real.
11
Download