Compiladores. Fabio Mascarenhas

Documentos relacionados
Compiladores. Introdução

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Introdução à Programação

Compiladores - Gramáticas

Compiladores - Análise Léxica

Compiladores - Análise Léxica

Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38

Compiladores. Conceitos Básicos

Compiladores I Prof. Ricardo Santos (cap 1)

Linguagens de Programação Aula 3

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

Compiladores Análise Semântica

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Compiladores Ambiente de Execução

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Compiladores Análise Semântica

Projeto de Compiladores

Compiladores - Gramáticas

Conceitos de Linguagens de Programação

Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática

Introdução aos Compiladores

EA876 - Introdução a Software de Sistema

Compiladores 02 Analise léxica

Compiladores Ambiente de Execução

Compiladores Aula 1. Celso Olivete Júnior.

Noções de compilação

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison

Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17

Autômatos e Linguagens

Linguagens e Compiladores

Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

As fases de um compilador

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Conteúdo. Introdução a compiladores Tradução x Interpretação Processo de Compilação

Paradigmas de Programação

Programação de Computadores IV. Introdução a Linguagens de Programação Simone Martins SLIDES CEDIDOS POR BRUNO MARQUES 1

Paradigmas de Linguagem de Programação. Aspectos Básicos

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Projeto de Compiladores

Prof. Adriano Maranhão COMPILADORES

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação

As fases de um compilador

Como construir um compilador utilizando ferramentas Java

Questões de Paradigmas de Programação Matéria: Prova 1 4ª EDIÇÃO

Análise Léxica I. Eduardo Ferreira dos Santos. Março, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 31

COMPILAÇÃO. Ricardo José Cabeça de Souza

Compiladores. Análise Léxica

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Síntese. Prof. Geovane Griesang

Compiladores - JFlex. Fabio Mascarenhas

Compiladores - JFlex. Fabio Mascarenhas Monday, April 15, 13

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Compiladores - Autômatos

PROGRAMAÇÃO I. Introdução

Analisador Léxico parte II

Linguagens de Domínio Específico

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

Compiladores - Análise Preditiva

Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 12. Instituto de C

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 31. Instituto de C

Compiladores - Análise LL(1)

Linguagens de Programação Classificação

Informática I. Aula 9. Aula 9-17/05/2006 1

Compiladores. Análise Léxica

Compiladores - Análise SLR

Capítulo 1 Linguagens e processadores

Desenvolvimento de Aplicações Desktop

Compiladores. Introdução à Compiladores

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Transcrição:

Compiladores Fabio Mascarenhas 2017.1 http://www.dcc.ufrj.br/~fabiom/comp

Introdução Compiladores x Interpretadores Offline x Online Um compilador transforma um programa executável de uma linguagem fonte para um programa executável em uma linguagem destino O programa resultante deve ser, de alguma maneira, melhor que o original Um interpretador executa um programa executável, produzindo o resultado do programa A maior parte das técnicas que veremos nessa disciplina servem para ambos

Histórico Inicialmente os computadores eram programados diretamente em linguagem de máquina Não se dava muita importância ao software, ou à produtividade dos programadores! Em 1953 John Backus cria na IBM a primeira linguagem de alto nível, Speedcoding (interpretada, lenta, 10x-20x código de máquina) Em 1957 a IBM lança a primeira versão do compilador FORTRAN, o primeiro compilador moderno Projeto gerenciado pelo mesmo John Backus, começou em 1954 Em 1958 metade dos programas existentes para os mainframes IBM já eram escritos em FORTRAN

Histórico FORTRAN gerava código com desempenho similar aos programas escritos diretamente em linguagem de máquina A estrutura geral de um compilador moderno ainda se parece com a do primeiro compilador FORTRAN, embora o interior de todas as partes já tenha mudado desde então Uma enorme quantidade de pesquisa e desenvolvimento já foi feita desde então Muitas das técnicas que vamos ver nesse curso já são bem antigas (30-40 anos), mas a área ainda vai mudando Os desafios e o que era importante há 40 anos são diferentes dos desafios e do que é importante hoje

Estrutura Básica de um Compilador Cinco grandes fases Análise léxica, análise sintática, análise semântica, otimização e geração de Código As duas primeiras cuidam da sintaxe do programa, as duas intermediárias do seu significado, e a última da tradução para a linguagem destino As três primeiras fases formam o front-end do compilador, e as duas outras seu back-end

Front-end A função do front-end é extrair a estrutura do programa, e verificar sua corretude O front-end produz uma representação do programa como uma árvore sintática abstrata Caso o programa tenha erros que possam ser detectados em tempo de compilação, o front-end também produz mensagens apontando onde esses erros estão

Análise Léxica Primeiro passo do front-end: reconhecer tokens Tokens são as palavras do programa O analisador léxico transforma o programa de uma sequência de caracteres sem nenhuma estrutura para uma sequência de tokens Ex: if x == y then z = 1; else z = 2; Tokens: if, x, ==, y, then, z, =, 1, ;, else, z, =, 2, ;, EOF

Análise Léxica Normalmente o analisador léxico para uma linguagem é produzido mecanicamente a partir uma especificação léxica definida por expressões regulares Um gerador de analisador léxico é um compilador para a sua linguagem de especificação! Nesse curso vamos um gerador com uma linguagem de especificação parecida com a do analisador lex Mas vamos também ver como escrever um analisador léxico à mão

Análise Sintática O analisador sintático agrupa os tokens em termos sintáticos da linguagem Como sujeito, verbo, objeto, oração, período... Ex.: if x == y then z = 1; else z = 2; x == y é uma expressão relacional z = 1; e z = 2; são comandos de atribuição a frase em si á um comando if-then-else composto dessas três partes

Análise Sintática Também é comum se gerar mecanicamente um analisador sintático a partir de uma especificação da sintaxe da linguagem, sua gramática Novamente, um programa gerador de analisadores sintáticos é apenas outro compilador O resultado da análise sintática é uma árvore representando a estrutura do programa Pode ser concreta, codificando toda a estrutura sintática do programa, ou abstrata, codificando apenas o essencial

Análise Semântica Agora que sabemos a estrutura do programa, podemos tentar entender seu significado para detectar erros A análise semântica também procura eliminar ambiguidades em relação aos termos do programa Ex: int x = 0; while(x < 10) { int x = 20; print(x); } Quando a linguagem permite, a análise semântica também detecta inconsistências entre os tipos das variáveis e seus usos Ex: int x = 0; if(x < 5) x = foo ;

Otimização Transformação automática dos programas de modo que eles usem menos tempo/memória/bateria/rede Em geral, usem menos recursos e tenham melhor desempenho Mistura de análise e síntese, e raramente exato, mas baseado em heurísticas Requer muita atenção quanto à corretude; por ex., x = y * 0 e x = 0 são equivalentes? Depende!

Geração de Código Como mapear o programa na linguagem destino Dificuldade varia bastante, a depender das características das linguagens fonte e destino, e de quão distantes elas estão Ex.: if x == y then z = 1; else z = 2; Em linguagem de máquina x86, assumindo que conseguimos mapear x no registrador EAX, y no EBX e z no ECX, o código acima pode virar: cmp eax, ebx jne l1 mov ecx, 1 jmp l2 l1: mov ecx, 2 l2:

Uma linguagem de comandos simples Tokens: numerais inteiros, identificadores, +, -, (, ), =, ;, print Gramática PROG -> CMD ; PROG PROG -> CMD -> id = EXP CMD -> print EXP EXP -> EXP + AEXP EXP -> EXP - AEXP EXP -> AEXP AEXP -> id AEXP -> num AEXP -> ( EXP )