Aula Compiladores

Post on 12-Aug-2015

72 views 7 download

Transcript of Aula Compiladores

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.