Aula Compiladores
-
Upload
fabio-jose-colombo -
Category
Documents
-
view
83 -
download
7
Transcript of Aula Compiladores
![Page 1: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/1.jpg)
Interpretadores
e os
Compiladores
begin
if x = 5 then
... 1100111
0011100011
Código Fonte Compilador Programa
output + params
![Page 2: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/2.jpg)
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
![Page 3: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/3.jpg)
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
![Page 4: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/4.jpg)
• 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
![Page 5: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/5.jpg)
Linguagem de Montagem
Execução de Programas
![Page 6: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/6.jpg)
Linguagem de Montagem
Execução de Programas
![Page 7: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/7.jpg)
• 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
![Page 8: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/8.jpg)
• 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
![Page 9: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/9.jpg)
• 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
![Page 10: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/10.jpg)
Mas com o quê ???
![Page 11: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/11.jpg)
Com Compiladores ou Interpretadores
![Page 12: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/12.jpg)
Interpretadores
![Page 13: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/13.jpg)
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.
![Page 14: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/14.jpg)
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
![Page 15: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/15.jpg)
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.
![Page 16: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/16.jpg)
Interpretadores Os Exemplos de interpretadores
• Internet;
• Excel, Basic, Access, ... ;
• SmallTalk;
• Lisp;
• Visual G.
![Page 17: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/17.jpg)
Compiladores
![Page 18: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/18.jpg)
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
![Page 19: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/19.jpg)
Compiladores O que é um compilador
![Page 20: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/20.jpg)
• 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
![Page 21: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/21.jpg)
• 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
![Page 22: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/22.jpg)
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
![Page 23: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/23.jpg)
• 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
![Page 24: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/24.jpg)
• 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
![Page 25: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/25.jpg)
• 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
![Page 26: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/26.jpg)
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
![Page 27: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/27.jpg)
• 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
![Page 28: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/28.jpg)
• 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
![Page 29: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/29.jpg)
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
![Page 30: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/30.jpg)
• 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
![Page 31: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/31.jpg)
• 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
![Page 32: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/32.jpg)
• 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
![Page 33: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/33.jpg)
Análise Lexica
![Page 34: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/34.jpg)
Análise Lexica
![Page 35: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/35.jpg)
Análise Lexica
![Page 36: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/36.jpg)
• 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
![Page 37: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/37.jpg)
• 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
![Page 38: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/38.jpg)
Análise Sintática
![Page 39: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/39.jpg)
Análise Sintática
![Page 40: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/40.jpg)
Análise Sintática
![Page 41: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/41.jpg)
Análise Sintática
while I < 100 do I := J + I ;
![Page 42: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/42.jpg)
Análise Lexica e Sintática
![Page 43: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/43.jpg)
Análise Sintática
![Page 44: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/44.jpg)
• 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
![Page 45: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/45.jpg)
• 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
![Page 46: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/46.jpg)
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
![Page 47: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/47.jpg)
Análise Semântica
• Principais verificações semânticas:
• Compatibilidade de tipos
...
var A: boolean;
B: real;
...
A:=B+0,5;
![Page 48: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/48.jpg)
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];
![Page 49: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/49.jpg)
Análise Semântica –Compatibilidade entre
parâmetros formal e atual:
• procedure X (a, b: integer);
begin
...
end;
...
X(a, b, c);
![Page 50: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/50.jpg)
• 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
![Page 51: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/51.jpg)
Constrói o programa-destino a partir da
representação intermediária.
![Page 52: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/52.jpg)
![Page 53: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/53.jpg)
![Page 54: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/54.jpg)
• 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
![Page 55: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/55.jpg)
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.
![Page 56: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/56.jpg)
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.
![Page 57: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/57.jpg)
• 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
![Page 58: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/58.jpg)
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:
![Page 59: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/59.jpg)
Tratamento de Erros...
Em todas as fases...
![Page 60: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/60.jpg)
Tratamento de Erros...
![Page 61: Aula Compiladores](https://reader034.fdocuments.net/reader034/viewer/2022042506/557213fd497959fc0b937e4a/html5/thumbnails/61.jpg)
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.