1.3 – Interpretadores 1.3.1 – Compiladores versus Interpretadores Execução de um programa...

Click here to load reader

  • date post

    17-Apr-2015
  • Category

    Documents

  • view

    106
  • download

    1

Embed Size (px)

Transcript of 1.3 – Interpretadores 1.3.1 – Compiladores versus Interpretadores Execução de um programa...

  • Slide 1
  • 1.3 Interpretadores 1.3.1 Compiladores versus Interpretadores Execuo de um programa gerado por compilador: Execuo de um programa gerado por compilador: Programa fonte Programa em linguagem de mquina Dados Resultados Compilador + Montador Em tempo de compilao Em tempo de execuo
  • Slide 2
  • Execuo de um programa interpretado: Execuo de um programa interpretado: O interpretador faz anlise lxica, sinttica e semntica do programa-fonte, armazenando-o numa estrutura interna O interpretador faz anlise lxica, sinttica e semntica do programa-fonte, armazenando-o numa estrutura interna Em seguida, ele percorre a estrutura interna, executando as operaes ali especificadas, consumindo os dados por elas pedidos Em seguida, ele percorre a estrutura interna, executando as operaes ali especificadas, consumindo os dados por elas pedidos Programa fonte Programa numa estrutura interna Dados Resultados Mdulo de anlise e armazena- mento Mdulo de execuo Em Tempo de execuo Interpretador
  • Slide 3
  • Execuo de um programa interpretado: Execuo de um programa interpretado: No h criao de um programa em linguagem de mquina equivalente ao programa-fonte No h criao de um programa em linguagem de mquina equivalente ao programa-fonte O nico programa executado o interpretador O nico programa executado o interpretador Programa fonte Programa numa estrutura interna Dados Resultados Mdulo de anlise e armazena- mento Mdulo de execuo Em Tempo de execuo Interpretador
  • Slide 4
  • Exemplo: seja o comando de atribuio v1 = v2 + v3 * v4; Um interpretador pode construir-lhe uma rvore de execuo (estrutura interna): Um interpretador pode construir-lhe uma rvore de execuo (estrutura interna): = Depois ele caminha pela rvore, executando as operaes
  • Slide 5
  • Na raiz, ele faz uma atribuio da expresso do lado direito varivel do lado esquerdo Na raiz, ele faz uma atribuio da expresso do lado direito varivel do lado esquerdo No clculo dessa expresso, ele soma a varivel do lado esquerdo com a expresso do lado direito (chamada recursiva do clculo de expresso) No clculo dessa expresso, ele soma a varivel do lado esquerdo com a expresso do lado direito (chamada recursiva do clculo de expresso) =
  • Slide 6
  • H interpretadores de cdigo fonte e de cdigo intermedirio H interpretadores de cdigo fonte e de cdigo intermedirio Interpretador de cdigo fonte: Deve haver uma forma de armazenamento do programa fonte Interpretador de cdigo fonte: Deve haver uma forma de armazenamento do programa fonte Interpretador de cdigo intermedirio: o cdigo intermedirio pode ser gerado pelo mesmo processo usado nos compiladores Interpretador de cdigo intermedirio: o cdigo intermedirio pode ser gerado pelo mesmo processo usado nos compiladores
  • Slide 7
  • 1.3.2 Interpretadores de cdigo-fonte Durante a anlise sinttica, o programa-fonte armazenado numa estrutura denominada rvore do programa Durante a anlise sinttica, o programa-fonte armazenado numa estrutura denominada rvore do programa Depois, essa estrutura percorrida, para que os comandos do programa sejam executados Depois, essa estrutura percorrida, para que os comandos do programa sejam executados Exemplo: programa para o Bubble-Sort Exemplo: programa para o Bubble-Sort
  • Slide 8
  • void main () { int n, i, p, aux, vetor[50]; char trocou; read (n); for (i=0; i=0 && trocou == 1; p--) { trocou = 0; for (i = 0; i vetor[i+1]) { aux = vetor[i]; vetor[i] = vetor[i+1]; vetor[i+1] = aux; trocou = 1; }} for (i=0; i
  • Exemplo: lao do programa anterior: for (i = 0; i vetor[i+1]) { aux = vetor[i]; vetor[i] = vetor[i+1]; vetor[i+1] = aux; trocou = 1; } Suas qudruplas com alguma otimizao: Suas qudruplas com alguma otimizao:
  • Slide 18
  • A propsito, qudruplas para indexao: Sejam as seguintes declaraes e comandos: Sejam as seguintes declaraes e comandos: int i, j, k, A[6][5]; i = 4; j = 3; k = A[i][j-2]; A[10-i][2*j+3] = i + j * k; Acesso a um elemento genrico A[i][j]: Acesso a um elemento genrico A[i][j]: Uma vez conhecido o endereo inicial da matriz A, necessrio localizar o elemento A[i][j] Uma vez conhecido o endereo inicial da matriz A, necessrio localizar o elemento A[i][j] Seja a seguir o mapa de A[6][5] na memria: Seja a seguir o mapa de A[6][5] na memria:
  • Slide 19
  • Seja m o nmero de linhas e n o nmero de colunas da matriz A Seja m o nmero de linhas e n o nmero de colunas da matriz A O endereo do elemento A[i][j] dado pela frmula: O endereo do elemento A[i][j] dado pela frmula: Ender (A) + i * n + j Para m = 6, n = 5, o endereo de A[4][3] Para m = 6, n = 5, o endereo de A[4][3] Ender (A) + 23
  • Slide 20
  • No programa, cada ndice pode ser uma expresso inteira No programa, cada ndice pode ser uma expresso inteira Calcula-se o valor de cada ndice, empilhando-o numa pilha de ndices Calcula-se o valor de cada ndice, empilhando-o numa pilha de ndices Isso pode ser feito pela execuo de uma qudrupla de operador IND: Isso pode ser feito pela execuo de uma qudrupla de operador IND: IND, i, ----, ---- IND, i, ----, ---- IND, j, ----, ---- IND, j, ----, ----
  • Slide 21
  • Calcula-se o endereo de A[i][j], usando uma qudrupla de operador INDEX: Calcula-se o endereo de A[i][j], usando uma qudrupla de operador INDEX: INDEX, A, 2, temp1 Sua execuo consiste em: Sua execuo consiste em: Pegar as dimenses e o endereo de A na tabela de smbolos Pegar as dimenses e o endereo de A na tabela de smbolos Desempilhar dois ndices Desempilhar dois ndices Calcular o endereo, colocando-o na varivel temp1 Calcular o endereo, colocando-o na varivel temp1 A varivel temp1 portanto um ponteiro A varivel temp1 portanto um ponteiro
  • Slide 22
  • Formao do cdigo intermedirio: Formao do cdigo intermedirio: int i, j, k, A[6][5]; i = 4; j = 3; k = A[i][j-2] + 5; A[10-i][2*j+3] = i+j*k; :=, 4,..., i :=, 3,..., j IND, i,...,... -, j, 2, temp1 IND, temp1,...,... INDEX, A, 2, temp2 @, temp2,..., temp3 +, temp3, 5, k temp2 tem o endereo do elemento A[i][j-2] necessrio saber o valor guardado nesse elemento A qudrupla @, temp2,..., temp3 atribui a temp3 o valor do local apontado por temp2
  • Slide 23
  • Formao do cdigo intermedirio: Formao do cdigo intermedirio: int i, j, k, A[6][5]; i = 4; j = 3; k = A[i][j-2] + 5; A[10-i][2*j+3] = i+j*k; :=, 4,..., i :=, 3,..., j IND, i,...,... -, j, 2, temp1 IND, temp1,...,... INDEX, A, 2, temp2 @, temp2,..., temp3 +, 5, temp3, k -, 10, i, temp4 IND, temp4,...,... *, 2, j, temp5 +, temp5, 3, temp6 IND, temp6,...,... INDEX, A, 2, temp7 *, j, k, temp8 +, i, temp8, temp9 #, temp9,..., temp7 temp7 tem o endereo do elemento A[10-i][2*j+3] O valor de temp9 deve ser atribudo ao local apontado por temp7 A qudrupla #, temp9,..., temp7 atribui o valor de temp9 ao local apontado por temp7
  • Slide 24
  • Voltando ao lao do programa anterior: for (i = 0; i vetor[i+1]) { aux = vetor[i]; vetor[i] = vetor[i+1]; vetor[i+1] = aux; trocou = 1; } Suas qudruplas: Suas qudruplas:
  • Slide 25
  • Estrutura de dados So omitidos vrios ponteiros As qudruplas poderiam ser guardadas numa lista encadeada ao invs de num vetor
  • Slide 26
  • Desvantagens da interpretao: A execuo de programas compilados muito mais rpida que a de programas interpretados A execuo de programas compilados muito mais rpida que a de programas interpretados Apesar do cdigo intermedirio ser aperfeioado antes da interpretao propriamente dita, o cdigo objeto ainda pode ser otimizado Apesar do cdigo intermedirio ser aperfeioado antes da interpretao propriamente dita, o cdigo objeto ainda pode ser otimizado Isso no ocorre em programas interpretados Isso no ocorre em programas interpretados Um interpretador faz por software a interpretao do cdigo da operao; num programa compilado isso ocorre por hardware, o que muito mais rpido Um interpretador faz por software a interpretao do cdigo da operao; num programa compilado isso ocorre por hardware, o que muito mais rpido
  • Slide 27
  • Vantagens da interpretao: O cdigo intermedirio independente de mquina, o que lhe confere portabilidade O cdigo intermedirio independente de mquina, o que lhe confere portabilidade Um programa compilado s pode rodar em mquinas compatveis com sua mquina alvo Um programa compilado s pode rodar em mquinas compatveis com sua mquina alvo Interpretadores se mostram adequados para as redes de computadores heterogneos, que o caso da Internet Interpretadores se mostram adequados para as redes de computadores heterogneos, que o caso da Internet A elaborao de um mdulo interpretador propriamente dito muito mais simples que a de uma retaguarda de compilador A elaborao de um mdulo interpretador propriamente dito muito mais simples que a de uma retaguarda de compilador
  • Slide 28
  • Os detalhes da arquitetura da mquina-alvo complicam muito o projeto da retaguarda Os detalhes da arquitetura da mquina-alvo complicam muito o projeto da retaguarda Para casos em que a rapidez de execuo no fundamental, os interpretadores so preferidos, em comparao com os compiladores Para casos em que a rapidez de execuo no fundamental, os interpretadores so preferidos, em comparao com os compiladores A Linguagem Java: Seu compilador gera cdigo denominado bytecode, independente de mquina Seu compilador gera cdigo denominado bytecode, independente de mquina Bytecode traduzido para linguagem de mquina por uma mquina virtual residente em qualquer ambiente Java Bytecode traduzido para linguagem de mquina por uma mquina virtual residente em qualquer ambiente Java Bytecode portvel, porm, para ser executado, deve ser traduzido, o que torna o processo mais lento Bytecode portvel, porm, para ser executado, deve ser traduzido, o que torna o processo mais lento
  • Slide 29
  • 1.4 Automao da Construo de Compiladores 1.4.1 Bootstrapping e compiladores cruzados O compilador para a primeira linguagem de programao s poderia ter sido escrito em Assembly O compilador para a primeira linguagem de programao s poderia ter sido escrito em Assembly Assim foi com Fortran e Cobol Assim foi com Fortran e Cobol Seus projetos demandaram esforo de programao descomunal Seus projetos demandaram esforo de programao descomunal
  • Slide 30
  • No princpio: Assembler Mquina M1
  • Slide 31
  • Primeiro compilador Fortran, escrito em Assembly: Assembler Mquina M1 Fortran em Assembly Fortran em M1
  • Slide 32
  • Compilador Algol, escrito em Fortran: Assembler Mquina M1 Fortran em Assembly Fortran em M1 Algol em Fortran Algol em M1
  • Slide 33
  • Compilador Pascal, escrito em Algol: Assembler Mquina M1 Fortran em Assembly Fortran em M1 Algol em Fortran Algol em M1 Pascal em Algol Pascal em M1
  • Slide 34
  • Compilador C, escrito em Pascal: Assembler Mquina M1 Fortran em Assembly Fortran em M1 Algol em Fortran Algol em M1 Pascal em Algol Pascal em M1 C em Pascal C em M1
  • Slide 35
  • Em UNIX, compiladores L1, L2,..., escritos em C: Assembler Mquina M1 Fortran em Assembly Fortran em M1 Algol em Fortran Algol em M1 Pascal em Algol Pascal em M1 C em Pascal C em M1 L1 em C L2 em C L1 em M1 L2 em M1
  • Slide 36
  • Em UNIX, compiladores C eram escritos em C: Assembler Mquina M1 Fortran em Assembly Fortran em M1 Algol em Fortran Algol em M1 Pascal em Algol Pascal em M1 C em Pascal C em M1 C 1 em C C 2 em C C 1 em M1 C 2 em M1
  • Slide 37
  • Bootstrapping: propriedade de uma linguagem compilar a si mesma Bootstrapping: propriedade de uma linguagem compilar a si mesma Compilador cruzado: compilador que roda numa mquina e gera cdigo para outra Compilador cruzado: compilador que roda numa mquina e gera cdigo para outra Para uma mquina M2, seria necessrio escrever um programa em Assembly para um primeiro compilador? Para uma mquina M2, seria necessrio escrever um programa em Assembly para um primeiro compilador? Com bootstrapping e compiladores cruzados pode-se evitar isso (visto a seguir) Com bootstrapping e compiladores cruzados pode-se evitar isso (visto a seguir)
  • Slide 38
  • Um compilador caracterizado por 3 linguagens: Um compilador caracterizado por 3 linguagens: A linguagem-fonte (F) que ele compila A linguagem-fonte (F) que ele compila A linguagem-objeto (O) para a qual ele gera cdigo A linguagem-objeto (O) para a qual ele gera cdigo A linguagem de implementao (I) na qual ele est escrito A linguagem de implementao (I) na qual ele est escrito Simbolicamente, F I O Simbolicamente, F I O Ou, usando diagrama T: Ou, usando diagrama T: F O I
  • Slide 39
  • Seja M usado para denotar a linguagem de mquina de um computador ou mquina M Seja M usado para denotar a linguagem de mquina de um computador ou mquina M Para um compilador rodar na mquina M, sua linguagem de implementao deve ser M Para um compilador rodar na mquina M, sua linguagem de implementao deve ser M F O M
  • Slide 40
  • Seja um compilador L1 M M residindo na mquina M Seja um compilador L1 M M residindo na mquina M Deseja-se em M um compilador para uma nova linguagem L2, ou seja, L2 M M Deseja-se em M um compilador para uma nova linguagem L2, ou seja, L2 M M Primeiramente escreve-se um programa L2 L1 M Primeiramente escreve-se um programa L2 L1 M Depois roda-se na mquina M: Depois roda-se na mquina M: L2 M L1 L1 M M L2 M M Entrada Programa em execuo Sada O compilador de L2 est pronto para rodar em M
  • Slide 41
  • Esquema para se obter um compilador cruzado: Esquema para se obter um compilador cruzado: Agora em M1, um compilador de L2 para a mquina M2 Agora em M1, um compilador de L2 para a mquina M2 Os programas escritos em L2 so compilados em M1 e o cdigo objeto transportado para M2 Os programas escritos em L2 so compilados em M1 e o cdigo objeto transportado para M2 L2 M2 L1 L1 M1 M1 L2 M2 M1 Entrada Compilador residindo em M1, em execuo Sada
  • Slide 42
  • Seja ento L a primeira linguagem a ser instalada na mquina M2, mas j instalada na mquina M1 (L M1 M1) Seja ento L a primeira linguagem a ser instalada na mquina M2, mas j instalada na mquina M1 (L M1 M1) Primeiramente, bootstrapping: L L M2 Primeiramente, bootstrapping: L L M2 Depois, produz-se em M1 um compilador cruzado Depois, produz-se em M1 um compilador cruzado Finalmente, usando em M1 o compilador cruzado produzido Finalmente, usando em M1 o compilador cruzado produzido s transportar L M2 M2 para a mquina M2 s transportar L M2 M2 para a mquina M2 L M2 L L M1 M1 L M2 M1 Entrada Programa em execuo Sada Programa em execuo Entrada L M2 M2 Sada Compilador desejado
  • Slide 43
  • 1.4.2 Compiladores de compiladores As ferramentas de automao, logo que comearam a surgir, receberam alguns nomes um tanto ambiciosos: As ferramentas de automao, logo que comearam a surgir, receberam alguns nomes um tanto ambiciosos: Geradores de compiladores Geradores de compiladores Compiladores de compiladores Compiladores de compiladores Sistemas de construo de tradutores Sistemas de construo de tradutores
  • Slide 44
  • 1.4.2 Compiladores de compiladores Eram ferramentas de uso limitado, pois eram orientadas em torno de modelos particulares de linguagens Eram ferramentas de uso limitado, pois eram orientadas em torno de modelos particulares de linguagens Devido grande heterogeneidade das linguagens e das arquiteturas, muito difcil a elaborao de um gerador de propsitos gerais eficiente Devido grande heterogeneidade das linguagens e das arquiteturas, muito difcil a elaborao de um gerador de propsitos gerais eficiente O que existe hoje so ferramentas automticas para o projeto de componentes especficos, relacionados a seguir O que existe hoje so ferramentas automticas para o projeto de componentes especficos, relacionados a seguir
  • Slide 45
  • 1.4.3 Ferramentas para cada componente Utilizam linguagens especializadas para a especificao e implementao do componente e algoritmos bem sofisticados Geradores de analisadores lxicos: Tm como entrada expresses regulares e implementam um autmato finito reconhecedor e classificador dos tomos dos programas a serem compilados Tm como entrada expresses regulares e implementam um autmato finito reconhecedor e classificador dos tomos dos programas a serem compilados A mais conhecida entre elas o Lex do sistema Unix, que possui tambm verses para o sistema DOS A mais conhecida entre elas o Lex do sistema Unix, que possui tambm verses para o sistema DOS O programa gerado escrito em Linguagem C O programa gerado escrito em Linguagem C
  • Slide 46
  • 1.4.3 Ferramentas para cada componente Geradores de analisadores sintticos: Tm como entrada a gramtica livre de contexto da linguagem-fonte do compilador Tm como entrada a gramtica livre de contexto da linguagem-fonte do compilador Nos compiladores primitivos, a anlise sinttica consumia grande frao do tempo de compilao e do esforo intelectual para escrever um compilador Nos compiladores primitivos, a anlise sinttica consumia grande frao do tempo de compilao e do esforo intelectual para escrever um compilador Hoje considerada uma das fases mais fceis de serem implementadas Hoje considerada uma das fases mais fceis de serem implementadas
  • Slide 47
  • 1.4.3 Ferramentas para cada componente Geradores de analisadores sintticos: Utilizam algoritmos de analise muito eficientes, porm muito complexos para serem implementados mo Utilizam algoritmos de analise muito eficientes, porm muito complexos para serem implementados mo A mais conhecida: Yacc (Yet Another Compiler-Compiler) do sistema UNIX que tambm possui diversas verses para o sistema DOS A mais conhecida: Yacc (Yet Another Compiler-Compiler) do sistema UNIX que tambm possui diversas verses para o sistema DOS O programa gerado tambm escrito em Linguagem C O programa gerado tambm escrito em Linguagem C
  • Slide 48
  • 1.4.3 Ferramentas para cada componente Geradores de cdigo intermedirio: Produzem uma coleo de rotinas que, ao caminhar pela rvore sinttica do programa, j com atributos calculados pelo analisador semntico, produzem o cdigo intermedirio Produzem uma coleo de rotinas que, ao caminhar pela rvore sinttica do programa, j com atributos calculados pelo analisador semntico, produzem o cdigo intermedirio Analisadores de fluxo de dados: Importante ferramenta para a otimizao do cdigo intermedirio Importante ferramenta para a otimizao do cdigo intermedirio
  • Slide 49
  • 1.4.3 Ferramentas para cada componente Geradores de cdigo objeto: Recebem como entrada uma coleo de regras que definem a traduo de cada tipo de comando do cdigo intermedirio em cdigo de mquina ou Assembly Recebem como entrada uma coleo de regras que definem a traduo de cada tipo de comando do cdigo intermedirio em cdigo de mquina ou Assembly Essas regras devem incluir detalhes suficientes para se escolher os locais adequados para alocao de variveis (registradores, memria, pilha, etc) Essas regras devem incluir detalhes suficientes para se escolher os locais adequados para alocao de variveis (registradores, memria, pilha, etc)