SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
Geração de código

    Ivan Ricarte


       2008




                    I NTRODUÇÃO À COMPILAÇÃO
Sumário



  Geração de código intermediário
     Código de três endereços
     Notação pós-fixa


  Otimização de código
     Heurísticas de otimização


  Geração de código em linguagem simbólica




                                             I NTRODUÇÃO À COMPILAÇÃO
Estrutura geral do compilador
Atividades de síntese




     Arquivo de
                        análise             geração de
       origem
                                        código intermediário

                                                            geração de        Arquivo de
                  Gramáticas                                código final       destino

                                               otimização

                                                  síntese


                                  Estruturas
                                   internas




                                                                           I NTRODUÇÃO À COMPILAÇÃO
Produção de código



     Etapa de síntese da compilação
     Em geral, em duas fases
       1. Tradução da estrutura construída na análise sintática para
          um código em linguagem intermediária independente do
          processador
       2. Tradução do código em linguagem intermediária para a
          linguagem simbólica do processador-alvo
     Produção do código binário é realizada por outro
     programa do sistema (montador)




                                                         I NTRODUÇÃO À COMPILAÇÃO
Geração de código intermediário


  Com o reconhecimento da estrutura de expressões básicas no
  código, é possível sintetizar expressões equivalentes na
  linguagem em formato intermediário
      Pela varredura da árvore sintática
      Durante o reconhecimento de expressões, na análise
      sintática
          Tradução dirigida pela sintaxe (ações semânticas)
  Formatos usuais para a linguagem em formato intermediário:
      Código de três endereços
      Notação posfixa




                                                         I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços




      Operações têm, no máximo, referências a três variáveis
      (dois operandos e um resultado)
      Expressões complexas devem ser decompostas em várias
      expressões nesse formato
      Formato independente de processador específico
      Fácil de traduzir para linguagem simbólica de qualquer
      processador




                                                     I NTRODUÇÃO À COMPILAÇÃO
Tipos de instruções


      Instruções de atribuição
          cópia
          resultado de operações binárias
          resultado de operações unárias
      Instruções de desvio
          incondicional
          condicional
          invocação de rotinas
      Operadores de endereçamento
          indexado
          indireto




                                            I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Instruções de atribuição




    Atribuição simples
             le := ld

    Exemplo
    Código C/C++:

         x = a;

    Tradução:

         x := a



                           I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Instruções de atribuição




    Operação binária com atribuição
             le := ld1 op ld2

    Exemplo
    Código C/C++:

         x = a + b;

    Tradução:

         x := a + b



                                      I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Instruções de atribuição




    Operação unária com atribuição
             le := op ld

    Exemplo
    Código C/C++:

         x = -a;

    Tradução:

         x := -a



                                     I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Instruções de atribuição


    Expressões mais complexas são traduzidas para uma série de
    expressões nesse formato
          Variáveis temporárias são criadas para armazenar
          resultados intermediários, conforme necessário

    Exemplo
    Expressão C/C++:

         a = b + c * d;

    Tradução:

         _t1 := c * d
         a := b + _t1

                                                       I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Instruções de desvio




    L é um rótulo de uma linha do código intermediário

    Desvio incondicional
            goto L

    Desvio condicional
            if x opr y goto L

    onde opr é um operador relacional




                                                         I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Exemplo de tradução para instrução de desvio



    C++

      while (i++ <= k)
          x[i] = 0;
      x[0] = 0;

    Tradução

    _L1: if i       > k goto _L2
         i :=       i + 1
         x[i]       := 0
         goto       _L1
    _L2: x[0]       := 0


                                               I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Invocação de subrotinas




    Padrão de invocação:
         Parâmetros da função, se presentes, são registrados com
         instrução param
         Subrotina é invocada com instrução call, com indicação
         do número de parâmetros
         Retorno, se presente, pode ser obtido a partir de
         atribuição do resultado de call




                                                         I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Exemplo de tradução de invocação de subrotina




    C++

         x = f (a, g (b));

    Tradução

         param a
         param b
         _t1 := call g, 1
         param _t1
         x := call f, 2



                                                I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Modos de endereçamento


    Modo direto
           x := a

    Modo indexado
           x := y[i]
           x[i] := y

    com i em bytes!

    Modo indireto
            x := &y
            w := *x
           *x := z

                           I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Estruturas de representação interna




    Quádruplas
    Tabela com quatro colunas:
      1. operador
      2. primeiro argumento
      3. segundo argumento
      4. resultado




                                      I NTRODUÇÃO À COMPILAÇÃO
Código de três endereços
Estruturas de representação interna




    Triplas
    Coluna com resultado é omitida
          Referência à linha da tabela é utilizada para indicar
          resultados intermediários
          Operador de atribuição simples deve ser utilizado para
          explicitar armazenamento de resultados não temporários




                                                           I NTRODUÇÃO À COMPILAÇÃO
Estruturas de representação interna
Exemplo




    C++
    a = b + c * d;

    Quádrupla
          operador   arg 1   arg 2   resultado
     1       *         c       d        _t1
     2       +         b     _t1         a




                                                 I NTRODUÇÃO À COMPILAÇÃO
Estruturas de representação interna
Exemplo




    C++
    a = b + c * d;

    Tripla
          operador   arg 1   arg 2
     1        *        c       d
     2        +        b      (1)
     3       :=        a      (2)




                                      I NTRODUÇÃO À COMPILAÇÃO
Notação pós-fixa




     Alternativa para representação de expressões
     Operações são indicadas após operandos
     Representação interna de cada expressão na forma de
     uma lista
     Não há necessidade de parênteses




                                                    I NTRODUÇÃO À COMPILAÇÃO
Notação pós-fixa


  C++                               Árvore sintática abstrata
        a = b*(c+d)+e;                       :=

                                        a                 +

                                                 *             e

                                             b        +

                                                  c       d

  Tradução (varredura pós-ordem)
        a   b   c   d   +   *   e   +   :=

                                                              I NTRODUÇÃO À COMPILAÇÃO
Otimização de código




      Código gerado automaticamente pode ser ineficiente
          Redundâncias
          Instruções desnecessárias
      Ineficiência pode vir também da codificação original
      Heurísticas de otimização podem ser aplicadas no código
      em formato intermediário antes da produção do código em
      linguagem simbólica




                                                    I NTRODUÇÃO À COMPILAÇÃO
Eliminação de subexpressões comuns
  Operações que se repetem sem que seus argumentos sejam
  alterados podem ser realizadas uma única vez
  Exemplo
  Sem atribuição a a ou b entre as duas instruções:

     x = a + b + c;
     ...
     y = a + b + d;
  Sem otimização:
                                    Com otimização:
  _t1 := a    + b
                                    _t1 := a + b
  x := _t1    + c
                                    x := _t1 + c
  ...
                                    ...
  _t2 := a    + b
                                    y := _t1 + d
  y := _t2    + d
                                                      I NTRODUÇÃO À COMPILAÇÃO
Eliminação de código redundante



  Instruções sem efeito podem ser eliminadas

  Exemplo
  Sem nenhuma atribuição a x ou a y entre as duas instruções,

      x := y                          x := y
      ...                             ...
      x := y                          y := x

  a segunda instrução pode ser seguramente eliminada




                                                    I NTRODUÇÃO À COMPILAÇÃO
Propagação de cópias

  Variáveis que só mantêm cópia de um valor, sem outros usos,
  podem ser eliminadas
  Exemplo
  Sem outras atribuições a y e sem outros usos de x

     x := y
     ...
     z := x


  pode ser reduzido a

     ...
     z := y


                                                      I NTRODUÇÃO À COMPILAÇÃO
Eliminação de desvios desnecessários


  Desvio incondicional para a próxima instrução pode ser
  eliminado
  Exemplo
           a := _t2
           goto _L6
   _L6:    c := a + b

  equivale a

           a := _t2
           c := a + b




                                                     I NTRODUÇÃO À COMPILAÇÃO
Eliminação de código não-alcançável

  Instruções que nunca serão executadas podem ser eliminadas

  Exemplo
       goto _L3
       _t1 := x
  _L4: _t2 := b + c
  _L3: d := a + _t2

  equivale a

       goto _L3
  _L4: _t2 := b + c
  _L3: d := a + _t2



                                                  I NTRODUÇÃO À COMPILAÇÃO
Movimentação de código

  Retirar do corpo de comandos iterativos (laços) cálculo de
  expressões invariáveis
  Exemplo
      while ( i < 2*max )
         a[i] = i + max/4;

  Como valor de max não varia, equivale a

      _t1 = 2*max;
      _t2 = max/4;
      while (i < _t1)
         a[i] = i + _t2;



                                                      I NTRODUÇÃO À COMPILAÇÃO
Uso de propriedades algébricas

  Substituição de expressões aritméticas por formas
  equivalentes

                      Original   Equivalente
                      x+y        y+x
                      x+0        x
                      x-0        x
                      x*y        y*x
                      x*1        x
                      x/1        x
                      2*x        x+x
                      x2         x*x



                                                      I NTRODUÇÃO À COMPILAÇÃO
Limites e objetivos de otimização
   Em geral, usuário pode indicar ao compilador quanto de
   esforço deve ser dispendido em otimização

   Compilador gcc/g++
          -O0 nenhuma otimização deve ser feita, compilação
              fica mais rápida mas programa gerado é menos
              eficiente
                  Mas pode ficar mais fácil de seguir execução
                  num processo de depuração, por estar mais
                  próximo do código original
          -O3 máxima otimização, programa gerado tem menor
              tempo de execução mas tempo de compilação é
              mais longo
     -O1, -O2 graus de otimização intermediários
          -Os Se objetivo da otimização não for tempo de
              execução, mas a minimização do espaço ocupado
              em memória                             I NTRODUÇÃO À COMPILAÇÃO
Geração de código em linguagem simbólica
     Objetivo Obter, a partir das instruções elementares usadas
              no código em formato intermediário, código
              equivalente na linguagem simbólica do
              processador-alvo

     Diferentes processadores podem ter distintos formatos de
     instruções
     Classificação pelo número de endereços na instrução:
               3 dois operandos e o resultado
               2 dois operandos (resultado sobrescreve
                 primeiro operando)
               1 só segundo operando, primeiro operando
                 implícito (registrador acumulador), resultado
                 sobrescreve primeiro operando
               0 operandos e resultado numa pilha, sem
                 endereço explícitos
                                                     I NTRODUÇÃO À COMPILAÇÃO
Tradução para linguagem simbólica
  Tradução ocorre segundo gabaritos definidos de acordo com o
  tipo de máquina
  Exemplo: x := y + z

  3-end                        1-end
  ADD y, z, x                  LOAD y
                               ADD   z
  2-end                        STORE x
  MOVE Ri, y
  ADD Ri, z                    0-end
  MOVE x, Ri                   PUSH y
                               PUSH z
                               ADD
                               POP x

                                                  I NTRODUÇÃO À COMPILAÇÃO
Otimização no código em linguagem simbólica

  Ao combinar seqüências de instruções traduzidas pelos
  gabaritos, estratégias de otimização podem ser também
  aplicadas ao código em linguagem simbólica
      Eliminação de código redundante
      Eliminação de instruções desnecessárias
  Além disso, há uma oportunidade de realizar otimizações que
  são específicas para um determinado processador
      Otimizações dependentes de máquina
      Permitem o aproveitamento de instruções pouco usuais,
      de uso restrito
      Muitas vezes, é difícil para o compilador reconhecer a
      possibilidade de uso dessas instruções


                                                      I NTRODUÇÃO À COMPILAÇÃO
Sugestões de leitura




   Artigos na Wikipedia sobre
       Geração de código: http://en.wikipedia.org/
       wiki/Code_generation_(compiler)
       Otimização de código: http://en.wikipedia.org/
       wiki/Optimization_(computer_science)




                                              I NTRODUÇÃO À COMPILAÇÃO

Mais conteúdo relacionado

Mais procurados (20)

Php Framework
Php FrameworkPhp Framework
Php Framework
 
Python - the basics
Python - the basicsPython - the basics
Python - the basics
 
Chapter 2 - Computer Evolution and Performance
Chapter 2 - Computer Evolution and PerformanceChapter 2 - Computer Evolution and Performance
Chapter 2 - Computer Evolution and Performance
 
Python: Polymorphism
Python: PolymorphismPython: Polymorphism
Python: Polymorphism
 
Introduction to xampp
Introduction to xamppIntroduction to xampp
Introduction to xampp
 
introduction to python
 introduction to python introduction to python
introduction to python
 
Dining Philosopher Problem
Dining Philosopher ProblemDining Philosopher Problem
Dining Philosopher Problem
 
はじめてのPowerShell
はじめてのPowerShellはじめてのPowerShell
はじめてのPowerShell
 
Gerência de Configuração
Gerência de ConfiguraçãoGerência de Configuração
Gerência de Configuração
 
Chapter 3
Chapter 3Chapter 3
Chapter 3
 
Formatação
FormataçãoFormatação
Formatação
 
Лекція №1
Лекція №1Лекція №1
Лекція №1
 
CPU Scheduling in OS Presentation
CPU Scheduling in OS  PresentationCPU Scheduling in OS  Presentation
CPU Scheduling in OS Presentation
 
Unit iii(part b - architectural design)
Unit   iii(part b - architectural design)Unit   iii(part b - architectural design)
Unit iii(part b - architectural design)
 
Demand paging
Demand pagingDemand paging
Demand paging
 
Computer architecture and organization
Computer architecture and organizationComputer architecture and organization
Computer architecture and organization
 
Web application architecture
Web application architectureWeb application architecture
Web application architecture
 
Pthread
PthreadPthread
Pthread
 
Python tutorial for beginners - Tib academy
Python tutorial for beginners - Tib academyPython tutorial for beginners - Tib academy
Python tutorial for beginners - Tib academy
 
Operating System Scheduling Algorithms
Operating System Scheduling AlgorithmsOperating System Scheduling Algorithms
Operating System Scheduling Algorithms
 

Destaque

Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresAnderson Favaro
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadoresLCCIMETRO
 
Estrutura básica de um computador
Estrutura básica de um computadorEstrutura básica de um computador
Estrutura básica de um computadorAna Covas Grilo
 
Compiler Design
Compiler DesignCompiler Design
Compiler DesignMir Majid
 

Destaque (10)

Compiladores 7
Compiladores 7Compiladores 7
Compiladores 7
 
Compiladores 2
Compiladores 2Compiladores 2
Compiladores 2
 
Compiladores 3
Compiladores 3Compiladores 3
Compiladores 3
 
Compiladores 5
Compiladores 5Compiladores 5
Compiladores 5
 
Compiladores 4
Compiladores 4Compiladores 4
Compiladores 4
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - Compiladores
 
Compiladores 1
Compiladores 1Compiladores 1
Compiladores 1
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadores
 
Estrutura básica de um computador
Estrutura básica de um computadorEstrutura básica de um computador
Estrutura básica de um computador
 
Compiler Design
Compiler DesignCompiler Design
Compiler Design
 

Semelhante a Compiladores 6

Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem cJefferson Bessa
 
Ganhando performance no Python com Numba em projetos não científicos
Ganhando performance no Python com Numba em projetos não científicosGanhando performance no Python com Numba em projetos não científicos
Ganhando performance no Python com Numba em projetos não científicosAlejandro Mesias Nebra Perez
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Pythonguestac3de
 
Tradutor de Pig Latin
Tradutor de Pig LatinTradutor de Pig Latin
Tradutor de Pig LatinElen Arantza
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+cThiago Freitas
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem cvingue
 
Introdução a programação
Introdução a programaçãoIntrodução a programação
Introdução a programaçãoGustavo Nazário
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordidaBonoBee
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação CJose Augusto Cintra
 
Principais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaPrincipais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaIntel Software Brasil
 

Semelhante a Compiladores 6 (20)

Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Oc2 cap03
Oc2 cap03Oc2 cap03
Oc2 cap03
 
Linguagem C clecioamerico
Linguagem C clecioamericoLinguagem C clecioamerico
Linguagem C clecioamerico
 
Ganhando performance no Python com Numba em projetos não científicos
Ganhando performance no Python com Numba em projetos não científicosGanhando performance no Python com Numba em projetos não científicos
Ganhando performance no Python com Numba em projetos não científicos
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Python
 
Tradutor de Pig Latin
Tradutor de Pig LatinTradutor de Pig Latin
Tradutor de Pig Latin
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+c
 
Programação C - Aula 2
Programação C - Aula 2Programação C - Aula 2
Programação C - Aula 2
 
5423 c ou c++
5423 c ou c++5423 c ou c++
5423 c ou c++
 
Apostila C++
Apostila C++ Apostila C++
Apostila C++
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem c
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem c
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem c
 
Ud2
Ud2Ud2
Ud2
 
Linguagem_C.pdf
Linguagem_C.pdfLinguagem_C.pdf
Linguagem_C.pdf
 
Introdução a programação
Introdução a programaçãoIntrodução a programação
Introdução a programação
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Principais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralelaPrincipais conceitos técnicas e modelos de programação paralela
Principais conceitos técnicas e modelos de programação paralela
 
Aula09 traducaosin110
Aula09 traducaosin110Aula09 traducaosin110
Aula09 traducaosin110
 

Mais de Ivan Ricarte

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoesIvan Ricarte
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnitIvan Ricarte
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smellsIvan Ricarte
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saudeIvan Ricarte
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software EstatisticoIvan Ricarte
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junitIvan Ricarte
 
Introducao a refatoracao
Introducao a refatoracaoIntroducao a refatoracao
Introducao a refatoracaoIvan Ricarte
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1Ivan Ricarte
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++Ivan Ricarte
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Ivan Ricarte
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do softwareIvan Ricarte
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Ivan Ricarte
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)Ivan Ricarte
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeIvan Ricarte
 

Mais de Ivan Ricarte (20)

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoes
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnit
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smells
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saude
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software Estatistico
 
Aula UML e Java
Aula UML e JavaAula UML e Java
Aula UML e Java
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junit
 
Introducao a refatoracao
Introducao a refatoracaoIntroducao a refatoracao
Introducao a refatoracao
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1
 
c++ construtores
c++ construtoresc++ construtores
c++ construtores
 
Padroes
PadroesPadroes
Padroes
 
C++ Sobrecarga
C++ SobrecargaC++ Sobrecarga
C++ Sobrecarga
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++
 
UML e POO
UML e POOUML e POO
UML e POO
 
Antipadroes
AntipadroesAntipadroes
Antipadroes
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do software
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
 

Compiladores 6

  • 1. Geração de código Ivan Ricarte 2008 I NTRODUÇÃO À COMPILAÇÃO
  • 2. Sumário Geração de código intermediário Código de três endereços Notação pós-fixa Otimização de código Heurísticas de otimização Geração de código em linguagem simbólica I NTRODUÇÃO À COMPILAÇÃO
  • 3. Estrutura geral do compilador Atividades de síntese Arquivo de análise geração de origem código intermediário geração de Arquivo de Gramáticas código final destino otimização síntese Estruturas internas I NTRODUÇÃO À COMPILAÇÃO
  • 4. Produção de código Etapa de síntese da compilação Em geral, em duas fases 1. Tradução da estrutura construída na análise sintática para um código em linguagem intermediária independente do processador 2. Tradução do código em linguagem intermediária para a linguagem simbólica do processador-alvo Produção do código binário é realizada por outro programa do sistema (montador) I NTRODUÇÃO À COMPILAÇÃO
  • 5. Geração de código intermediário Com o reconhecimento da estrutura de expressões básicas no código, é possível sintetizar expressões equivalentes na linguagem em formato intermediário Pela varredura da árvore sintática Durante o reconhecimento de expressões, na análise sintática Tradução dirigida pela sintaxe (ações semânticas) Formatos usuais para a linguagem em formato intermediário: Código de três endereços Notação posfixa I NTRODUÇÃO À COMPILAÇÃO
  • 6. Código de três endereços Operações têm, no máximo, referências a três variáveis (dois operandos e um resultado) Expressões complexas devem ser decompostas em várias expressões nesse formato Formato independente de processador específico Fácil de traduzir para linguagem simbólica de qualquer processador I NTRODUÇÃO À COMPILAÇÃO
  • 7. Tipos de instruções Instruções de atribuição cópia resultado de operações binárias resultado de operações unárias Instruções de desvio incondicional condicional invocação de rotinas Operadores de endereçamento indexado indireto I NTRODUÇÃO À COMPILAÇÃO
  • 8. Código de três endereços Instruções de atribuição Atribuição simples le := ld Exemplo Código C/C++: x = a; Tradução: x := a I NTRODUÇÃO À COMPILAÇÃO
  • 9. Código de três endereços Instruções de atribuição Operação binária com atribuição le := ld1 op ld2 Exemplo Código C/C++: x = a + b; Tradução: x := a + b I NTRODUÇÃO À COMPILAÇÃO
  • 10. Código de três endereços Instruções de atribuição Operação unária com atribuição le := op ld Exemplo Código C/C++: x = -a; Tradução: x := -a I NTRODUÇÃO À COMPILAÇÃO
  • 11. Código de três endereços Instruções de atribuição Expressões mais complexas são traduzidas para uma série de expressões nesse formato Variáveis temporárias são criadas para armazenar resultados intermediários, conforme necessário Exemplo Expressão C/C++: a = b + c * d; Tradução: _t1 := c * d a := b + _t1 I NTRODUÇÃO À COMPILAÇÃO
  • 12. Código de três endereços Instruções de desvio L é um rótulo de uma linha do código intermediário Desvio incondicional goto L Desvio condicional if x opr y goto L onde opr é um operador relacional I NTRODUÇÃO À COMPILAÇÃO
  • 13. Código de três endereços Exemplo de tradução para instrução de desvio C++ while (i++ <= k) x[i] = 0; x[0] = 0; Tradução _L1: if i > k goto _L2 i := i + 1 x[i] := 0 goto _L1 _L2: x[0] := 0 I NTRODUÇÃO À COMPILAÇÃO
  • 14. Código de três endereços Invocação de subrotinas Padrão de invocação: Parâmetros da função, se presentes, são registrados com instrução param Subrotina é invocada com instrução call, com indicação do número de parâmetros Retorno, se presente, pode ser obtido a partir de atribuição do resultado de call I NTRODUÇÃO À COMPILAÇÃO
  • 15. Código de três endereços Exemplo de tradução de invocação de subrotina C++ x = f (a, g (b)); Tradução param a param b _t1 := call g, 1 param _t1 x := call f, 2 I NTRODUÇÃO À COMPILAÇÃO
  • 16. Código de três endereços Modos de endereçamento Modo direto x := a Modo indexado x := y[i] x[i] := y com i em bytes! Modo indireto x := &y w := *x *x := z I NTRODUÇÃO À COMPILAÇÃO
  • 17. Código de três endereços Estruturas de representação interna Quádruplas Tabela com quatro colunas: 1. operador 2. primeiro argumento 3. segundo argumento 4. resultado I NTRODUÇÃO À COMPILAÇÃO
  • 18. Código de três endereços Estruturas de representação interna Triplas Coluna com resultado é omitida Referência à linha da tabela é utilizada para indicar resultados intermediários Operador de atribuição simples deve ser utilizado para explicitar armazenamento de resultados não temporários I NTRODUÇÃO À COMPILAÇÃO
  • 19. Estruturas de representação interna Exemplo C++ a = b + c * d; Quádrupla operador arg 1 arg 2 resultado 1 * c d _t1 2 + b _t1 a I NTRODUÇÃO À COMPILAÇÃO
  • 20. Estruturas de representação interna Exemplo C++ a = b + c * d; Tripla operador arg 1 arg 2 1 * c d 2 + b (1) 3 := a (2) I NTRODUÇÃO À COMPILAÇÃO
  • 21. Notação pós-fixa Alternativa para representação de expressões Operações são indicadas após operandos Representação interna de cada expressão na forma de uma lista Não há necessidade de parênteses I NTRODUÇÃO À COMPILAÇÃO
  • 22. Notação pós-fixa C++ Árvore sintática abstrata a = b*(c+d)+e; := a + * e b + c d Tradução (varredura pós-ordem) a b c d + * e + := I NTRODUÇÃO À COMPILAÇÃO
  • 23. Otimização de código Código gerado automaticamente pode ser ineficiente Redundâncias Instruções desnecessárias Ineficiência pode vir também da codificação original Heurísticas de otimização podem ser aplicadas no código em formato intermediário antes da produção do código em linguagem simbólica I NTRODUÇÃO À COMPILAÇÃO
  • 24. Eliminação de subexpressões comuns Operações que se repetem sem que seus argumentos sejam alterados podem ser realizadas uma única vez Exemplo Sem atribuição a a ou b entre as duas instruções: x = a + b + c; ... y = a + b + d; Sem otimização: Com otimização: _t1 := a + b _t1 := a + b x := _t1 + c x := _t1 + c ... ... _t2 := a + b y := _t1 + d y := _t2 + d I NTRODUÇÃO À COMPILAÇÃO
  • 25. Eliminação de código redundante Instruções sem efeito podem ser eliminadas Exemplo Sem nenhuma atribuição a x ou a y entre as duas instruções, x := y x := y ... ... x := y y := x a segunda instrução pode ser seguramente eliminada I NTRODUÇÃO À COMPILAÇÃO
  • 26. Propagação de cópias Variáveis que só mantêm cópia de um valor, sem outros usos, podem ser eliminadas Exemplo Sem outras atribuições a y e sem outros usos de x x := y ... z := x pode ser reduzido a ... z := y I NTRODUÇÃO À COMPILAÇÃO
  • 27. Eliminação de desvios desnecessários Desvio incondicional para a próxima instrução pode ser eliminado Exemplo a := _t2 goto _L6 _L6: c := a + b equivale a a := _t2 c := a + b I NTRODUÇÃO À COMPILAÇÃO
  • 28. Eliminação de código não-alcançável Instruções que nunca serão executadas podem ser eliminadas Exemplo goto _L3 _t1 := x _L4: _t2 := b + c _L3: d := a + _t2 equivale a goto _L3 _L4: _t2 := b + c _L3: d := a + _t2 I NTRODUÇÃO À COMPILAÇÃO
  • 29. Movimentação de código Retirar do corpo de comandos iterativos (laços) cálculo de expressões invariáveis Exemplo while ( i < 2*max ) a[i] = i + max/4; Como valor de max não varia, equivale a _t1 = 2*max; _t2 = max/4; while (i < _t1) a[i] = i + _t2; I NTRODUÇÃO À COMPILAÇÃO
  • 30. Uso de propriedades algébricas Substituição de expressões aritméticas por formas equivalentes Original Equivalente x+y y+x x+0 x x-0 x x*y y*x x*1 x x/1 x 2*x x+x x2 x*x I NTRODUÇÃO À COMPILAÇÃO
  • 31. Limites e objetivos de otimização Em geral, usuário pode indicar ao compilador quanto de esforço deve ser dispendido em otimização Compilador gcc/g++ -O0 nenhuma otimização deve ser feita, compilação fica mais rápida mas programa gerado é menos eficiente Mas pode ficar mais fácil de seguir execução num processo de depuração, por estar mais próximo do código original -O3 máxima otimização, programa gerado tem menor tempo de execução mas tempo de compilação é mais longo -O1, -O2 graus de otimização intermediários -Os Se objetivo da otimização não for tempo de execução, mas a minimização do espaço ocupado em memória I NTRODUÇÃO À COMPILAÇÃO
  • 32. Geração de código em linguagem simbólica Objetivo Obter, a partir das instruções elementares usadas no código em formato intermediário, código equivalente na linguagem simbólica do processador-alvo Diferentes processadores podem ter distintos formatos de instruções Classificação pelo número de endereços na instrução: 3 dois operandos e o resultado 2 dois operandos (resultado sobrescreve primeiro operando) 1 só segundo operando, primeiro operando implícito (registrador acumulador), resultado sobrescreve primeiro operando 0 operandos e resultado numa pilha, sem endereço explícitos I NTRODUÇÃO À COMPILAÇÃO
  • 33. Tradução para linguagem simbólica Tradução ocorre segundo gabaritos definidos de acordo com o tipo de máquina Exemplo: x := y + z 3-end 1-end ADD y, z, x LOAD y ADD z 2-end STORE x MOVE Ri, y ADD Ri, z 0-end MOVE x, Ri PUSH y PUSH z ADD POP x I NTRODUÇÃO À COMPILAÇÃO
  • 34. Otimização no código em linguagem simbólica Ao combinar seqüências de instruções traduzidas pelos gabaritos, estratégias de otimização podem ser também aplicadas ao código em linguagem simbólica Eliminação de código redundante Eliminação de instruções desnecessárias Além disso, há uma oportunidade de realizar otimizações que são específicas para um determinado processador Otimizações dependentes de máquina Permitem o aproveitamento de instruções pouco usuais, de uso restrito Muitas vezes, é difícil para o compilador reconhecer a possibilidade de uso dessas instruções I NTRODUÇÃO À COMPILAÇÃO
  • 35. Sugestões de leitura Artigos na Wikipedia sobre Geração de código: http://en.wikipedia.org/ wiki/Code_generation_(compiler) Otimização de código: http://en.wikipedia.org/ wiki/Optimization_(computer_science) I NTRODUÇÃO À COMPILAÇÃO