Compiladores - Introdução. O que é um Compilador? “Um compilador é um programa que lê um programa escrito em uma linguagem (linguagem fonte) e a traduz.

Slides:



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

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.
Linguagem de Montagem Visão geral.
Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G.
Geração de Código aula-12-geração-de-código.pdf.
Faculdade Pernambuca - FAPE
Compilador Software que traduz o texto (linguagem fonte) que representa um programa para código máquina(linguagem alvo) capaz de ser executado pelo.
IF688 – Análise Sintática. Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up.
Fundamentos de Sistemas Operacionais Aula 2 Princípios de Programação Prof. Belarmino.
Capítulo 10 Conjuntos de instruções: Características e funções William Stallings Arquitetura e Organização de Computadores 8 a Edição © 2010 Pearson Prentice.
Linguagens de Programação Conceitos e Técnicas Amarrações Prof. Isabel Cafezeiro
Administração de Sistemas Operacionais 1 -Windows Processos Curso Técnico em Redes de Computadores Prof. Emerson Felipe.
Como funciona o processador Nomes: Fernando, Maurício, William Turma: 1J-1PC1 Disciplina: Fundamentos da Computação Curso: Técnico em Programação de Computadores.
Pseudocódigo É a técnica na construção de algoritmos mais próxima de uma linguagem de programação. Estrutura básica: Algoritmo [Variáveis:, : ] Início.
ARQUITETURA AULA 3 Prof. Luiz Ricardo Lima 2º sem de 2016.
Douglas Matheus de Souza Prof. Marcel Hugo, Mestre - Orientador.
Algoritmos e Programação utilizando Visualg
Estruturas de Dados Aula 2: Estruturas Estáticas
Projeto de Compiladores
PSI3441 – Arquitetura de Sistemas Embarcados
Estruturas de Dados Aula 1: Introdução e conceitos básicos
NEANDERWin - Simulador
Construção de Compiladores
Teoria da Computação Prof. Msc. Ricardo Loiola
Aspectos de Interrupção
INSTITUTO FEDERAL DO CEARÁ Mauro Oliveira
Computador MIPS Organização básica e conjunto de instruções.
Introdução ao VisuALG Prof. Andrew Rodrigues
GERAÇÃO DE CÓDIGO PARA A MÁQUINA VIRTUAL DE RÓTULOS
Introdução a Linguagem Java
Programação em C Aula 2.
Prof. Wellington Franco Sub-Rotinas:Funções e Procedimentos
3.1 Classes e Objetos Em um programa orientado a objetos normalmente existem vários objetos de um mesmo tipo. Por exemplo, um programa de controle de.
Prof. Wellington Franco
Representação de um Algoritmo na Forma de Pseudocódigo
Estrutura de dados Pilhas e filas
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
LINGUAGENS DE PROGRAMAÇÃO
FUNDAMENTO DE PROGRAMAÇÃO
Instruções.
Introdução instrumental às Linguagens Formais
Kroton Educacional Universidade uniderp (Unidade Matriz)
Arquitetura e organização de computadores
CREATED BY RAFAEL S. T. VIEIRA
Algoritmos e Técnicas CEFET/RN.
Introdução à Computação
Níveis de Abstrações TANENBAUM:
COMPILADORES 06 Prof. Marcos.

Análise Sintática Recursiva e Preditiva
Tecnologia da Informação Visão Geral sobre Informática
Introdução à Computação
ELEMENTOS DE ORGANIZAÇÃO DE COMPUTADORES :
Programação Estruturada Aula 1 Prof. Jorge Barreto Julho 2018.
Linguagem de Programação
Traduções Dirigidas por Sintaxe
Programação Orientada a Objetos
Arquitetura de Computadores
Instalação e Manutenção de Computadores Técnico em Informática MAI1
Professora Roberta Bonamichi Guidi Garcia
Linguagem de Programação I
Computação Eletrônica Vetores e Matrizes
PSI3441 – Arquitetura de Sistemas Embarcados
Organização de um Computador
Diêgo Santiago, Leila Soriano e Patrícia Lustosa
Conjunto de instruções
Algoritmos.
Análise Sintática (parte 1) “Pois o salário do pecado é a morte, mas o dom gratuito de Deus é a vida eterna em Cristo Jesus, nosso Senhor.” (Romanos 6:23)
Aula 2 Professores: Conteúdo: Dante Corbucci Filho
Transcrição da apresentação:

Compiladores - Introdução

O que é um Compilador? “Um compilador é um programa que lê um programa escrito em uma linguagem (linguagem fonte) e a traduz em um programa equivalente em outra linguagem (linguagem alvo).” Aho, Sethi, Ullman.

O que é um Compilador? Nesse processo de tradução, há duas tarefas básicas a serem executadas por um compilador: ◦ Análise, em que o texto de entrada (na linguagem fonte) é examinado, verificado e compreendido  Análise léxica, sintática e semântica ◦ Síntese, 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

É possível representar completamente a sintaxe de uma LP através de uma gramática sensível ao contexto. Mas como não existem algoritmos práticos para tratar essas gramáticas, a preferência recai em usar gramáticas livres de contexto. Deixa-se para a análise semântica a verificação de todos os aspectos da linguagens que não se consegue exprimir de forma simples usando gramáticas livres de contexto.

A implementação de reconhecedores de linguagens regulares (autômatos finitos) é mais simples e mais eficiente do que a implementação de reconhecedores de linguagens livres de contexto (autômatos de pilha). Nesse caso, é possível usar expressões regulares para descrever a estrutura de componentes básicos das LP, tais como identificadores, palavras reservadas, literais numéricos, operadores e delimitadores, etc. Essa parte da tarefa de análise (análise léxica) é implementada separadamente, pela simulação de autômatos finitos.

Compiladores – Separando em partes Um dos modelos possíveis para a construção de compiladores faz a separação total entre o frontend, encarregado da fase de análise, e o back-end, encarregado da geração de código, de forma que ◦ O front-end e back-end se comunicam apenas através da representação intermediária ◦ O front-end depende exclusivamente da linguagem fonte; ◦ O back-end depende exclusivamente da linguagem destino. Simplifica a implementação de novos compiladores ◦ Front-end específico para cada linguagem ◦ Back-end específico para a arquitetura alvo 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, de forma que ◦ O front-end e back-end se comunicam apenas através da representação intermediária ◦ O front-end depende exclusivamente da linguagem fonte; ◦ O back-end depende exclusivamente da linguagem objeto. Verificador de Tipos Parser Desugarer Sintaxe Core CoreToSTG Sintaxe STG Gerador de IL Código MSIL (Texto) ILDASM Gerador GHC Código Assembly / Código C Assembler / Compilador C Código Nativo CorePrinter Arquiv o Core PhxSTGCompiler JIT Código Nativo Arquivo Haskell ' Otimizações Assembly MSIL Front-end Back-end

Compiladores - Fases Conjunto de alterações feitas no código as quais são responsáveis por uma atividade específica do processo de compilação ◦ Análise Léxica (scanner) ◦ Análise Sintática (parser) ◦ Análise Semântica ◦ Otimização ◦ Geração de código Analisador léxico Analisador sintático Analisador semântico Gerador de código intermediário Otimizador de código Gerador de código código fonte código alvo Tratador de erros Gerador tabela de símbolos

Análise Léxica Também chamada de scanner Agrupa caracteres em símbolos (ou tokens) Entrada: fluxo de caracteres Saída: fluxo de símbolos Símbolos são: ◦ Palavras reservadas, identificadores de variáveis e procedimentos, operadores, pontuação,... Uso de expressões regulares no reconhecimento Lex/Flex são ferramentas que geram scanners.

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

Análise Sintática Também chamada de parser Agrupa símbolos em unidades sintáticas Ex.: os 3 símbolos A+B podem ser agrupados em uma estrutura chamada de expressão. Expressões depois podem ser agrupados para formar comandos ou outras unidades. Saída: representação árvore de parse do programa Gramática livre de contexto é usada para definir a estrutura do programa reconhecida por um parser Yacc/Bison são ferramentas para gerar parsers

Análise Sintática Comando Expressão Identificador Expressão := + * Identificador montante saldo taxa_de_juros Número 60 Árvore gerada para: montante := saldo + taxa_de_juros * 60

Análise Semântica Verifica se estruturas sintáticas, embora corretas sintaticamente, têm significado admissível na linguagem. Por exemplo, não é possível representar em uma gramática livre de contexto uma regra como “todo identificador deve ser declarado antes de ser usado“ Um importante componente é checagem de tipos. Utiliza informações coletadas anteriormente e armazenadas na tabela de símbolos Considerando “A + B”, quais os possíveis problemas semânticos? Saída: árvore de parse anotada

Análise Semântica montante+ * saldo taxa_de_juros * 60 montante+ * saldo taxa_de_juros * inttoreal Conversão de inteiro para real inserida pela análise semântica

Gerador de Código Intermediário Usa as estruturas produzidas pelo analisador sintático e verificadas pelo analisador semântico para criar uma seqüência de instruções simples (código intermediário) Está entre a linguagem de alto nível e a linguagem de baixo nível

Gerador de Código Intermediário Considere que temos um único registrador acumulador. Considere o comando de atribuição x := a + b * c pode ser traduzido em: t1:=b*c t2:=a+t1 x:=t2 Pode-se fazer um gerador de código relativamente simples usando regras como:

Gerador de Código Intermediário Toda operação aritmética (binária) gera 3 instruções. Para b*c 1.Carga do primeiro operando no acumulador load b 1.Executa a operação correspondente com o segundo operando, deixando o resultado no acumulador mult c 1.Armazena o resultado em uma nova variável temporária store t1 Um comando de atribuição gera sempre duas instruções. Para x:= t2 1.Carrega o valor da expressão no acumulador load t2 ◦ Armazena o resultado na variável store x

Para 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 }

Otimizador de Código Independente da 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 do otimizador de código é um novo código intermediário

Otimizador de Código 1. Load b 2. Mult c 3. Store t1 4. Load a 5. Add t1 6. Store t2 7. Load t2 8. Store x 1. Load b 2. Mult c 3. Add a 4. Store x

Otimizador de Código

Gerador de Código Produz o código objeto final Toma decisões com relação à: ◦ Alocação de espaço para os dados do programa; ◦ Seleção da forma de acessá-los; ◦ Definição de quais registradores serão usados, etc. Projetar um gerador de código que produza programas objeto eficientes é uma das tarefas mais difíceis no projeto de um compilador

Gerador de Código Várias considerações têm que ser feitas: ◦ Há vários tipos de instruções correspondendo a vários tipos de dados e a vários modos de endereçamento; ◦ Há instruções de soma específicas, por exemplo para incrementar/decrementar de 1; ◦ Algumas somas não foram especificadas explicitamente: ◦ Cálculo de endereço de posições em vetores; ◦ Incremento/decremento registrador de topo pilha ◦ Local onde armazenar variáveis; ◦ Alocação de registradores