Compiladores – IF688 Professor: André Santos

Slides:



Advertisements
Apresentações semelhantes
gerador de código intermediário
Advertisements

1.3.2 – Linguagem Assembly Um programa em linguagem de máquina sofre de total falta de clareza O programa é uma sequência de linhas numeradas Cada linha.
Introdução à Ciência da Computação Linguagens de Programação.
II – Análise léxica DEI lex: linguagem de especificação para analisadores léxicos Implementação de simuladores de autómatos finitos Bibliografia aconselhada:
I - Noções dum compilador Partes dum compilador Ferramentas de construção de compiladores Bibliografia aconselhada: –Aho, Sethi e Ullman – Cap. 1 LFA 1999/2000.
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 32 Departamento de Informática Centro.
Linguagem de Montagem Visão geral.
O Essencial sobre Linguagens de Programação Luís Caires Maio 2005.
Software Básico Silvio Fernandes
Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G.
Prof. Heloise Manica Paris Teixeira
INTRODUÇÃO À PROGRAMAÇÃO
Ferramentas Programação
Curso Sistemas de Informação Disciplina: Arquitetura de Software
Lex e Yacc.
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.
Relações em uma Gramática
Linguagem de Prog. e Programas
Tradutores de Linguagens
Linguagens de Programação
Aula 2 Aspectos Preliminares
Laboratório de Programação de Computadores I
Prof. Msc. Raul Paradeda Aula 2 Introdução
O Portal do Estudante de Computação
JAVA: Conceitos Iniciais
PROGRAMAÇÃO I UNIDADE 1.
Aula prática - análise contextual
Conceitos de Linguagem de Programação
Flávio Melo Gabriel Fornari
Linguagem de programação I A
O Processo de Compilação
Teoria e Implementação de Linguagens Computacionais – IF688
Avaliação da Linguagem de Programação
Estudo dos Conceitos e Paradigmas de Programação
Paradigmas de Linguagens de Programação Linguagem Imperativa 2
Geração de Código Teoria e Implementação de Linguagens Computacionais – IF688 Jobson Ronan Jeronimo da Silva
Análise Léxica Primeira fase de um compilador
02/08/2011 Professor Leomir J. Borba- –
Análise Léxica.
Analise sintática aula-07-analise-sintática.pdf.
Geração de Código aula-12-geração-de-código.pdf.
Paradigma funcional.
Capítulo VIII Ambientes de Execução
Paradigmas de Linguagens de Programação
Técnicas de Programação - TPR
Analise Semântica aula-10-analise-semântica.pdf.
Analisador Léxico Prof. Alexandre Monteiro
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Projeto de Linguagens de Programação
Processadores de Linguagens
Tradução Dirigida por Sintaxe
Aula 1 – Profª Danielle Costa
Back-End Compilação aula-11-back-end.pdf.
Linguagens de Programação Introdução Prof. Renato Melo.
Revisão Compiladores – AP1
Algoritmos e Programação I
COMPILADORES 04 Prof. Marcos.
Geração de Código Fase final do compilador
Estudos de Linguagens de Programação - Introdução
Sintaxe de uma Linguagem
SISTEMAS DE INFORMAÇÃO
Faculdade Pernambuca - FAPE
tópicos 01. Compiladores 02. Tradutores 03. Linguagens de Programação
Módulo II Capítulo 1: Orientação a Objetos
Análise Semântica e Representação Intermédia
Compilador Software que traduz o texto (linguagem fonte) que representa um programa para código máquina(linguagem alvo) capaz de ser executado pelo.
Influencias sobre o Projeto da Linguagem
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
Módulo I – Softwares: Linguagens de Programação Prof.: Rogério Morais.
COMPILADORES 02 Prof. Marcos. COMPILADORES Do Programa à Execução Computadores das mais variadas arquiteturas têm funcionamento:
Transcrição da apresentação:

Compiladores – IF688 Professor: André Santos Home page do curso: http://www.cin.ufpe.br/~if688

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. Geradores e analisadores de código.

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, arquitetura, engenharia de software.

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

Linguagens Linguagem fonte: C, Pascal, Java, Fortran, etc. Linguagem destino: linguagem de máquina (assembler) de um processador, de uma máquina virtual (e.g. Java ou .NET), ou qualquer outra linguagem (e.g. C).

Processadores de Linguagens: Compilador Programa fonte Compilador Programa destino

Execução de um programa Programa destino entrada saída

Processadores de Linguagens: Interpretador Programa fonte Interpretador saída entrada Normalmente mais lento que um compilador; mas tende a poder dar mensagens de erro melhores, por executar o programa fonte linha por linha.

Compilador Híbrido Programa fonte Tradutor Programa intermediário Normalmente mais lento que um compilador; mas tende a poder dar mensagens de erro melhores, por executar o programa fonte linha por linha. Programa intermediário Máquina Virtual saída entrada

Sistema de processamento de uma linguagem Programa fonte assembler preprocessador Código objeto (relocável) Programa fonte modificado Linker resolve endereços de nomes externos não resolvidos dentro do próprio módulo; Loader carrega o programa na memória Linker / Loader Bibliotecas / código objeto compilador Código objeto (executável) Programa em assembler

Programas auxiliares do processo de compilação Preprocessadores: processam macros, incluem de arquivos, suportam compilação condicional e extensão de linguagens. 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.

Programas auxiliares do processo de compilação (cont.) Carregadores (loaders) e linkeditores (linkers) Ajustam o código relocável, resolvem referências externas.

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 da representação intermediária.

Fases de um compilador stream de caracteres árvore sintática Analisador léxico Ger. de código intermediário stream de tokens representação intermediária Analisador sintático Otimizador de código Todos interagem com a tabela de símbolos árvore sintática representação intermediária Analisador semântico Gerador de código Código de máquina

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

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.

Programas baseados em análise Editores de programa dirigidos à sintaxe (comuns nos IDEs, como no Eclipse e Visual Studio) Pretty-printers Interpretadores

Exemplo do processo de compilação

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.

Exemplo position = initial + rate * 60 <identificador, 1> <=> <identificador, 2> <+> <identificador, 3> <*> <number, 60>

Tabela de Símbolos identificador tipo … 1 position 2 initial 3 rate

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.

Árvore Sintática position = initial + rate * 60 = + <id,1>

Análise semântica Verifica o programa em relação a possíveis erros semânticos e guarda informações adicionais

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.

Análise Semântica = <id,1> + <id,2> * <id,3> Supondo que os identificadores são do tipo float e 60 é um inteiro, a conversão (coerção) é necessária. <id,3> inttofloat 60

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.

Código intermediário - exemplo t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3

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, tamanho do código executável etc.

Otimização de código - exemplo t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 t2 = id3 * 60.0 id1 = id2 + t2

Geração de código Realiza a alocação de registradores (se necessária) e a tradução do código intermediário para a linguagem-destino.

Geração de código LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1

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 parâmetros e tipo do resultado.

Tabela de Símbolos identificador tipo … 1 position 2 initial 3 rate

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 necessários pelo menos dois passos.

Separação entre front-end e back-end para criação de múltiplos compiladores Pascal Fortran C# C Front-end Front-end Front-end Front-end código intermediário Back-end x86

Separação entre front-end e back-end para criação de múltiplos compiladores Pascal Front-end código intermediário Back-end Back-end Back-end Back-end ARM MIPS x86 .NET

Separação entre front-end e back-end para criação de múltiplos compiladores Pascal Fortran C# C Front-end Front-end Front-end Front-end código intermediário Back-end Back-end Back-end Back-end ARM MIPS x86 .NET

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) Toolkits de construção de compiladores

Contexto Histórico Demanda por linguagens de mais alto nível que linguagem de máquina e assembler. Nos anos 1950, compiladores eram programas notadamente difíceis de se escrever. Avanço teórico e de técnicas e ferramentas de implementação tornaram possível implementar compiladores muito mais facilmente. Assemblers no início dos anos 50; Macro Assemblers; Fortran, na segunda metade dos anos 50, juntamente com Cobol e Lisp.

Classificações: Gerações Linguagens de máquina Linguagens de montagem (Assembly languages) Fortran, Cobol, Lisp, C, C++, C#, Java SQL, Postscript (Domain Specific Languages) Assemblers no início dos anos 50; Macro Assemblers; Fortran, na segunda metade dos anos 50, juntamente com Cobol e Lisp.

Classificações: Paradigma Imperativo “como” Conceito de estado e comandos que mudam o estado C, C++, C#, Java Declarativo “o quê” ML, Haskell, Prolog

Classificações Von Neumann: C, Fortran, Pascal Orientadas a Objetos: Simula 67, Smalltalk, C++, C#, Java, Ruby Scripting Languages: Awk, JavaScript, Perl, PHP, Python, Ruby, Tcl Chapter 1, till section 1.3 Read 1.6 too.

Fundamentos de Linguagens de Programação Estático x Dinâmico: Estático: em tempo de compilação Dinâmico: em tempo de execução Chapter 1, till section 1.3 Read 1.6 too.

Fundamentos de Linguagens de Programação Ambientes e Estados ambiente estado Chapter 1, till section 1.3 Read 1.6 too. locais (variáveis) nomes valores

Fundamentos de Linguagens de Programação Escopo estático e estrutura de Blocos Controle de Acesso Explícito public, private, protected Chapter 1, till section 1.3 Read 1.6 too.

Fundamentos de Linguagens de Programação Escopo Dinâmico Exemplo: macros em C #define a (x+1) int x = 2; void b() {int x = 1; printf(%d\n”, a); } void c() {printf(“%d\n”, a); } void main() { b(); c(); } Chapter 1, till section 1.3 Read 1.6 too.

Fundamentos de Linguagens de Programação Mecanismos de passagem de parâmetro Por valor (call by value) Por referência (call by reference) Por nome (call by name) Por necessidade (call by need) Chapter 1, till section 1.3 Read 1.6 too.

Fundamentos de Linguagens de Programação Sinônimos (Aliasing) Chapter 1, till section 1.3 Read 1.6 too.