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

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

Compiladores I Prof. Ricardo Santos (cap 1)

Compiladores. Conceitos Básicos

Introdução aos Compiladores

Introdução parte II. Compiladores. Mariella Berger

Compiladores. Introdução à Compiladores

Projeto de Compiladores

Conceitos de Linguagens de Programação

Compiladores. Introdução

Introdução à Programação

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

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Noções de compilação

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Noções de compilação

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

Autômatos e Linguagens

Projeto de Compiladores

Compiladores Aula 1. Celso Olivete Júnior.

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

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

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

FACULDADE LEÃO SAMPAIO

PROGRAMAÇÃO I. Introdução

Linguagens de Programação Classificação

Paradigmas de Programação

II.1 Conceitos Fundamentais. Uma delas é programar o =>

CP Compiladores I Prof. Msc.. Carlos de Salles

Compiladores. Geração de Código Objeto

Introdução à Computação: Máquinas Multiníveis

Linguagens de Programação Aula 3

Linguagens de Programação

Introdução à Computação

Introdução à Computação

Existem três categorias principais de linguagem de programação: linguagem de máquina, linguagens assembly e linguagens de alto nível.

Universidade Católica de Pelotas Bacharelado em Ciência da Computação Linguagens Formais e Autômatos TEXTO 6 Introdução à Compilação

EA876 - Introdução a Software de Sistema

16. Compilação no Linux

Linguagens e Compiladores

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

Sistema Computacional

Como construir um compilador utilizando ferramentas Java

Programação de Computadores:

INE5318 Construção de Compiladores. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Prof. Antonio Almeida de Barros Jr. Prof. Antonio Almeida de Barros Junior

As fases de um compilador

Desenvolvimento de Aplicações Desktop

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

Compiladores e Computabilidade

Organização e Arquitetura de Computadores I

FACULDADE ZACARIAS DE GÓES SISTEMAS DE INFORMAÇÃO ADRIEL ALMEIDA CAFÉ PROCESSO DE COMPILAÇÃO

As fases de um compilador

1.1 Linguagens de Programação

Introdução. Tradutores de Linguagens de Programação

Procedimentos. Sistemas de Computação

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

Compiladores. Prof. Bruno Moreno

Especificações Gerais do Compilador e Definição de FRANKIE

Analisador Léxico parte II

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

Ambiente de desenvolvimento

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

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

Sistemas Operacionais

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.

Infraestrutura de Hardware. Funcionamento de um Computador

Programação I A Linguagem C. Prof. Carlos Alberto

3. Linguagem de Programação C

CAP. VII GERAÇÃO DE CÓDIGO

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS

Tecnólogo em Análise e Desenvolvimento de Sistemas. Sistemas Operacionais (SOP A2)

Memória. Arquitetura de Von Neumann. Universidade do Vale do Rio dos Sinos Laboratório I Prof.ª Vera Alves 1 CPU. Unidade de controle ULA

AULA 03: FUNCIONAMENTO DE UM COMPUTADOR

QUESTÃO 1 (0,6 ponto) Classifique os processadores de linguagens com relação aos tipos das linguagens-fonte e objeto.

Capítulo 1. Aspectos Preliminares

Conceitos básicos sobre computadores (continuação)

INE5622 INTRODUÇÃO A COMPILADORES

Compiladores. Fabio Mascarenhas

Aula 2 - Programação de Computadores - CI208 1/21

Introdução a Ciência da Computação

Introdução à Computação

OFICINA DA PESQUISA PROGRAMAÇÃO APLICADA À CIÊNCIA DA COMPUTAÇÃO

Métodos de implementação de linguagens. Kellen Pinagé

CAP. VII GERAÇÃO DE CÓDIGO

Introdução (Aula 2) Introdução Arquitetura de Hardware. Organização Estruturada de Computadores. Introdução Conceitos (2) Introdução Conceitos (1)

Linguagens de Programação

Introdução. (Aula 2) Organização Estruturada de Computadores

Introdução à Programação de Computadores Fabricação Mecânica

Breve Histórico & Conceitos Básicos

Lic. Engenharia de Sistemas e Informática

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

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Ferramenta para Desenvolvimentode Sistemas EmbarcadosUtilizando Linguagem de Alto Nível p.1/25

Puca Huachi Vaz Penna

Aula teórica 7. Preparado por eng.tatiana Kovalenko

9. Software de Sistema - Montadores (capítulo 9 do livro texto)

Compiladores. Análise Léxica

Primeiro Trabalho de POO Emulador para o Processador Winter

Transcrição:

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Introdução geovanegriesang@unisc.br

Processadores de linguagem Linguagens de programação são notações para se descrever computações para pessoas e máquinas. Então, todos os softwares executados em todos os computadores foram escritos em alguma linguagem de programação. Mas, antes que possa rodar, um programa primeiro precisa ser traduzido p/ um formato que lhe permita ser executado em um computador. Os compiladores fazem essa tradução. 2

Processadores de linguagem Compilador é um programa de computador que lê um programa escrito em uma linguagem (linguagem fonte) e a traduz em um programa equivalente em outra linguagem (linguagem objeto). Aho, Sethi, Ullman. Função: relatar quaisquer erros no programa fonte detectados durante este processo de tradução. 3

Histórico Nos anos 50, os compiladores eram programas de difícil escrita, tanto os próprios compiladores quanto os programas fonte. Aumentou a demanda por linguagens de mais alto nível que linguagens de máquina e Assember. Portanto, com o passar dos anos, o avanço teórico, de técnicas e ferramentas de implementação tornou possível o desenvolvimento compiladores com muito mais facilidade. 4

Compilador Programa fonte Compilador Entrada Programa objeto Saída Programa objeto é um programa de máquina executável. Esse programa objeto pode ser chamado pelo próprio usuário para processar entradas e produzir saída. 5

Interpretador Programa fonte Entrada Interpretador Saída Interpretador: tipo comum de processador de linguagem. Em vez de produzir um programa objeto como resultado da tradução, esse interpretador executa diretamente as operações especificadas no programa fonte sobre as entradas fornecidas pelo usuário. 6

Compilador x Interpretador O programa objeto em uma linguagem de máquina produzido por um compilador normalmente é muito mais rápido no mapeamento de entrada para saídas do que um interpretador. Porém, um interpretador frequentemente oferece um melhor diagnóstico de erro do que um compilador, pois executa o programa fonte instrução por instrução. 7

Compilador híbrido Programa fonte Tradutor Código intermediário Entrada Máquina virtual 8

Compilador híbrido Sendo assim, os processadores da linguagem Java combinam compilação e interpretação. Um programa em Java pode ser primeiro compilado p/ um forma intermediária, chamada bytecodes. Os bytecodes (ou códigos de bytes) são interpretados por uma máquina virtual. Como um benefício dessa combinação, os bytecodes compilados em uma máquina podem ser interpretados em outra máquina, talvez por meio de uma rede. 9

Compilador híbrido Para conseguir um processamento mais rápido, das entradas para saídas, alguns compiladores Java (justin-time), traduzem os bytecodes para uma linguagem de máquina, imediatamente antes de executarem o programa intermediário para processar a entrada. Just-in-time: é um tradutor que converte, em tempo de execução, instruções de um formato para outro, como por exemplo, de bytecode para código de máquina. Esta técnica é normalmente utilizada para incrementar o desempenho de programas "executados" - na verdade, interpretados - em máquinas virtuais. 10

Processo de compilação Além do compilador, vários outros programas podem ser necessários p/ a criação de um programa objeto executável. Um programa fonte pode ser subdivido em módulos armazenados em arquivos separados. Pode-se confiar a tarefa de coletar o programa fonte a um programa separado, chamado pré-processador, que por sua vez, pode expandir macros em comandos na linguagem fonte. 11

Processo de compilação Programa fonte Programa objeto em Assembler Pré-processamento Montador/Assembler Programa fonte modificado Código de máquina (relocável) Compilador Arquivos de bibliotecas Arquivos objeto relocáveis Editor de ligação / carregador Código de máquina alvo (executável) 12

Processo de compilação Então, o compilador recebe na entrada o programa fone modificado e pode produzir como saída um programa em uma linguagem simbólica, conhecida como assembly, considerada mais fácil de ser gerada como saída e mais fácil de depurar. Essa linguagem simbólica é então processada por um programa chamado montador (assembler), que produz o código de máquina realocável como sua saída. 13

Processo de compilação Os programas grandes normalmente são compilados em parte, de modo que o código de máquina realocável pode ter de ser ligado a outros arquivo objetos realocáveis e a arquivos de biblioteca para formar o código que realmente é executado na máquina. Editor de ligação (linker) resolve os endereços de máquina externos, onde o código em um arquivo pode referir-se a uma localização em outro arquivo. Carregador (loader) reúne então todos os arquivos objeto executáveis na memória para execução. 14

Processo de compilação Destino Pré-processamento Montador/Assembler Origem Compilador Editor de ligação / carregador 15

Compilador - tarefas Nesse processo de tradução, há 2 tarefas básicas a serem executadas por um compilador: Análise (front-end), em que o texto de entrada (na ling. fonte) é examinado, verificado e compreendido. - Análise léxica, sintática e semântica. Síntese (back-end), ou geração de código, em que o texto de saída (na linguagem objeto) é gerado, de forma a corresponder ao texto de entrada. 16

Compilador - fases Código fonte Analisador léxico Análise Analisador sintático Gerador tabela de símbolos Analisador semântico Gerador de código intermediário Otimizador de código Tradutor de erros Síntese Gerador de código Código alvo 17

Etapa de análise de um compilador - Cria representações intermediárias do programa - Verifica presença de certos tipos de erros Análise léxica (scanner ou scanning): organiza os caracteres e os agrupa em símbolos (tokens). Entrada: Fluxo de caracteres. Saída: Fluxo de símbolos. Símbolos: Palavras reservadas, identificadores de variáveis/procedimentos, operadores, pontuação,... 18

Análise léxica Exemplo: montante := saldo + taxa_de_juros * 30; São identificados os seguintes tokens: Identificador montante Símbolo de atribuição := Identificador saldo Símbolo de adição + Identificador taxa_de_juros Símbolo de multiplicação * Número 30 19

Análise léxica Exemplo: montante := saldo + taxa_de_juros * 30; <identificador, 1>, <:=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <número, 30> Tabela de símbolos Nome Tipo 1 montante - 2 Saldo - 3 Taxa_de_juros - 20

Análise léxica A tabela de símbolos é atualizada em várias etapas da compilação. - Estrutura de dados para guardar identificadores e informações sobre eles: - Tipo do identificador. - Escopo: onde o identificador é 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. 21

Análise léxica Eliminação de alguns elementos, como espaços em branco, marcas de formatação e comentários. O projetista do compilador caracteriza o analisador léxico através de Expressões Regulares (ER), que são usadas no reconhecimento. Foco: Gramaticas Livres de Contexto (GLC). A geração do analisador léxico é automática a partir da definição das ERs. Ferramentas FLEX e Lex para a geração automática de scanners. 22

Análise sintática (Parser) Agrupa símbolos em unidades sintáticas. Exemplo: Os 3 símbolos A+B podem ser agrupados em uma estrutura chamada de expressão. Estas expressões podem ser agrupados para formar comandos ou outras unidades. A partir dos tokens, cria-se uma estrutura em árvore (árvore sintática) que, por sua vez, representa a estrutura gramatical do programa. 23

Análise sintática (Parser) Gramatica Livre de Contexto (GLC) é usada para definir a estrutura do programa reconhecida por um parser. Exemplo: montante := saldo + taxa_de_juros * 30; := montante + saldo * taxa_de_juros 30 24

Análise sintática (Parser) Exemplo: montante := saldo + taxa_de_juros * 30; Comando := Identificador Expressão montante + Expressão Expressão * Identificador saldo Expressão Identificador taxa_de_juros Expressão Número 30 25

Análise semântica Procura possíveis erros semânticos e armazena informações contextuais adicionais. Verifica se as estruturas sintáticas, embora corretas sintaticamente, possui um significado admissível na linguagem. Exemplo: Não é possível representar em gramática livre de contexto uma regra como todo identificador deve ser declarado antes de ser usado. 26

Análise semântica Um importante componente é a checagem de tipos. Utiliza informações coletadas anteriormente e as armazena na tabela de símbolos. Exemplo: x := x + 3.0; O exemplo está sintaticamente correto, mas pode estar semanticamente errada, dependendo do tipo de x. 27

Análise semântica Saída: Árvore de Parse anotada. := := montante + montante + saldo * saldo * taxa_de_juros 30 taxa_de_juros Inttoreal Conversão de inteiro para real inserida pela análise semântica. 28

Etapa de síntese de um compilador - Síntese: constrói o programa destino a partir de representações intermediárias. - Gerador de código intermediário: Usa estruturas produzidas pelo analisador sintático e verificadas pelo analisador semântico p/ criar uma sequencia de instruções simples. - Está entre a linguagem de alto nível e a de baixo nível. 29

Gerador de código intermediário Uma popular linguagem intermediária é conhecida como código de três endereços. Considera-se apenas um acumulador. Exemplo: x := a + b * c; Traduzir em: t1 := b * c; t2 := a + t1; x := t2; 30

Gerador de código intermediário Toda operação aritmética (binária) gera 3 instruções. Para t1 := b*c Carga do primeiro operando no acumulador: load b Executa a operação correspondente com o segundo operando, deixando o resultado no acumulador: mult c Armazena o resultado em uma nova variável temporária: store t1 31

Gerador de código intermediário Para t2 := a + t1: load a; add t1; store t2; Um comando de atribuição gera sempre duas instruções. Para x:= t2 Carrega o valor da expressão no acumulador: load t2 Armazena o resultado na variável: store x 32

Gerador de código intermediário P/ o comando de atribuição x := a + b * c, é gerado o código intermediário: 1. Load b { t1 := b * c } 2. Mult c 3. Store t1 4. Load a { t2 := a + t1 } 5. Add t1 6. Store t2 7. Load t2 8. Store x { x := t2 } 33

Otimizador de código Independente de máquina. Melhora o código intermediário de modo que o programa objeto seja menor (ocupe menos espaço de memória) e/ou mais rápido (tenha tempo de execução menor). A saída é um novo código intermediário: load b; mult c; add a; store x; 34

Gerador de código Produz o código objeto final (a partir do código intermediário), ou seja, é última fase da compilação. Toma decisões com relação à: Alocação de espaço p/ os dados do programa; Seleção da forma de acessá-los; Definição de quais registradores serão usados. Projetar um gerador código que produza programas objeto eficientes é uma das tarefas mais difíceis no projeto de um compilador. 35

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Obrigado!! geovanegriesang@unisc.br