CAP. VII GERAÇÃO DE CÓDIGO

Documentos relacionados
Compiladores e Computabilidade

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Introdução à Programação

CAP. VI ANÁLISE SEMÂNTICA

Arquitetura e Organização de Computadores

Arquitetura e Organização de Computadores

Métodos de implementação de linguagens. Kellen Pinagé

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

Construção de Compiladores Aula 5 - Variáveis

Projeto de Compiladores

Lembrando análise semântica. Compiladores. Implementação de esquemas de tradução L-atribuídos. Exemplo de implementação top-down (1)

Linguagens de Programação Classificação

Processadores para computação de alto desempenho

Compiladores I Prof. Ricardo Santos (cap 1)

Linguagem de Montagem do NeanderX

PROGRAMAÇÃO I. Introdução

William Stallings Arquitetura e Organização de Computadores 8 a Edição

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Síntese. Prof. Geovane Griesang

Compiladores. Introdução à Compiladores

Algoritmos Computacionais

ORGANIZAÇÃO DE COMPUTADORES CAPÍTULO 6: PROCESSADORES. Prof. Juliana Santiago Teixeira

TÉCNICO DE INFORMÁTICA - SISTEMAS

Organização e Arquitetura de Computadores I

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação

Estruturas de Dados Aula 1: Introdução e conceitos básicos 28/02/2011

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Ferramentas Programação. UDESC - Prof. Juliano Maia 1

Primeiro Trabalho de POO Emulador para o Processador Winter

Arquitetura de Computadores. Professor: Vilson Heck Junior (Material: Douglas Juliani)

Noções de algoritmos - Aula 1

Todo processador é constituído de circuitos capazes de realizar algumas operações primitivas:

Arquitetura e Organização de Computadores

Expressões, Atribuições, Entrada e Saída. Givanaldo Rocha

INE5622 INTRODUÇÃO A COMPILADORES

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Processador. Processador

Algoritmos. Prof. Jonatas Bastos Site:

Capítulo 2 Operadores. A função scanf()

Prof. Leonardo Augusto Casillo

Capítulo 7. Expressões e Sentenças de Atribuição

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

Aula 4 Estruturas Condicionais

Introdução à Computação MAC0110

Fábio Rodrigues / Israel Lucania

Como construir um compilador utilizando ferramentas Java

MAC2166 Introdução à Computação Aula 1 Como Funciona um Computador

Tópicos Avançados em Sistemas Computacionais: Infraestrutura de Hardware Aula 06

Algoritmos e Técnicas de Programação Introdução Givanaldo Rocha de Souza

SSC510 Arquitetura de Computadores 1ª AULA

Introdução à Computação: Máquinas Multiníveis

Conceitos Básicos Processador

Compiladores. Conceitos Básicos

Organização de Sistemas de Computadores

ORGANIZAÇÃO DE COMPUTADORES

Sistemas Operacionais

PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA

EXPRESSÕES ARITMÉTICAS PARTE 1

Linguagem de Maquina II. Visão Geral

Lógica de Programação: aula 2. Dariel Mazzoni Maranhão. Uninove: Universidade Nove de Julho. 22 de agosto de 2010

Introdução à Computação: Arquitetura von Neumann

CONCEITOS DE ALGORITMOS

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc.

2º Estudo Dirigido CAP 3

Linguagens de Programação. Marco A L Barbosa

Introdução. Tradutores de Linguagens de Programação

2. A influência do tamanho da palavra

25/8/2010. Praticamente todas as arquiteturas de computadores fornecem mais de um modo de

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Sistemas de Computação. Instruções de Linguagem de Máquina

Apêndice A. Pseudo-Linguagem

Organização e Arquitetura de Computadores INTRODUÇÃO

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

Linguagens de Programação Aula 3

ELETRÔNICA DIGITAL II. AUTOR: ENG. ANTONIO CARLOS LEMOS JÚNIOR

Variável. Expressões. Atribuição. Tipos básicos Declaração. Aritméticas Lógicas. Professor Leandro Augusto Frata Fernandes

AGT0001 Algoritmos Aula 01 O Computador

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Introdução à Computação

Mensagens de Erro do Compilador

Disciplina: Arquitetura de Computadores

Aula 23: Noções de Compilação, Montagem, Link-edição, e Interpretação

Slides trabalhados durante a quinta aula

Ambiente de desenvolvimento

ALGORITMOS 3ª Aula. 3. Introdução Tipos de dados, variáveis e operadores Tipos de dados

Compiladores. J.L.Rangel - Compiladores - 1-1

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

NEANDERWIN. Algumas características do processador Neander são:

C Operadores e Expressões

Variáveis primitivas e Controle de fluxo

INFORMÁTICA APLICADA AULA 03 LINGUAGEM DE PROGRAMAÇÃO C++

Unidade Central de Processamento UCP (CPU)

Conjunto de Instruções

Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores. Organização Básica de Computadores

Algoritmos I Aula 13 Linguagem de Programação Java

As fases de um compilador

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Operadores relacionais e lógicos estruturas condicionais If...

Compiladores. Fabio Mascarenhas

Transcrição:

CAP. VII GERAÇÃO DE CÓDIGO VII. 1 - INTRODUÇÃO Léxica Análise Sintática Semântica Compilação G.C. intermediário Síntese Otimização de código Geração de código Síntese Tradução do programa fonte (léxica, sintática e semanticamente correto) para um programa objeto equivalente. Estabelecimento de um significado (uma semântica) para o programa fonte, em termos de um código executável (diretamente ou via interpretação). 1

Esquema de tradução dirigida pela sintaxe Geração de cód. Interm. ou executável. Uso de ações de geração de código Similares às ações semânticas Inseridas na G.L.C. Ativadas pelo Parser ou A. Semântico pode ser integrado ao semântico Generalizando: Ações semânticas Ações de verificação Ações de geração de código Na prática... Unificação de ações de Verificação semântica e de Geração de Código 2

CÓD. INTERMEDIÁRIO X CÓD. BAIXO NÍVEL MÁQUINA HIPOTÉTICA X MÁQUINA REAL VII.2 - CÓDIGO INTERMEDIÁRIO Representação intermediária entre o programa fonte (L. alto nível) e o programa objeto (L. baixo nível). Vantagens Geração menos complexa Abstração de detalhes da máquina real Repertório de instruções definido em função das construções da linguagem fonte Facilidades para geração de código executável em um passo subseqüente Representação uniforme Facilita otimização Redução do tempo de execução e/ou do tamanho do código gerado 3

Possibilita interpretação Aumento da portabilidade Diferentes interpretadores ou geradores de código para diferentes máquinas Base necessária para construção de Just-in-time Compilers Exemplos: máquina P (Pascal) JVM (Java) Facilita extensibilidade Via introdução de novas construções Via sofisticação do ambiente operacional Desvantagens Acréscimo do tempo de compilação Passo extra para geração de código objeto a partir do código intermediário. Aumento do projeto total Necessidade de definição de uma Linguagem intermediária. Necessidade de definição de uma máquina hipotética Necessidade de um interpretador para validação do código intermediário Quando o C.I. é o código alvo... Tempo de execução (via interpretação) maior se comparado com cód. compilado. 4

Formas de código intermediário 1. Triplas e Quádruplas Instruções Operador Operando 1, operando 2, [resultado] Operadores Aritméticos, lógicos, armaz., desvio, carga,... Exemplos: Triplas : w * x + (y +z) (1) *, w, x (2) +, y, z (3) +, (1), (2) Quádruplas: (A + B) * (C + D) E +, A, B, T 1 +, C, D, T 2 *, T 1, T 2, T 3 -, T 3, E, T 4 OBS.: 1. Quádruplas facilitam a otimização de código 2. Algoritmos de otimização clássicos (AHO e ULLMAN) são todos baseados em quádruplas. 3. Gerenciamento de temporárias é problemático 5

2. - Máquinas de PILHA (de Acumulador, ou de um Operando) O código é similar a um assembler simplificado Usa registradores apenas para funções especiais Usa uma PILHA para armazenar valores de Variáveis (globais e locais) e Resultado das operações realizadas. Formato das Instruções o Operador (Código da operação) o Operando o qual pode ser: referência a uma variável valor constante endereço de uma instrução Exemplo: D := A + B * C Usando Endereço Relativo 1 - LOAD A 4 - MULT - 2 - LOAD B 5 - SOMA - 3 - LOAD C 6 - ARMZ D Variável Nível Deslocamento LOAD 1,0 A 1 0 LOAD 1,1 B 1 1 LOAD 1,2 C 1 2 MULT -,- D 1 3 SOMA -,- ARMZ 1,3 3. Outras formas de CI Notação Polonesa, Árvores Sintáticas Abstratas 6

VII.3 - Máquinas Hipotéticas (virtuais, abstratas) Destinam-se a produção de compiladores e interpretadores + Portáveis e + Adaptáveis Composição Arquitetura Área de código Área de dados (pilha) Registradores o Uso geral o Uso específico Repertório de instruções Cjto de instruções que compõem a Ling. de máquina da MÁQUINA VIRTUAL Formato das instruções Dependente da arquitetura Pode ou não ser uniforme Ex: OP, operando OP, operando1, operando2[, operando3] Interpretador Simula o Hardware na execução do código da máquina Exemplos Máquina P (Pascal) JVM (Java) 7

VII.4 - UMA MÁQUINA HIPOTÉTICA DIDÁTICA OBJETIVOS: Dar uma visão completa do processo de compilação. Dar uma noção do processo de geração de código. Permitir a interpretação de programas exemplos Validar ações semânticas De verificação De geração de código 8

Definição da Arquitetura (* Baseada na máquina P, simplificada *) Área de instruções Contém as instruções a serem executadas Área de dados Alocação de dados manipulados pelas inst. Estrutura de pilha Cada célula ( ) 1 palavra (inteira) valores de constantes Contem: valores assumidos por var. ponteiro para estruturas resultados intermediários Registradores de uso específico PC Program Counter - aponta para a próxima instrução a ser executada (área de instruções) Topo Aponta para o topo da pilha usada como área de dados Base Aponta para o endereço (pos. na pilha) inicial de um segmento de dados Usado no cálculo de endereços (endereço = base (nível) + deslocamento) 9

Definição do repertório de instruções Definição do código intermediário Forma geral das instruções OPERADOR OPERANDO OPERADOR - código da instrução (mnemônico) OPERANDO - subdividido em PARTE1 e PARTE2 O significado depende da instrução - Exemplos: 1 Instruções que referenciam endereços: PARTE1 Nível PARTE2 Deslocamento 2 Instruções aritméticas PARTE1 e PARTE2 sem valor (Operam sobre topo/sub-topo da pilha) 3 Instruções de desvio PARTE1 sem valor PARTE2 Endereço de uma Instrução Grupos de instruções Aritméticas, lógicas e relacionais Carga/armazenamento Alocação de espaço para variáveis Fluxo o Desvios o Chamada / retorno de proc (método) Leitura, impressão Específicas Inicio e Fim de execução Nada (nop) 10

Instruções de carga e armazenamento CRVL l, a (* carrega valor de variável *) onde: l nível; a deslocamento Topo: = * + 1 Pilha [topo] : = Pilha [base (l) + a] CRCT, K (* carrega constante *) onde K é o valor da constante Topo : = topo + 1 Pilha [topo] : = K ARMZ l, a (* armazena conteúdo do topo da pilha no endereço (l + a) da pilha *) pilha [base (l) + a] : = pilha [topo] topo : = topo 1 Instruções aritméticas SOMA, (* operação de adição *) pilha [topo 1] : = pilha [topo - 1] + pilha [topo] topo : = topo 1 SUB, (* operação de subtração *) MULT, (* operação de multiplicação *) DIV, (* operação de divisão *) MUN, (* Menos UNário muda sinal *) 11

Instruções lógicas CONJ, (* operação and E *) se pilha [topo 1] = 1 e pilha [topo] = 1 então pilha [topo 1] : = 1 (true) verdadeiro senão pilha [topo 1] : = ø (false) falso ; topo : = topo 1 DISJ, (* Operação OR ou *) Se pilha [topo 1] = 1 ou [pilha topo] = 1... idem CONJ... NEGA, (* Operação NOT Não *) Pilha [topo] : = 1 pilha [topo] Instruções relacionais CMIG, (* Compara igual = *) Se pilha [topo 1] = pilha [topo] Então pilha [topo 1] : = 1 (true) Senão pilha [topo 1] : = ø (false) Topo: = topo 1 CMDF, (* Compara diferente <> *) CMMA, (* Compara maior > *) CMME, (* Compara menor < *) CMEI, (* Compara menor igual <= *) CMAI, (* Compara maior igual >= *) 12

Instruções de desvio DSVS, a (* desvia sempre para a instrução a *) PC := a DSVF, a (*se falso, desvia para a *) se pilha [topo ] = 0 (* falso *) entao PC := a; topo := topo 1 CALL l, a (* chamada de método *) RETU, (* retorno de método *) Alocação de espaço AMEM, a (* aloca a posições de memória *) topo := topo + a Entada / Saída (* operam com valores e endereços do topo da pilha *) LEIA, (* lê valor numérico *) IMPR, (* imprime valor numérico *) IMPRLIT, (* imprime literal *) Instruções auxiliares INICIO, (* define inicio da execução *) NADA, (* nada faz! *) FIM, (* define término da execução *) 13

REPERTÓRIO DE INSTRUÇÕES DA MV INICIO, (* Inicio da interpretação *) AMEM, a (* Aloca a posições de memória *) DMEM, a (* Desaloca a posições de memória *) CRVL l, a (* Carrega Variável *) CVET l, a (* Carrega Variável indexada uni-dim. *) CRVLIND l, a (* Carrega Valor indiretamente*) CREN l, a (* Carrega Endereço *) CRCT, k (* Carrega constante *) ARMZ l, a (* Armazena em uma var. *) AVET l, a (* Armazena em uma var. indexada uni-dim.*) ARMZIND l, a (* Armazena de forma indireta *) SOMA, (* Adição *) SUB, (* Subtração *) MULT, (* Multiplicação *) DIV, (* / Divisão *) MUN, (* Menos Unário *) CONJ, (* And *) E DISJ, (* Or *) Ou NEGA, (* Not *) Não CMIG, (* = *) CMDF, (* <> *) CMMA, (* > *) CMME, (* < *) CMEI, (* <= *) CMAI, (* >= *) DSVS, a (* Desvia sempre *) DSVF, a (* Desvia se falso *) CALL l, a (* Chama método *) RETU, (* retorna de método *) LEIA, (* Lê valor *) IMPR, (* Imprime valor numérico*) IMPRLIT, (* Imprime literal *) NADA, (* Nada faz *) FIM, (* Finaliza execução *) 14

VII.5 - Geração de Código Intermediário 1. Alocação de espaço para as variáveis decl A, B, C : inteiro; AMEM -, 3 decl X,Y : vetor [10] de real; AMEM -, 20 decl nome: cadeia [30]; AMEM -, 1 decl I : intervalo 1.. 10; AMEM -, 1 2. Comando de Leitura Leia ( A ) : LEIA -, - ARMZ A (* end. Relativo de A *) 3. Comando escreva Escreva ( total =, tot ) CRCT -, ind-tab-lit IMPRLIT -, - CRVL tot (* end. Relativo de tot *) IMPR -, - 4. Comando de atribuição Forma geral: VAR := EXPR ARMZ VAR Exemplo de um programa: decl A, B, C : inteiro; inicio leia (A, B); C := (A + B) * ( A B ) escreva ( resultado =, C); fim. CÓDIGO p/ EXPR 15

5. Comando enquanto-faca Forma geral: enquanto < E > faca < C > L1: NADA -, - <E> DSVF -, L2 <C> DSVS -, L1 L2: NADA -, - Exemplo:... I:= 1; enquanto I < N faça inicio escreva (I, I*I); I:= I + 1; Fim; 16

6. Comando se-entao / se-entao-senao 6.1 se-então Forma geral : se <E> entao <C> DSVF <E> -, L1 <C> L1: NADA -, - Exemplo : se A > B então MAIOR := A 6.2 - se-entao-senao Forma geral : se <E> entao <C1> senão <C2> <E> DSVF -, L1 <C1> DSVS -, L2 L1: <C2> L2: NADA -, - Exemplo : se A > B então MAIOR := A senão MAIOR := B 17

7. Comando repita-ate Forma geral : repita <C> ate <E> L1: NADA -, - <C> Exemplo : i:=0; repita inicio fim DSVF escreva (i); i := i + 1 ate i = 10; <E> -, L1 18

8. Estruturas de controle aninhadas Enquanto-faca Forma Geral: enquanto < E > faca < C > Pilha de controle PENQ [ TPE ] Ações de geração de código <C> ::= enquanto #w1 <E> #w2 faca <C> #w3 #w1 Gera instrução NADA, Guarda endereço da instr. NADA, em PENQ - TPE:= * +1 PENQ [TPE]:= PC #w2 Gera instrução DSVF,? Guarda endereço de DSVF em PENQ #w3 Completa DSVF do topo de PENQ com PC + 1 (próxima instrução) Decrementa TPE TPE:= * - 1 gera DSVS, PENQ [TPE] Decrementa TPE TPE:= * - 1 Exemplo:... I:= 1; enquanto I < N faca inicio K:= 1; enquanto K < M faca inicio escreva (I * K); K:= K + 1; fim; I:= I + 1; fim; 19

Se-entao-senao Forma Geral: se < E > entao < C1 > senao < C2> Pilha de controle PSE [ TPSE ] Ações de geração de código <C> ::= se <E> #Y1 entao <C> <else-parte> #Y3 <else-parte> ::= #Y2 senao <C> #Y1 - gera DSVF,? guarda endereço na PSE #Y2 - completa DSVF do topo de PSE com PC + 1; decrementa TPSE gera DSVS,? guarda endereço na PSE #Y3 - completa instrução do topo de PSEF PSE [TPSE]:= PC decrementa TPSE Exemplo: se A > B entao se A > C entao escreva (A) senão escreva (C) senão se B > C entao escreva (B) senao escreva (C); 20

Repita-ate forma geral: Repita <C> ate <E> (Pilha de controle PREP [ TPR ] ) Ações de geração de código <C> ::= repita #R1 <C> ate <E> #R2 #R1 empilha em PREP o end. da próx. instrução #R2 - Gera instrução DSVF, PREP[TPR] Desempilha o endereço armazenado em PREP Exemplo: i := 1; repita inicio j := 1; repita inicio escreva ( i * j ); j := j + 1 fim ate j > 10; i := i + 1 fim ate i > 10; 21

9. Constantes com Tipo Pilha CRCT, K CRCT 1, Ind.Tab.Literais CRCT 2, Ind.Tab.Reais 10. Variáveis Simples com Tipo Pilha Carga / Armazenamento CRVL l, a - CRVLX l, i i: Ind.Tab.Tipo_X ARMZ l, a ARMZX l, i nível deslocamento tipo nível Operações (Aritméticas, Lógicas, E/S) CMIG, CMIGX, x = tipo var CMIG X, SOMA, SOMAX, SOMA X, LEIA, LEIAX, LEIA X, IMPR, IMPR 1, (ou IMPLIT, ) IMPR 2, (ou IMPREAL, ) 22