Construção de Compiladores

Slides:



Advertisements
Apresentações semelhantes
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Advertisements

Programação em Java Prof. Maurício Braga
gerador de código intermediário
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.
Estruturas de Controle
Introdução Gdes. bancos de dados: Concorrência: Transação:
WebDesign Redes de Computadores Aula 05
WebDesign Redes de Computadores Aula 07
V Procedimentos – são estruturas que agrupam um conjunto de comandos, que são executados quando o procedimento é chamado. v Funções – são procedimentos.
VI – Optimização de código Blocos básicos Optimização de ciclos Bibliografia aconselhada: –Apontamentos LFA 1999/ Jorge Morais.
Arquitetura e organização de computadores
Seminários de Compiladores
Software Básico Silvio Fernandes
Introdução à Computação - Jorge Macêdo
Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur.
Trabalho de Conclusão de Curso
Medida do Tempo de Execução de um Programa
Linguagem C Estruturas de Controle de Fluxos
THOBER CORADI DETOFENO, MSC. Aula 07
Análise Léxica Supondo o trecho de programa abaixo:
Construção de Compiladores
Construção de Compiladores
Construção de Compiladores
Introdução ao -calculus
Complexidade de Algoritmos
O Portal do Estudante de Computação
Buscas em Grafos Prof. André Renato 1º Semestre/2012
Informática Teórica Engenharia da Computação
Aula prática 6 Vetores e Matrizes
Aula prática - análise contextual
Representação de Instruções
Linguagem de Programação II Parte VII
Linguagem de Programação II Parte V
Linguagem de Programação I Parte III
Linguagem de Programação II Parte IX
FTIN Formação Técnica em Informática
ENGENHARIA DE AUTOMAÇÃO INDUSTRIAL
Aula T06 – BCC202 Análise de Algoritmos (Parte 4) Túlio Toffolo
Algoritmos 1º Semestre Materia: Informática Profº: Cristiano.
Paradigmas de Linguagens de Programação Linguagem Imperativa 2
Otimizações – Parte 1 André José Diniz Barboza
Expressões e Instrução de Atribuição
Sistema de equações lineares
Operadores e Atribuições Capítulo 3
Agenda Modos de Endereçamento.
Geração de Código Intermediário
Estrutura de decisão Neste tipo de estrutura o fluxo de instruções a ser seguido é escolhido em função do resultado da avaliação de uma ou mais condições.
Geração de Código aula-12-geração-de-código.pdf.
SISTEMAS OPERACIONAIS I
Capítulo VIII Ambientes de Execução
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
Modularização Dividir um problema em subproblemas Módulos menores facilita a depuração Dividir o desenvolvimento entre vários programadores “Reutilização”
Projeto de Linguagens de Programação
Fábio de Oliveira Borges
Tradução Dirigida por Sintaxe
Aula01 – Técnicas de Programação II
Back-End Compilação aula-11-back-end.pdf.
A Linguagem de Máquina – Desvios e Laços
8088 Assembly Software Básico Mitsuo Takaki.
Faculdade Pernambucana - FAPE Setembro/2007
Fundamentos de linguagens de programação
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Geração de Código Fase final do compilador
Algoritmos.
Algoritmos e Programação I
Tipos de Dados Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Estas informações podem.
Informática e Computação Aula Estrutura de Repetição
Programação estruturada unidade 2
Linguagem de Programação
Análise Contextual Mauro Araújo Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal de Pernambuco.
Transcrição da apresentação:

Construção de Compiladores Análise e Otimização

Análise e Otimização Módulos Lista de tokens Árvore sintática Árvore sintática anotada Código intermediário Código intermediário otimizado Linguagem de máquina

Análise e Otimização Consiste em reconhecer instruções que formam um específico padrão que pode ser: Substituído por um menor Substituído por um padrão mais eficiente Tipos de otimização Peephole: análise é feita sobre um pequeno conjunto de instruções Baseados em análise: alguma técnica de análise de código deve ser empregada para detectar relações Análise de tempo de vida (Liveness Analysis)

Análise e Otimização “Todo programa é melhorado se uma instrução é retirada” O programa deve apresentar o mesmo comportamento x = a + b; Pra tirar uma instrução (x = a + b;), devemos provar que o programa não foi alterado

Análise e Otimização Propriedades que podem ser demonstradas O comando x = a+b nunca é executado O comando é inútil porque todas as vezes x recebe o mesmo valor que tinha antes

Análise e Otimização Não é prático otimizar um programa tentando eliminar sucessivamente os seus comandos Condições de eliminação variadas Depende do comando Da posição do comando De todos os outros comandos do programa

Análise e Otimização Outro exemplo clássico Retirada de comandos de um loop Se N é 100, 100 somas a menos são executadas Mas se o valor de N é 0?? E se “a” é usada após o loop???

Análise e Otimização A otimização deve definir a quantidade de informação que se deseja manipular Podemos examinar otimizações locais Trechos pequenos de programas Trechos sem desvios Otimizações em um nível intermediário Considera apenas funções, módulos, ou classes Otimizações globais Consideram inter-relações de todas as partes de um programa A maioria dos compiladores oferece otimizações do primeiro tipo, e quando muito algumas otimizações de nível intermediário.

Análise e Otimização Um programa em representação intermediária pode ser dividido em blocos básicos da seguinte maneira: Primeiro comando inicia um bloco básico Qualquer comando rotulado, ou que de alguma forma seja alvo de um comando de desvio inicia um novo bloco básico Qualquer comando de desvio, condicional ou incondicional termina um bloco básico

Análise e Otimização Em um programa de grande porte, temos: Execução gasta 90% em 10% do código, e 10% do tempo nos 90% do código restantes. Regra dos (90%-10%) Em algumas referências temos (70%-30%) Principal vilão: loops aninhados Muito do trabalho no desenvolvimento de técnicas de otimização é dedicado aos loops

Análise e Otimização Ferramentas Code Profiler AQtime Registram o perfil de execução do programa, permitindo a identificação dos trechos mais executados AQtime

Análise e Otimização Oportunidades de otimização Eliminação de código morto Renomeação de variáveis temporárias Transformações algébricas Dobramento de constantes Redução de força Otimizações de loop Eliminação de variáveis de indução Eliminação de sub-expressões comuns

Análise e Otimização Eliminação de código morto Código que não pode ser alcançado durante a execução de um programa

Análise e Otimização Eliminação de código morto - Tema de algumas patentes

Análise e Otimização Renomeação de variáveis temporárias Variáveis temporárias introduzidas durante a geração de código intermediário podem não ser estritamente necessárias Considere a seguinte situação:

Análise e Otimização Renomeação de variáveis temporárias Como variáveis temporárias são temporárias, podemos reusá-la t4  t1 t5  t2 Del(t3) Del(t6)

Análise e Otimização Transformações algébricas Algumas transformações baseadas em propriedades algébricas Comutatividade Associatividade Identidade Exemplo: como a soma é comutativa, temos: x=a+b*c; x=b*c+a; O primeiro operador sempre deve estar no acumulador

Análise e Otimização Transformações algébricas Um exemplo baseado na associatividade x=(a+b)+(c+d); x=(((a+b)+c)+d);

Análise e Otimização Dobramento de constantes Expressões compostas por constantes podem ser avaliadas em tempo de compilação Isso evita sua avaliação repetida em tempo de execução (i < 99)

Análise e Otimização Redução de força Situação onde operações mais caras podem ser substituídas por operações mais baratas Exemplo: calcule o comprimento da concatenação dos strings s1 e s2 Exemplo: calcule o quadrado de um número x strlen(strcat(s1, s2)) strlen(s1) + strlen(s2) pow(x, 2) x*x e 2.0 * ln x, utiliza séries para calcular o logaritmo natural e a exponencial

Análise e Otimização Otimizações de loop A mais comum é a transferência de computações invariantes do loop para fora dele Dado o comando x=exp, A expressão exp é composta apenas de constantes, ou de variáveis cujos valores não são alterados dentro do loop

Análise e Otimização Eliminação de variáveis de indução Variáveis de indução assumem valores em progressão aritmética, a cada vez que o código do loop é executado Qual a outra otimização feita no código resultante? Qual outra otimização poderia ter sido feita no código resultante?

Análise e Otimização Eliminação de sub-expressões comuns Suponha que a mesma expressão ocorre mais de uma vez em um trecho de programa Se a e b não são alterados, é possível guardar o valor da expressão a+b em uma temporária Se a variável x ainda está disponível com o mesmo valor, podemos usar o próprio x

Análise e Otimização Eliminação de sub-expressões comuns É necessário garantir que os valores de a, b (e, se for o caso, x) não se alteram Preciso examinar todos os comandos que podem ocorrer entre as duas avaliações da expressão E se estes dois comandos não estão no mesmo bloco básico? Devemos verificar quais outros blocos básicos podem ter seus comandos executados

Análise e Otimização Eliminação de sub-expressões comuns Podemos ter problemas mesmo quando os comandos estão no mesmo bloco Exemplo: array Exemplo: ponteiros j = i É o endereço de memória de “a” ou “b”.

Análise e Otimização Eliminação de sub-expressões comuns: o algoritmo DAG Determinar a possibilidade de eliminação de subexpressões comuns em um bloco básico Baseado na construção de um grafo acíclico dirigido (dag) Vértices representam valores distintos assumidos pelas diversas variáveis do programa no bloco considerado Valor de alguma variável do programa

Análise e Otimização Eliminação de sub-expressões comuns: o algoritmo DAG Em princípio, vértices distintos correspondem a valores que podem ser distintos durante a execução Cenário A - Int a, b, x, y, ... Cenário B - após execução de x=a+b; e y=a+b; Cenário A Cenário B

Análise e Otimização Eliminação de sub-expressões comuns: o algoritmo DAG Podemos distinguir dois tipos de variáveis: Variáveis definidas pelo programador Variáveis temporárias, que são usadas apenas durante a execução do trecho em questão Possuem valores irrelevantes no início e no fim do trecho considerado São normalmente criadas durante a geração de código intermediário

Análise e Otimização Eliminação de sub-expressões comuns: o algoritmo DAG Inicialmente, cada variável definida pelo programador rotula um vértice separado Cada vez que um comando x=y op z; for considerado, procuraremos um vértice n com o operador op, que tenha como filhos vértices rotulados por y e z. Se este vértice existir, passará a ser o vértice rotulado com x, além de outros rótulos que já existam para n. Se não existir, um vértice será criado com essas características, e um único rótulo, x. Este processo vale para todos os operadores binários op da linguagem intermediária. Operadores unários, ternários, etc. são tratados de forma semelhante.

Análise e Otimização Eliminação de sub-expressões comuns: o algoritmo DAG z + t7 x y + t6 x + t5 * t2 a y t4 + t1 * t3 c a b d e x y z

Análise e Otimização Eliminação de sub-expressões comuns: o algoritmo DAG O último passo é retirar dos nós os rótulos desnecessários: Se um nó está rotulado por alguma variável declarada pelo programador, todas as variáveis temporárias são removidas Caso contrário apenas uma variável temporária será deixada.

Análise e Otimização Eliminação de sub-expressões comuns: o algoritmo DAG Gerando o código otimizado Podemos usar uma ordem qualquer dos nós desde que um valor só seja usado após a instrução que gerou o mesmo valor No caso de mais de uma variável rotulando um nó (z e x) apenas para uma delas o comando é gerado, sendo o valor copiado para as demais

Análise e Otimização Benchmark Conjunto de testes http://www.netlib.org/benchmark/ Livermorec benchmark

Análise e Otimização Observação final: “Embora a otimização possa melhorar as características de um programa, ela não faz milagres” Não se pode justificar um programa mal escrito, porque “vai ser otimizado”. Em particular, normalmente a otimização não altera a ordem dos algoritmos, alterando apenas as constantes multiplicativas Se existe para um problema um algoritmo O(n log n), não espere que um programa em que você usou um algoritmo O(n2) se transforme durante a otimização no algoritmo O(n log n).