• Nenhum resultado encontrado

Aula 1 - Introdução Disciplina

N/A
N/A
Protected

Academic year: 2021

Share "Aula 1 - Introdução Disciplina"

Copied!
44
0
0

Texto

(1)

Introdução à Compilação

Aula 1 – Introdução a Disciplina Prof. Nemésio Freitas Duarte Filho

(2)

Motivação

 Conhecimento das estruturas e algorítmos usados

na implementação de linguagens: noções

importantes sobre uso de memória, eficiência, etc.

 Aplicabilidade freqüente na solução de problemas

que exigem alguma forma de tradução entre linguagens ou notações.

 Implementação de linguagens para um domínio

específico.

(3)

Motivação

 A disciplina de compiladores faz uso de um

grande número de conceitos estudados em outras disciplinas do curso:

 linguagens de programação,  algorítmos,

 linguagens formais e autômatos,  arquitetura,

(4)

Compilador

 Definição:

Programa que lê um programa escrito em uma linguagem (fonte) e o traduz para uma outra

linguagem (destino), reportando erros quando eles ocorrem.

(5)

Linguagens

 Linguagem fonte: C, Pascal, Java, Fortran, etc.  Linguagem destino:

 linguagem de máquina (assembler) de um processador,

 de uma máquina virtual (ex: Java ou .NET),  ou qualquer outra linguagem (ex: C).

(6)

Compilador Programa fonte Programa destino

Processadores de Linguagens:

Compilador

Processo Básico:

(7)

Programa destino

entrada saída

(8)

Interpretador Programa fonte

saída

Processadores de Linguagens: Interpretador

(9)

Máquina Virtual(Interpreta) Programa intermediário saída

Compilador Híbrido

entrada Tradutor (Compila) Programa fonte

(10)

compilador preprocessador assembler Linker / Loader Programa fonte Programa fonte modificado Programa em assembler

Código objeto (relocável)

Código objeto (executável)

Bibliotecas / código objeto

Sistema de processamento

de uma linguagem

(11)

Programas auxiliares do processo de

compilação

 Preprocessadores: processam macros,

suportam compilação condicional e extensão de linguagens (efetua conversões léxicas, substitui comentários, ignora espaços em brancos).

 Assemblers: servem como uma pequena

abstração da arquitetura da máquina-destino. São na realidade um tradutor /compilador

simples, de dois passos, que gera código relocável.

(12)

Programas auxiliares do processo de

compilação (cont.)

Carregadores (loaders) e linkeditores (linkers)

 Ajustam o código relocável, resolvem referências externas.

(13)

Compilação: Análise e Síntese

Análise: quebra o código fonte em suas

partes, e cria uma representação intermediária do programa.

Verifica erros e constrói tabela de símbolos.

Síntese: Constroi o programa-destino a partir

(14)

Fases de um compilador

Analisador léxico stream de caracteres Código de máquina Analisador sintático Analisador semântico

Ger. de código intermediário

Otimizador de código Gerador de código stream de tokens árvore sintática árvore sintática representação intermediária representação intermediária

(15)

Análise: front-end do compilador

(até geração de código intermediário) Síntese: back-end do compilador

(16)

Análise do programa fonte

 Análise léxica – lê a seqüencia de caracteres e a

organiza como tokens – sequencias de caracteres com algum significado

Análise sintática – agrupa caracteres ou tokens

em uma estrutura hierárquica com algum significado

 Análise semântica – verifica se os componentes

de um programa se encaixam de forma a ter um significado adequado.

(17)

Programas baseados em análise

 Editores de programa dirigidos à sintaxe

(comuns nos IDEs, como no Eclipse e Visual Studio)

 Pretty-printers (Recurso de alguns editores

usados na programação que formata o código de modo a facilitar a leitura e o entendimento)

(18)

Análise léxica ou Scanning

Lê os caracteres de entrada e agrupa-os

em sequencias chamadas lexemas.

Para cada lexema o analisador léxico

produz como saída um token da forma

<nome do token, valor do atributo>

que é passado para a fase seguinte.

(19)

Exemplo

position = initial + rate * 60

<identificador, 1> <=> <identificador, 2> <+> <identificador, 3> <*> <number, 60>

(20)

Tabela de Símbolos

identificador

tipo

1

position

2

initial

3

rate

(21)

Análise sintática ou parsing

A partir dos tokens cria uma estrutura em

árvore (árvore sintática) que representa a estrutura gramatical do programa.

(22)

Árvore Sintática

 position = initial + rate * 60

<id,2> <id,3> * + = <id,1> 60

(23)

Análise semântica

 Verifica o programa em relação a possíveis

erros semânticos e guarda informações adicionais

(24)

Exemplo: verificação de tipos

A expressão

x = x + 3.0

está sintaticamente correta, mas pode estar semanticamente certa ou errada, dependendo do tipo de x.

(25)

Análise Semântica

<id,2> <id,3> * + = <id,1> 60 inttofloat

(26)

Código intermediário

Idealmente deve ser fácil de produzir e

também de traduzir para a

linguagem-destino.

Na prática, se está gerando código para

uma máquina abstrata.

Por exemplo, Three-address-code: usa três

operandos por instrução, cada um como se

fosse um registrador.

(27)

Código intermediário - exemplo

t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 <id,2> <id,3> * + = <id,1> 60 inttofloat position = initial + rate * 60

(28)

Otimização de código

 Realiza transformações no código visando

melhorar sua performance em aspectos de tempo de execução, uso de memória,

(29)

Otimização de código - exemplo

t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 t2 = id3 * 60.0 id1 = id2 + t2

(30)

Geração de código

 Realiza a alocação de registradores (se

necessária) e a tradução do código

(31)

Geração de código

LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1

(32)

Tabela de Símbolos

 Estrutura de dados usada para guardar

identificadores e informações sobre eles:

 alocação de memória,  tipo do identificador,

 escopo (onde é válido no programa)

 se for um procedimento ou função: número e tipo dos argumentos, forma de passagem dos

(33)

Tabela de Símbolos

identificador

tipo

1

position

2

initial

3

rate

(34)

Organizando fases em passos

 Fases: visão lógica de um compilador

 Em uma implementação as fases podem ser

agrupadas em um ou mais passos

 Passos: número de vezes em que se passa pelo

mesmo código.

 Por exemplo, em um assembler são

(35)

C

x86 Front-end

Separação entre front-end e back-end

para criação de múltiplos compiladores

código intermediário código intermediário Back-end Front-end Front-end Front-end C# Pascal Fortran

(36)

Pascal

x86

Front-end

ARM

Separação entre front-end e back-end

para criação de múltiplos compiladores

código intermediário código intermediário MIPS .NET Back-end Back-end Back-end Back-end

(37)

C

x86 Front-end

ARM

Separação entre front-end e back-end

para criação de múltiplos compiladores

código intermediário código intermediário MIPS .NET Back-end Back-end Back-end Back-end Front-end Front-end Front-end C# Pascal Fortran

(38)

Ferramentas auxiliares para a construção

de compiladores

Scanner generators, baseados em expressões

regulares. Exemplo: lex

Parser generators, baseados em gramáticas livres de

contexto. Exemplo: yacc

Engenhos de tradução dirigida por sintaxe, geram

rotinas para navegar na parse tree e gerar código intermediário

Geradores de geradores de código (template

matching)

(39)

Exercícios

1-Defina o que é um compilador

2- Qual a diferença básica entre um compilador e um interpretador?

 

3- Resumidamente quais são as etapas da compilação?

 

(40)

Exercícios

1-Defina o que é um compilador

R:Programa (Software) que lê um programa escrito em uma linguagem (fonte) e o traduz para uma outra linguagem (destino), reportando erros quando eles ocorrem.

(41)

Exercícios

 

2- Qual a diferença básica entre um compilador e um interpretador?

Compiladores

- Vantagens:

1) A execução do programa é mais rápida. 2) Estruturas de dados mais completas; 3) Permitem a otimização de código fonte. - Desvantagens:

1) Várias etapas de tradução;

2) Processo de correção de erro e de depuração é mais demorado;

3) Programação final é maior, o que gera a necessidade de mais memória;

Interpretadores

- Vantagens:

1) Depuração é mais simples; 2) Consomem menos memória;

3) Resultado imediato do programa ou rotina desenvolvida. - Desvantagem:

1) A execução do programa é mais lenta.

2) Estrutura de dados demasiadamente simples;

(42)

Exercícios

 

(43)

Exercícios

 

4 – Qual é a fase mais importante da

compilação?

(44)

Dúvidas

E-mail:

nemesiofreitas@gmail.com

Site:

Referências

Documentos relacionados

Com resultados satisfatórios para a análise de consistência dos dados, foram identificadas as chuvas máximas diárias para cada ano nos postos de Brejinho e Itapetim, conforme

Python é uma linguagem interpretada, ou seja, o compilador Python traduz o programa fonte para uma linguagem intermediária (em geral chamada de ByteCode) que será interpretada por

Devido ao grande número de peças pré-moldadas integrantes dos muros de fechamento e das passagens de emergência do Metrô de São Paulo (cerca de 75.000 peças referentes às Vias

Um dos problemas encontrados foi o facto de a marca ser reconhecida entre os seus consumidores portugueses como uma marca de fraca confiança e com um fraco apoio ao

Este Sistema consiste em um acordo estabelecido entre as operadoras de planos de saúde associadas à Abramge pelo qual se obrigam a prestar atendimento de urgência e emergência

Estas taxas de crescimento estão entre os maiores valores encontrados para esta espécie, evidenciando a potencialidade que a população apresenta para desenvolver

Equipamentos de emergência imediatamente acessíveis, com instruções de utilização. Assegurar-se que os lava- olhos e os chuveiros de segurança estejam próximos ao local de

O motor deve sempre funcionar na rotação máxima para evitar vibra- ções anormais na máquina.. Mantenha as mãos e os pés afastados da(s)