bibliografia 1. aho v.a., sethi r., ulman d.j., compiladores - princípios, técnicas e ferramentas,...

60
Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara Koogan, Rio de Janeiro, 1995 2. Kowaltowisk T., Implementação de Linguagens de Programação - Ed. Guanabara Dois, 1993 3. Setzer W., Mello I. H. - A Construção de um Compilador - Ed. Campus, Rio de Janeiro, 1985

Upload: internet

Post on 17-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Bibliografia

1. Aho V.A., Sethi R., Ulman D.J., Compiladores -

Princípios, Técnicas e Ferramentas, tradução de

Daniel de Ariosto Pinto - Ed. Guanabara Koogan,

Rio de Janeiro, 1995

2. Kowaltowisk T., Implementação de Linguagens

de Programação - Ed. Guanabara Dois, 1993

3. Setzer W., Mello I. H. - A Construção de um

Compilador - Ed. Campus, Rio de Janeiro, 1985

Page 2: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Programa

• Introdução ao Curso

• Linguagens de Programação e Programas

• Definição da Linguagem do Curso

• Análise Léxica

• Análise Sintática– Descendente

– Ascendente

• Geração de Código

Page 3: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

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 4: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Como funcionam os Compiladores e os

Interpretadores

Page 5: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

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 Programa emem Linguagem de Linguagem de MáquinaMáquina

I. Execução de Programas

Page 6: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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 MontagemLinguagem de Montagem

I. Execução de Programas

Page 7: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Linguagem AssemblerLinguagem Assembler

I. Execução de Programas

;****************************************************** ;*** INTERFACE ROUTINES *** ;****************************************************** ; Read_Char PROC ;read char from input buffer ; ;Entry: CL = port number ; ;Exit: AL = char (z set if none) ; push cx ;preserve registers push bx ; cmp cl,0 ;only port 0 allowed jz rc_1 ; _Int_Error 03301h ;invalid port number ; rc_1: mov al,Rx_InPtr sub al,Rx_OutPtr ;inptr - outptr = num. chars jz rc_zex ;if zero exit

Page 8: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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çãoLinguagem de Programação

I. Execução de Programas

Page 9: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Os programas em linguagem de alto nível também precisam de ser traduzidos para linguagem de máquina.

TraduçãoTradução

Código FonteCódigo Fonte Código ObjectoCódigo Objecto

TraduçãoTradução

I. Execução de Programas

Page 10: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• O processo de montagem traduz um programa escrito numa LP num programa equivalente em linguagem maquina.

MontagemMontagem

Código FonteCódigo Fonte

TraduçãoTradução

Linguagem de Linguagem de MáquinaMáquina

Processo de Processo de MontagemMontagem

I. Execução de Programas

Page 11: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Mas Mas com com

o o quê ???quê ???

Page 12: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Com Compiladores ou InterpretadoresCom Compiladores ou Interpretadores

Page 13: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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), considerado hoje a função central de um compilador, era então conhecido como programação automática.

Page 14: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Um compilador tem a finalidade de converter uma linguagem – Linguagem Fonte – de fácil escrita e leitura para os programadores, numa linguagem – 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.

II . CompiladoresO que é um compiladorO que é um compilador

Page 15: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Os compiladores são por vezes classificados como uni-passo, multi-passo, optimizador, ou corrector de erros, dependendo da forma como foram construídos ou da funcionalidade para que são pretendidos.

• Começaram a aparecer no início da década de 50.

• Muito do trabalho inicial dos compiladores resumia-se a tradução de fórmulas aritméticas para código máquina.

II . CompiladoresO que é um compiladorO que é um compilador

Page 16: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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 têm também vindo a ser desenvolvidas.

• Com estes avanços, um bom compilador pode ser implementado até por alunos!!! num projecto de um semestre de um curso de desenho de compiladores.

II . CompiladoresO que é um compiladorO que é um compilador

Page 17: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Ilustração do funcionamento de um compilador:

II . CompiladoresO que é um compiladorO que é um compilador

Page 18: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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.

II . CompiladoresModelo Análise- síntese da compilaçãoModelo Análise- síntese da compilação

Page 19: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresModelo Análise- síntese da compilaçãoModelo Análise- síntese da compilação

AnáliseAnálise

Análise Análise LéxicaLéxica

Análise Análise SintácticaSintáctica

Análise Análise SemânticaSemântica

Page 20: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresModelo Análise- síntese da compilaçãoModelo Análise- síntese da compilação

SínteseSíntese

Geração doGeração doCódigoCódigo

OptimizaçãOptimizaçãoo

do Códigodo Código

Page 21: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Muitos outros programas podem ser necessários para criar um programa alvo executável.

II . CompiladoresContexto de um compiladorContexto de um compilador

Biblioteca, Ficheiros dos Biblioteca, Ficheiros dos Objectos RelocalizadosObjectos Relocalizados

Page 22: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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;

II . CompiladoresPrimos de um compiladorPrimos de um compilador

Page 23: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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):• Carregar 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;

II . CompiladoresPrimos de um compiladorPrimos de um compilador

Page 24: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• 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.

II . CompiladoresPrimos de um compiladorPrimos de um compilador

Page 25: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

III . InterpretadoresComo funcionam os Como funcionam os interpretadoresinterpretadores

• 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 26: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

III . InterpretadoresInterpretador: 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

Interpretador

Page 27: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

III . 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 mais completas 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 28: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

III . InterpretadoresOs Exemplos de Os Exemplos de interpretadoresinterpretadores

• Internet;

• Excel, Word Basic, Access, ... ;

• SmallTalk;

• AutoLisp;

• Lisp.

Page 29: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

IV . 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 30: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

V . Exemplos de Linguagens

Compiladas e InterpretadasCompiladas e Interpretadas

• Java;Java;

• Basic .Basic .

Page 31: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . Compiladores• Naturalmente, a tarefa de análise deve ter como resultado uma representação

do programa fonte que contenha informação suficiente para a geração do programa objeto correspondente. Normalmente, essa representação (conhecida como representação intermediária) é complementada por tabelas que contêm informação adicional sobre o programa fonte.

Page 32: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . Compiladores

• características da representação intermediária as estruturas de dados empregadas devem garantir acesso eficiente a todas as informações, podendo, para isso, ser conveniente algum grau de redundância.

Page 33: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . Compiladores• Um dos modelos possíveis para a construção de

compiladores faz a separação total entre o front-end, encarregado da fase de análise, e o back-end, encarregado da geração de código. – front-end e back-end se comunicam apenas através da

representação intermediária;– o front-end depende exclusivamente da linguagem fonte (e,

portanto, independe da linguagem ou da máquina objeto);– o back-end depende exclusivamente da linguagem objeto

(e, portanto, independe da linguagem fonte).• Esse modelo simplifica a implementação de N

linguagens de programação para N máquinas ( basta escrever um front-end para cada linguagem, e um back-end para cada máquina.

Page 34: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Considerações:

– Aspecto Sintático: há uma formalização conveniente

através de Gramáticas Livres de Contexto, que

permitem a descrição da linguagem

– Aspecto Semântico: pouca generalização - inexistência

de modelos adequados

– Aspecto Pragmático: mais variável, apresentando

soluções diferenciadas para cada Sistema Operacional

adotado.

Aspectos Básicos

Page 35: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• sintaxe dá idéia de forma, semântica dá a idéia de conteúdo.

• sintaxe de uma linguagem de programação deve descrever todos os aspectos relativos à forma de construção de programas corretos na linguagem,

• semântica deve descrever o que acontece quando o programa é executado.

• análise está relacionada com sintaxe;• semântica deveria corresponder apenas à geração de

código

Page 36: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Na compilação a análise consiste em 3 partes:

• 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 que são sequências de caracteres tendo o sentido colectivo.

• A sua função básica é o reconhecimento e a classificação das estruturas elementares ou classes sintácticas das linguagens.

II . CompiladoresAnálise do programa fonteAnálise do programa fonte

Page 37: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Análise sintáctica ou hierárquica: • Na qual caracteres ou tokens são agrupados hierarquicamente

em colecções aninhadas com sentido colectivo.

• Verifica se a estrutura geral do texto ou programa fonte está correcta.

II . CompiladoresAnálise do programa fonteAnálise do programa fonte

Page 38: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Análise semântica: • Na qual são executadas certas paragens para assegurar que os

componentes de um programa são juntamente ajustados em sentido absoluto.

• Verifica se o programa fonte tem erros semânticos e reúne a informação dos tipos para a fase de gerador de código subsequente.

• Uma componente importante da análise semântica é a verificação do tipo.

II . CompiladoresAnálise do programa fonteAnálise do programa fonte

Page 39: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresFases de um compiladorFases de um compilador

Page 40: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresFases de um compiladorFases de um compilador

• Gerenciador da tabela de símbolos: • Uma função essencial de um compilador é registar os

identificadores usados no programa fonte e coleccionar informação sobre vários atributos de cada identificador.

• Uma tabela de símbolos é uma estrutura de dados contendo o registo de cada identificador, com campos para os atributos do identificador.

Page 41: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresFases de um compiladorFases de um compilador

• Tabela de códigos: • É uma estrutura criada pela análise semântica de um

compilador, que mantém registadas as linhas código intermediário geradas por algum tempo.

• Em geral as linhas de código geradas permanecem nesta tabela enquanto não estão totalmente preenchidas.

Page 42: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresFases de um compiladorFases de um compilador

• Detecção de erros e aviso do erro:• Cada fase pode encontrar erros. Porém, depois de

descobrir um erro, a fase tem de ocupa-se de alguma maneira com aquele erro, para que a compilação possa prosseguir.

• As fases de análise sintáctica e semântica normalmente tratam de uma grande fracção dos erros detectáveis pelo compilador.

Page 43: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresFases de um compiladorFases de um compilador

• Geração de código intermediária:• Depois da análise sintáctica e semântica, alguns

compiladores geram uma explícita representação intermediária do programa fonte.

• Podemos pensar nesta representação intermédia como um programa para uma máquina abstracta

Page 44: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresFases de um compiladorFases de um compilador

• Optimização do código:• Esta fase tenta melhorar o código intermédio, de forma a

que resulte num código de máquina mais rápido a executar.

• Geração do código:• A fase final do compilador é a geração de código alvo,

consistindo normalmente no restabelecimento no código máquina.

• Neste ponto, após o programa fonte ter sido analisado e aprovado, segundo a sua sintaxe, e livre de erros semânticos, o compilador tem condições de escrever um programa equivalente na linguagem alvo.

Page 45: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresFactores condicionantes da organização física dos Factores condicionantes da organização física dos

compiladorescompiladores

• Dividir o processo de compilação em diversas fases "lógicas" permite um melhor entendimento do processo como um todo e leva a uma implementação mais estruturada.

 • A eficiência e os recursos disponíveis na máquina hospedeira

do compilador influenciam de maneira decisiva um item importantíssimo na implementação de um compilador: o número de passos de compilação, para poder optimizar o tempo de compilação.

 

Page 46: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

II . CompiladoresOs compiladores e os Os compiladores e os

autómatosautómatos

• Os compiladores têm como base os autómatos.

• Dentro da área de Teoria das Linguagens Formais, encontram-se os conceitos de gramática e autómatos, que dão base para a maioria das técnicas utilizadas hoje para se implementar compiladores. Daqui vêm os principais conceitos utilizados pelos compiladores modernos.

• Um léxico deve reconhecer tokens, não produzi-los.

• A descrição de tokens de maneira a que estes possam ser reconhecidos é feita através de aceitadores finitos (autómato finito).

 

Page 47: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Fases de um CompiladorA Análise Léxica ou Scanner agrupa caracteres da linguagem fonte em grupos chamados itens léxicos (tokens). Geralmente, as classes à que pertencem esses itens são:

•PALAVRAS RESERVADAS : DO, IF, etc

•IDENTIFICADORES : x, num, etc

•SÍMBOLOS DE OPERADORES : <=, +, etc

•SÍMBOLOS DE PONTUAÇÃO : ( , ), ; , etc

•NÚMEROS : 1024, 105, etc

Por exemplo, em Pascal: begin A := 5 ; B := A * ( PESO + 102 ) end

Page 48: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• Por exemplo, considere o trecho de programa Pascal:

if x>0 then { x e' positivo }

modx := x

else { x e' negativo ou nulo }

modx := (-x)

Page 49: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara
Page 50: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara
Page 51: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

EX:. O analisador léxico do PASCAL

letra ° ( letra digito sublinhado )*,– os operadores °, , e * representam

respectivamente concatenação, união e repetição, (zero ou mais vezes) e

– letra, digito e sublinhado representam conjuntos (ou classes) de caracteres:

letra = { 'A', ...., 'Z', 'a', ... 'z' }digito = { '0', ..., '9' }sublinhado = { '_' }.

Page 52: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• FORTRAN (é mais complicado) não tem palavras reservadas, tem apenas palavras-chave, que também podem ser usadas como identificadores; além disso, FORTRAN permite também o uso de espaços dentro de identificadores e palavras-chave.

• Problema: a expressão DO 10 I = 5– que pode ser a parte inicial de um comando de atribuição

DO 10 I = 5.

em que a variável real DO10I recebe o valor real 5.,

Page 53: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

• ou pode ser o começo do comando de repetição,DO 10 I = 5, 20... 10 CONTINUE

• que especifica que os comandos entre o comando DO e o comando rotulado por 10 devem ser executados uma vez para cada valor de I = 5, 6, ..., 20.

Note que até que o ponto ou a vírgula sejam encontrados, não é possível decidir qual é a interpretação correta para DO10I.

Page 54: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Fases de um CompiladorA Análise Sintática (parser) agrupa os itens léxicos (tokens) em diversas unidades sintáticas, construindo uma árvore sintática:

Obs.: A árvore sintática mostra a estrutura gramatical de um programa. Cada um de seus nós representa uma unidade sintática.

Page 55: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Fases de um Compilador

• Caberia à análise sintática reconhecer a estrutura do trecho

if x>0 then modx := x else modx := (-x)

• identificando que se trata de um <comando>, no caso um <comando-if>,

• Composto pela palavra reservada if, seguida de uma <expressão>, seguida da palavra reservada then, etc.

• Os itens <expressão> e <atribuição> ainda podem ser decompostos em fragmentos menores.

Page 56: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Fases de um Compilador

Page 57: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

PARA PESQUISAR

Quase universalmente, a sintaxe das linguagens de programação é descrita por gramáticas livres de contexto, em uma notação chamada BNF (Forma de Backus-Naur ou ainda Forma ormal de Backus), ou em alguma variante ou extensão dessa notação. Essa notação foi introduzida por volta de 1960, para a descrição da linguagem Algol3.

Page 58: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Fases de um CompiladorTipos de Erros da Fase de Análise:Tipos de Erros da Fase de Análise:

- Erros léxicos: O "scanner" deve detectar erros léxicos que podem ser, por exemplo, o uso de caracteres não usados pela linguagem, ou nos inteiros com grandeza maior do que a máxima representada no computador;- Erros Sintáticos: O "parser" tem como tarefa o reconhecimento de erros sintáticos: construções do programa fonte em desacordo com as regras de formação de unidades sintáticas, como especificado pela gramática. Ex.: Na sequência A + * B, deve ser detectado um operador aritmético a mais.Obs: Após reconhecer um erro de sintaxe, o analisador deve emitir mensagem de erro adequada, e tratar ("recover") esse erro, isto é, continuar a análise do resto do programa, de forma que o erro comprometa o mínimo possível o processo de análise.

Page 59: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

Fases de um Compilador- Gerador de código intermediário usa a estrutura produzida

pelo "parser" para criar uma cadeia de instruções simples.

Muitos estilos de código intermediário são possíveis. Um estilo

comum usa instruções com um operador e um nº pequeno de

operandos;

- Otimização de Código (fase opcional): melhorar o código

intermediário tal que o programa objeto seja mais rápido e/ou

ocupe menos espaço. Sua saída é outro programa em código

intermediário que faz a mesma tarefa do original;

- Gerador de código: gera o programa objeto. O código é

gerado sempre para determinadas unidades sintáticas, sendo

utilizadas informações fornecidas pelo analista de contexto.

Page 60: Bibliografia 1. Aho V.A., Sethi R., Ulman D.J., Compiladores - Princípios, Técnicas e Ferramentas, tradução de Daniel de Ariosto Pinto - Ed. Guanabara

- O gerenciamento de tabelas ou "bookkeeping" é a porção do compilador que manipula os nomes usados pelo programa e registra informações essenciais sobre cada um deles, tal como seu tipo (inteiro, real, etc). A estrutura de dados usada para registrar essa informação é chamada Tabelas(s) de Símbolos.

- O manipulador de erros é ativado quando uma falha é detectada no programa fonte. Ele avisa o programador, fornecendo um diagnóstico claro e preciso, e torna possível a continuação do processo de análise. É desejável que sejam detectados todos os erros numa única compilação.

Fases de um Compilador