61
Interpretadores e os Compiladores begin if x = 5 then ... 1100111 0011100011 Código Fonte Compilador Programa output + params

Aula Compiladores

Embed Size (px)

Citation preview

Page 1: Aula Compiladores

Interpretadores

e os

Compiladores

begin

if x = 5 then

... 1100111

0011100011

Código Fonte Compilador Programa

output + params

Page 2: Aula Compiladores

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

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

• 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

Linguagem de Montagem

Execução de Programas

Page 6: Aula Compiladores

Linguagem de Montagem

Execução de Programas

Page 7: Aula Compiladores

• 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

• 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

• 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

Mas com o quê ???

Page 11: Aula Compiladores

Com Compiladores ou Interpretadores

Page 12: Aula Compiladores

Interpretadores

Page 13: Aula Compiladores

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

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

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

Interpretadores Os Exemplos de interpretadores

• Internet;

• Excel, Basic, Access, ... ;

• SmallTalk;

• Lisp;

• Visual G.

Page 17: Aula Compiladores

Compiladores

Page 18: Aula 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

Page 19: Aula Compiladores

Compiladores O que é um compilador

Page 20: Aula Compiladores

• 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

• 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

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

• 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

• 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

• 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

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

• 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

• 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

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

• 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

• 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

• 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

Análise Lexica

Page 34: Aula Compiladores

Análise Lexica

Page 35: Aula Compiladores

Análise Lexica

Page 36: Aula Compiladores

• 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

• 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

Análise Sintática

Page 39: Aula Compiladores

Análise Sintática

Page 40: Aula Compiladores

Análise Sintática

Page 41: Aula Compiladores

Análise Sintática

while I < 100 do I := J + I ;

Page 42: Aula Compiladores

Análise Lexica e Sintática

Page 43: Aula Compiladores

Análise Sintática

Page 44: Aula Compiladores

• 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

• 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

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

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

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

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

• 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

Constrói o programa-destino a partir da

representação intermediária.

Page 52: Aula Compiladores
Page 53: Aula Compiladores
Page 54: Aula Compiladores

• 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

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

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

• 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

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

Tratamento de Erros...

Em todas as fases...

Page 60: Aula Compiladores

Tratamento de Erros...

Page 61: Aula Compiladores

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.