aula compiladores
Post on 12-Aug-2015
72 Views
Preview:
TRANSCRIPT
Interpretadores
e os
Compiladores
begin
if x = 5 then
... 1100111
0011100011
Código Fonte Compilador Programa
output + params
Introdução
• Linguagens:
– Homem: natural + notações (como a
matemática)
– Máquina: nível muito atômico (dígitos,
binários, registradores, memória etc)
• Solução proposta: ling. Alto Nível
Programa
Fonte
Programa
Objeto
Tradutor
Tradutor: Compilador ou Interpretador
Uma linguagem de programação é um conjunto de ferramentas, regras de sintaxe e símbolos ou códigos que nos permitem escrever programas de computador;
A primeira e mais primitiva linguagem de computador é a própria linguagem máquina (0’s e 1’s);
Um programa era difícil, longo e principalmente caro de o construir.
Era também difícil de ser entendido por outros programadores;
Essa complexidade levou à necessidade de desenvolver novas técnicas e ferramentas.
Programa em Linguagem de Máquina
Execução de Programas
• A resolução do problema passou pela criação de uma linguagem em que os códigos numéricos foram substituídos por mnemónicos;
• O nome dessa linguagem é ASSEMBLY LANGUAGE;
• Então será necessário um outro programa que leia o programa escrito nessa linguagem alternativa e o traduza para a linguagem nativa do computador;
• O processo de tradução da linguagem de montagem para a linguagem de máquina é realizada por um programa chamado ASSEMBLER.
Linguagem de Montagem
Execução de Programas
Linguagem de Montagem
Execução de Programas
Linguagem de Montagem
Execução de Programas
• Foram desenvolvidas diversas linguagens de programação: • FORTRAN (1957)
• ALGOL (1958)
• COBOL (1959)
• PASCAL (1963)
• BASIC (1965)
• ADA (1968)
• DoD (1969)
• C (1982) e mais tarde o C++ (1986)
• Etc….
• Estas novas linguagens foram afastando cada vez mais o programador do nível de máquina.
Linguagem de Programação
Execução de Programas
• Os programas em linguagem de alto nível também precisam de ser traduzidos para linguagem de máquina.
Tradução
Código Fonte Código Objecto
Tradução
Execução de Programas
• O processo de montagem traduz um programa escrito numa LP num programa equivalente em linguagem maquina.
Montagem
Código Fonte
Tradução
Linguagem de Máquina
Processo de Montagem
Execução de Programas
Mas com o quê ???
Com Compiladores ou Interpretadores
Interpretadores
Interpretadores Como funcionam os interpretadores
• O funcionamento dos interpretadores é muito parecido ao dos compiladores;
• O interpretador traduz o código linha a linha;
• O código fonte não é totalmente traduzido antes de ser executado;
• Não existem fases distintas nem se produz código intermediário;
• Passa o tempo todo a ler e a traduzir código.
Interpretadores Interpretador: o tradutor transforma uma L.P. numa
linguagem simplificada, chamada Código intermediário, que pode ser diretamente executado usando um programa chamado interpretador.
OBS: Podemos pensar na linguagem intermediária como sendo a linguagem de máquina de um computador abstrato designado a executar o código fonte.
Programa Fonte Código Intermediário
em Execução
Interpretador
Interpretadores
Em alguns casos, a própria linguagem fonte pode ser a
linguagem intermediária. Por ex, a maioria das linguagens
de comandos, na qual nos comunicamos diretamente com
o sistema Operacional, são interpretadas sem nenhuma
tradução prévia (Ex. DOS).
Os Interpretadores são em geral, menores que os Compiladores e facilitam as implementações de L.P.
A principal desvantagem é que o tempo de execução de um programa interpretado é em geral, maior que o de um
correspondente programa objeto compilado.
Interpretadores Os Exemplos de interpretadores
• Internet;
• Excel, Basic, Access, ... ;
• SmallTalk;
• Lisp;
• Visual G.
Compiladores
Compiladores
• O nome compilador, criado nos anos 50,
faz referência ao processo de composição
de um programa pela reunião de várias
rotinas de biblioteca; o processo de
tradução (de uma linguagem fonte para
uma linguagem objeto).
Programa
Linguagem
Fonte
Compilador Programa
Linguagem
Alvo
Mensagens
de Erro
Compiladores O que é um compilador
• Um compilador tem a finalidade de converter uma linguagem – Linguagem Fonte (de fácil escrita e leitura para os programadores), numa linguagem alvo ou objecto (que possa ser executada pelas máquinas);
• O código executável gerado pelo compilador é dependente do sistema operacional e da linguagem de máquina para o qual o código fonte foi traduzido;
• A enorme variedade de compiladores existentes é bem vinda, visto que existem milhares de linguagens fonte, e as linguagens alvo são também muito variadas.
Compiladores O que é um compilador
• O primeiro compilador de FORTRAN, por exemplo, demorou 18 trabalhosos meses para implementar;
• Boas linguagens de implementação, ambientes de programação, e ferramentas de software também vieram a ser desenvolvidas.
Compiladores O que é um compilador
Linguagem Fonte
Fortran
C
Pascal
Modula
Algol
...
Máquina Alvo
Intel
Mips
Sparc
...
A máquina alvo pode estar entre um
microprocessador e um supercomputador
Variedade de Compiladores
Compiladores
• Pré-processadores: produzem o input para os compiladores;
• Montadores: Alguns compiladores produzem código Assembler que é passado para um montador para posterior processamento;
• Alguns compiladores produzem o trabalho dos montadores.
Compiladores Primos de um compilador
• Montagens bi-passo: • I Passo - todos os identificadores que denotam localizações
de armazenamento, são encontrados e armazenados numa tabela de símbolos
• II Passo - traduz cada código de operação para sequências de bits representando essa operação na linguagem máquina
• Carregadores e editores de união (Linker):
• Consiste em tomar o restabelecimento do código máquina, alterando os endereços restabelecidos e colocando as instruções alteradas e dados na memória nas localizações convenientes.
• O editor de união permite-nos fazer um único programa dos vários ficheiros de código de máquina relocalizável;
Compiladores Primos de um compilador
• Bibliotecas:
• O desenvolvimento de um programa certamente utilizará diversas operações que são comuns a muitos outros programas;
• Um programa de alto nível possivelmente conterá diversas chamadas de biblioteca;
• Essas funções não devem ser confundidas com as instruções da linguagem – na realidade, são pequenos programas externos que são chamados através de instruções especiais chamado biblioteca.
Compiladores Primos de um compilador
Comparação
Vantagens Desvantagens
Compiladores
Execução mais rápida Várias etapas de tradução
Permite estruturas de
programação mais completas
Programação final é maior,
necessitando mais memória para a sua
execução
Permite a optimização do código
fonte
Processo de correcção de erros e
depuração é mais demorado
Interpretadores
Depuração do programa é mais
simples
Execução do programa é mais lenta
Consome menos memória Estruturas de dados demasiado
simples
Resultado imediato do programa
ou rotina desenvolvida
Necessário fornecer o programa fonte
ao utilizador
• Estrutura Geral de um Compilador
(Modelo de compilação de Análise e Síntese)
Análise Léxica
Análise Sintática 1. Análise
2. Síntese
Análise Estrutural
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código Alvo
Compiladores
• A interação entre os módulos do compilador
Tratamento
de Erros
Geração de Código Intermediário
Otimização
Código Alvo
Síntese
Léxica
Sintática
Semântica
Análise
Programa Fonte
Programa Alvo
Compiladores
Fases de Compilação a
bstr
ação
imple
menta
ção
Código
fonte
Tokens e
Lexemas
Árvore
sintática
abstrata
Código
máquina
Síntese
Análise
Léxica
Análise
Sintática Análise
Semântica
Geração de
Código
• Podemos dividir o processo de compilação em duas fases:
• Análise : parte o programa fonte em peças constituintes e cria
uma representação intermédia do programa fonte;
• Síntese : Constrói o desejado programa alvo (código de máquina) a partir da representação intermédia;
• A parte da síntese é a que requer técnicas mais especializadas.
Compiladores Modelo Análise- síntese da compilação
• Estrutura Geral de um Compilador
(Modelo de compilação de Análise e Síntese)
Análise Léxica
Análise Sintática 1. Análise
2. Síntese
Análise Estrutural
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código Alvo
Compiladores
• Análise Léxica ou Linear: • Em que a cadeia de caracteres que forma a estrutura
do programa fonte é lido da esquerda para a direita e agrupado em tokens.
• A sua função básica é o reconhecimento e a classificação das estruturas elementares ou classes sintácticas das linguagens.
Compiladores Análise do programa fonte
Análise Lexica
Análise Lexica
Análise Lexica
• Estrutura Geral de um Compilador
(Modelo de compilação de Análise e Síntese)
Análise Léxica
Análise Sintática 1. Análise
2. Síntese
Análise Estrutural
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código Alvo
Compiladores
• Análise sintáctica ou hierárquica: • Na qual caracteres ou tokens são agrupados hierarquicamente em colecções aninhadas com sentido coletivo.
• Verifica se a estrutura geral do texto ou programa fonte está correcta.
Compiladores Análise do programa fonte
Análise Sintática
Análise Sintática
Análise Sintática
Análise Sintática
while I < 100 do I := J + I ;
Análise Lexica e Sintática
Análise Sintática
• Estrutura Geral de um Compilador
(Modelo de compilação de Análise e Síntese)
Análise Léxica
Análise Sintática 1. Análise
2. Síntese
Análise Estrutural
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código Alvo
Compiladores
• Análise semântica: • Verifica o programa em relação a possíveis
erros semânticos e guarda informações adicionais.
• A análise semântica trata os aspectos sensíveis ao contexto da sintaxe das linguagens de programação.
• Ex.: "Toda variável deve ser declarada antes de ser usada!“.
• A verificação se essa regra foi aplicada cabe à análise semântica.
Compiladores Análise do programa fonte
Análise Semântica • Funções:
• Verificar se o significado das construções
sintáticas possibilitam a geração de código;
• Extrair informações do programa fonte que
possibilitem a geração de código;
• Por exemplo, o seguinte comando IF,
sintaticamente correto, pode existir em um
programa:
if a>7 then b:=5 else b:=10;
• Depende dos tipos das variaveis a e b
Análise Semântica
• Principais verificações semânticas:
• Compatibilidade de tipos
...
var A: boolean;
B: real;
...
A:=B+0,5;
Análise Semântica – Duplicidade de identificadores:
• Var A, A, B: integer;
– Compatibilidade entre declarações e
uso de entidades:
• Var X: array[1..N] of byte;
A: byte;
...
A:=X.C1; ou A:=X[1];
Análise Semântica –Compatibilidade entre
parâmetros formal e atual:
• procedure X (a, b: integer);
begin
...
end;
...
X(a, b, c);
• Estrutura Geral de um Compilador
(Modelo de compilação de Análise e Síntese)
Análise Léxica
Análise Sintática 1. Análise
2. Síntese
Análise Estrutural
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código Alvo
Compiladores
Constrói o programa-destino a partir da
representação intermediária.
• Estrutura Geral de um Compilador
(Modelo de compilação de Análise e Síntese)
Análise Léxica
Análise Sintática 1. Análise
2. Síntese
Análise Estrutural
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código Alvo
Compiladores
Geração do Código Intermediário O gerador de código intermediário será
acionado quando o programa for analisado
léxica, sintática e semanticamente.
x:=(a+c)*(d-10); Gera a seguinte tabela de Cod. Int.
Geração do Código Intermediário Para if e while deve-se manter saltos (ou jumps
GOTO), para que determinados trechos de código
possam ser evitados na hora da execução.
• Estrutura Geral de um Compilador
(Modelo de compilação de Análise e Síntese)
Análise Léxica
Análise Sintática 1. Análise
2. Síntese
Análise Estrutural
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código Alvo
Compiladores
Otimização do Código Realiza transformações no código visando melhorar sua performance
em aspectos de tempo de execução, uso de memória, tamanho do
código executável etc. Estratégias básicas de otimização:
• Eliminação de código redundante: busca detectar situações
onde a tradução de duas expressões gera instruções cuja execução
repetida não tem efeito. Por exemplo: x := y ..(codigo).. x := y
• Eliminação de código não-alcançável, ou “código morto”. Ex.:
Em um comando de decisão o código nunca é algançado!
• Uso de propriedades algébricas, quando o compilador identifica
que uma expressão aritmética foi reduzida a:
ou então o compilador reduz a expressão a:
Tratamento de Erros...
Em todas as fases...
Tratamento de Erros...
Linguagens:
C e C++... são compiladas estaticamente, e seus códigos
fontes são transformados diretamente em linguagem de
máquina.
Java, C# e Python têm seus códigos fontes transformados
em uma linguagem intermediária (específica de cada
linguagem), que será interpretada pela máquina virtual da
linguagem quando o programa for executado.
top related