1.Introducao a compilação

Embed Size (px)

Citation preview

  • 8/18/2019 1.Introducao a compilação

    1/22

    Profa. Valéria D. Feltrim

    DIN – UEM

    Parte deste material foi gentilmente cedido pelo Prof. T. A. S. Pardo (ICMC-USP/São Carlos)

  • 8/18/2019 1.Introducao a compilação

    2/22

    Programa que lê um programa em uma linguagem-fonte e otraduz em um programa em uma linguagem-alvo (objeto)

    Linguagem-fonte: Pascal, C Linguagem-alvo: linguagem de montagem (assembly ), código de

    máquina, bytecode ...

    Durante o processo de tradução, relatam-se errosencontrados

    compiladorprograma

    fonte

    programa

    alvo

    mensagens de erro

  • 8/18/2019 1.Introducao a compilação

    3/22

    Primeiros compiladores começaram a surgir noinício dos anos 50 Diversos experimentos e implementações realizados

    independentemente Trabalhos iniciais: tradução de fórmulas aritméticas em

    código de máquina Compiladores eram considerados programas muito difíceis

    de construir Primeiro compilador Fortran levou 18 homens-ano para ser

    construído

  • 8/18/2019 1.Introducao a compilação

    4/22

    Desde então, técnicas sistemáticas para construção decompiladores foram identificadas

    Reconhecimento de cadeias, gramáticas, geração de linguagem

    Desenvolvimento de boas linguagens e ambientes de programação C, C++, bibliotecas, linguagens visuais

    Desenvolvimento de programas para produção automática decompiladores lex, yacc

    Atualmente, um aluno de graduação pode construir um compiladorrapidamente

  • 8/18/2019 1.Introducao a compilação

    5/22

  • 8/18/2019 1.Introducao a compilação

    6/22

    programa-fonte

    analisador léxico

    analisador sintático

    analisador semântico

    gerador de código intermediário

    otimizador de código

    gerador de código

    programa-alvo

    Tabela de símbolos

    Tabela de palavras esímbolos reservados

    Manipulaçãode erros

    dados deentrada

    saída

  • 8/18/2019 1.Introducao a compilação

    7/22

    programa-fonte

    analisador léxico

    analisador sintático

    analisador semântico

    gerador de código intermediário

    otimizador de código

    gerador de código

    programa-alvo

    Tabela de símbolos

    Tabela de palavras esímbolos reservados

    Manipulaçãode erros

    dados deentrada

    saída

  • 8/18/2019 1.Introducao a compilação

    8/22

    Léxica: palavras (tokens ) do programa i, while, =, [, (,

  • 8/18/2019 1.Introducao a compilação

    9/22

    Como diferenciar palavras e símbolos reservados

    (while, int, :=) de identificadores definidos pelousuário? Tabela de palavras e símbolos reservados

    ...

    :=

    while

    int

  • 8/18/2019 1.Introducao a compilação

    10/22

    Como saber durante a compilação de um programa: tipo e valor dos identificadores, escopo das variáveis,

    número e tipo dos parâmetros de um procedimento, etc.? Tabela de símbolos

    ...

    ...--procfat

    ...1integervari

    ...ValorTipoClasseIdentificador

  • 8/18/2019 1.Introducao a compilação

    11/22

      !

    Reconhecimento e classificação dos tokens Expressões regulares, autômatos

    x:=x+y*2

  • 8/18/2019 1.Introducao a compilação

    12/22

      "

    Verificação da formação do programa

    Com base em uma gramática livre de contexto Representação explícita ou não da árvore de derivação

    comando_atribuição id1 := id1 op id2 op num

  • 8/18/2019 1.Introducao a compilação

    13/22

      "

    Verificação da formação do programa

    Com base em uma gramática livre de contexto Representação explícita ou não da árvore de derivação

    :=

    id1

    id1

    +

    *

    id2 num

  • 8/18/2019 1.Introducao a compilação

    14/22

      #

    Verificação do uso adequado

    id1 := id1 op id2 op num

    (id1)int := (id1 op id2 op num)intbusca_tabela_símbolos(id1)=TRUE

    busca_tabela_símbolos(id2)=TRUE

  • 8/18/2019 1.Introducao a compilação

    15/22

    $ "

    Geração de código intermediário/preliminar

    id1 := id1 op id2 op num

    temp1 := id2 * 2temp2 := id1 + temp1id1 := temp2

    Variáveistemporárias geradas

    pelo compilador 

    Código de trêsendereços 

  • 8/18/2019 1.Introducao a compilação

    16/22

    %&

    Otimização do código intermediário

    temp1 := id2 * 2temp2 := id1 + temp1

    id1 := temp2

    temp1 := id2 * 2id1 := id1 + temp1

    temp2 é usada apenasuma vez  atribuição

    de valor a id 1

  • 8/18/2019 1.Introducao a compilação

    17/22

    $

    Geração do código para a máquina-alvo

    temp1 := id2 * 2id1 := id1 + temp1

    MOV id2 R1MULT 2 R1

    MOV id1 R2ADD R1 R2MOV R2 id1

  • 8/18/2019 1.Introducao a compilação

    18/22

    Tokens e seus lexemas 

    Árvore sintática(implícita ou explícita)

    Tabela de

    símbolos única 

    Na prática, fases podem ser agrupadas e asrepresentações intermediárias entre elas nãoprecisam ser construídas explicitamente

  • 8/18/2019 1.Introducao a compilação

    19/22

    '

    Passagem: uma verificação ou transformação de umarepresentação de entrada em uma representação desaída

    Compiladores podem ter várias passagens Esquema anterior de compilação

    código-fonte

    código intermediário

    código-alvo Maior tempo de leitura e escrita

    Compilador de uma única passagem código-fonte código-alvo Todo processo de compilação em memória: dados de

    fases diferentes podem ser necessários para a compilação

  • 8/18/2019 1.Introducao a compilação

    20/22

    '

    Interpretadores: executam instrução por instrução docódigo-fonte

    Pré-processadores: agrupam módulos separados de código-fonte

    Processadores de macros (por exemplo, defines em C)

    Montadores (assemblers): traduzem linguagem demontagem em linguagem de máquina

    Carregadores: alocação de instruções de programação e

    dados na memória Editores de ligação: criação de um único programa a partir

    de diversos programas compilados

  • 8/18/2019 1.Introducao a compilação

    21/22

    ( programa-fonte 

    Pré-processador

    programa-fonte modificado 

    Compilador

    programa-objeto em assembly 

    Montador

    código de máquina relocável 

    código de máquina alvo 

    Editor de Ligação/Carregadorarquivos de bibliotecaarquivos-objeto relocáveis

  • 8/18/2019 1.Introducao a compilação

    22/22

    )

    Interpretadores Menores que os compiladores Mais adaptáveis a ambientes computacionais diversos Tempo de execução maior Javascript, Perl

    Compiladores Compila-se uma única vez, executando-se quantas vezes se

    queira Tempo de execução menor C, Pascal

    Compiladores híbridos Compila-se para um código intermediário/virtual, que, por sua

    vez, é interpretado por uma máquina virtual

    Java