Síntese. Compiladores. Geração de código intermediário. Linguagens Intermediárias. Modelo Clássico. Linguagens Intermediárias. Código intermediário



Documentos relacionados
Geração de código intermediário. Novembro 2006

Compiladores. Árvore de derivação anotada. Geração de TAC para as principais construções. tradução em código TAC de expressões

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

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Análise semântica. Análise Semântica. Estrutura de um compilador. Anotação da árvore sintática. Tipos de comunicação de atributos?

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

INE5317 Linguagens Formais e Compiladores. AULA 2: Es trutura geral dos Compiladores

Geração de Código Intermediário. Tradução dirigida por sintaxe. Código de três endereços - exemplo. Código de Três Endereços

UNIVERSIDADE DO OESTE DE SANTA CATARINA CAMPUS DE SÃO MIGUEL DO OESTE

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010

Sintaxe e Semântica. Fases da Compilação. programa fonte

Geração e Otimização de Código

Protótipo de Gerador de Código Executável no Ambiente FURBOL

Arquiteturas RISC. (Reduced Instructions Set Computers)

Introdução. A verificação de tipos pode ser estática e dinâmica

Análises Geração RI (representação intermediária) Código Intermediário

Conceitos de Linguagens de Programação

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

Pragmática das Linguagens de Programação 2004/2005

Compiladores. Geração de Código Intermediário

Unidade IV: Ponteiros, Referências e Arrays

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

PROGRAMA DE DISCIPLINA

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

Compiladores e Computabilidade

Componentes do Computador e. aula 3. Profa. Débora Matos

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

QUALIFICAÇÃO TÉCNICA EM DESENVOLVIMENTO DE SISTEMAS

Estrutura de Dados Básica

FBV - Linguagem de Programação II. Um pouco sobre Java

Expressões. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

Introdução à Programação

9 Comandos condicionais

Programação de Computadores III

LINGUAGENS E PARADIGMAS DE PROGRAMAÇÃO. Ciência da Computação IFSC Lages. Prof. Wilson Castello Branco Neto

JSP - ORIENTADO A OBJETOS

A Linguagem Algorítmica Estrutura de Repetição. Ex. 2

Programação de Computadores I. Linguagem C Vetores

Componentes da linguagem C++

Compiladores. Análise léxica. Plano da aula. Vocabulário básico. Motivação para análise léxica. Estrutura de um compilador

Primeiro Curso de Programação em C 3 a Edição

COMPILADORES E INTERPRETADORES

Arquitetura de Computadores - Arquitetura RISC. por Helcio Wagner da Silva

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

Arquitetura de Computadores. Tipos de Instruções

INF 1005 Programação I

AULA Uma linguagem de programação orientada a objetos

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

PROGRAMA DE DISCIPLINA

DESENVOLVIMENTO DE SOFTWARE II. Aula 07 A linguagem de programação C# e sua sintaxe

Orientação a Objetos

Web site. Objetivos gerais. Introdução. Profa. Patrícia Dockhorn Costa

Programação de Computadores I. Ponteiros

PROJETO LÓGICO DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar

Organização de Computadores 1

Programação Básica em Arduino Aula 2

Algoritmos e Programação Conceitos e Estruturas básicas (Variáveis, constantes, tipos de dados)

Processadores BIP. Conforme Morandi et al (2006), durante o desenvolvimento do BIP, foram definidas três diretrizes de projeto:

Hugo Pedro Proença, 2007

Computadores de Programação (MAB353)

Linguagens de Programação Aula 10

Capítulo 2: Introdução à Linguagem C

Árvores Binárias de Busca

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias:

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Pipeline. Todos os estágios devem estar prontos ao mesmo tempo para prosseguir.

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Introdução a POO. Introdução a Linguagem C++ e POO

Tabelas de Espalhamento

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

ARQUITETURA DE COMPUTADORES. Rogério Spindula Rosa

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

3 Classes e instanciação de objectos (em Java)

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

PROTÓTIPO DE GERADOR DE CÓDIGO EXECUTÁVEL A PARTIR DO AMBIENTE FURBOL

VIII. VARIÁVEIS. Tabela I ARQUITETURA DA MEMÓRIA. 0x0000 0x34 0x0001 0xB0 0x0002 0x23. 0xFFFF 0x00

Internet e Programação Web

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

Algoritmo. Linguagem natural: o Ambígua o Imprecisa o Incompleta. Pseudocódigo: o Portugol (livro texto) o Visualg (linguagem) Fluxograma

Técnicas de Programação II

Algoritmos e Programação de Computadores

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Estruturas de entrada e saída

Linguagens de programação

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Algoritmos e Programação Estruturada

Aula teórica 3. Tema 3.Computadores e linguagens Linguagens de Programação Compilação e linkagem LP Java. Preparado por eng.

ESTRUTURA DE DADOS PILHA

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Transcrição:

Síntese Compiladores Código intermediário 1 Os assuntos apresentados trazem respostas às perguntas seguintes: 1. Pode a memória ser alocada dinamicamente? 2. Pode a memória ser liberada explicitamente? Heap vs. Pilha 3. Procedimentos podem ser recursivos? Pilha de ativação 4. O que acontece com valores de nomes quando o controle retorna de uma ativação? 5. Pode um procedimento referenciar nomes não locais? Ponteiros de acesso 6. Como os parâmetros são passados quando procedimentos são chamados? Passagem de parâmetros 7. Podem procedimentos ser chamados como parâmetros? 8. Podem procedimentos ser retornados como resultados? 2 Geração de código intermediário Modelo Clássico Vantagens transformação em mais de um passo: Possibilita a otimização do código intermediário para prover um código otimizado mais eficiente Simplifica a implementação do compilador, resolvendo gradativamente as dificuldades de passagem de código fonte para código intermediário Possibilita a tradução de código intermediário string de caracteres para diversas máquinas 3 4 tokens parse tree parse tree MIR LIR código de máquina relocável Linguagens Intermediárias Tipos de código intermediário float a[20][10] HIR MIR LIR t1 a[i,j+2] t1 j+2 t2 i*20 t3 t1 + t2 t4 4 * t3 t5 addr a t6 t5 + t4 t7 *t6 HIR High Intermediate Representation MIR Medium Intermediate Representation LIR Low Intermediate Representation r1 [fp-4] r2 r1 + 2 r3 [fp-8] r4 r3 * 20 r5 r4 + r2 r7 fp - 216 f1 [r7+r6] floating-point register array base i j 5 Linguagens Intermediárias HIR: Usada nos primeiros estágios do compilador Simplificação de construções gramaticais para somente o essencial para otimização/geração de código MIR: Boa base para geração de código eficiente Pode expressar todas características de linguagens de programação de forma independente da linguagem Representação de variáveis, temporários, registradores LIR: Quase 1-1 para linguagem de máquina Dependente da arquitetura 6

Linguagens Intermediárias HIR: Árvore e grafo de sintaxe Tipos de código intermediário HIR e MIR: Árvore e grafo de sintaxe Notações Pós-fixada e Pré-fixada: Representações linearizadas MIR: Código de três endereços: quádruplas triplas LIR: Instruções assembler 7 Árvore de sintaxe Forma condensada da árvore de derivação As cadeia de produções simples (A B, B C) não aparecem Grafo de sintaxe Inclui simplificações da árvore de sintaxe Faz a fatoração de subexpressões comuns 8 HIR: Notações pós e pré-fixadas Código de três endereços (TAC) Infixada (a+b)*c Pós-fixada ab+c* Pré-fixada *+abc Cada instrução referencia, no máximo, três variáveis (endereços de memória) Necessita variáveis temporárias! As instruções possíveis são as seguintes a*(b+c) a+b*c abc+* *a+bc abc*+ +a*bc Geração de çódigo fácil com uma pilha! A := B op C A := op B A := B goto L If A op_rel B goto L 9 10 Representação de TAC para A := B*(-C+D) TAC (0) (1) (2) (3) (0) (1) (2) Quadruplas oper arg1 -u C + T1 * B := T3 Triplas oper arg1 -u C + (0) * B arg2 D T2 arg2 D (1) result T1 T2 T3 A Geração de código de três endereços: Expressões Declarações (escopo simples) Declarações (escopos aninhados) Comandos de atribuição Arrays e Registros Expressões booleanas Comandos de decisão Comandos de iteração (3) := A (2) 11 12

Esquema de tradução código de 3-endereços Esquema de tradução de código de 3-endereços S id := E E E 1 + E 2 E E 1 * E 2 E (E 1 ) E id : A := X + Y * Z T1 := Y * Z T2 := X + T1 A := T2 S id :=E {S.cod = E.cod geracod(id.nome := E.nome)} E E 1 + E 2 {E.nome = geratemp; E.cod = E 1.cod E 2.cod geracod (E.nome := E 1.nome + E 2.nome} E E 1 * E 2 {E.nome = geratemp; E.cod = E 1.cod E 2.cod geracod (E.nome := E 1.nome * E 2.nome} E (E 1 ) {E.nome = E 1.nome; E.cod = E 1.cod } Usa-se dois mecanismos: E id {E.nome = id.nome; E.cod = } 2. O atributo nome amrazena o nome da variável 3. A função geracod escreve (na tela) código 13 14 Árvore de derivação anotada A := X + Y * Z 15 (Detalhe) Reapoveitamento de temporários Deve-se poupar os temporários Usa-se um contador Valor inicial: 1 Acrescentado a cada geração de novo temporário Decrescentado a cada uso de um temporário como operando. : X := A*B + C*D E*F Necessita apenas 2 temporários. 16 TAC Geração de código de três endereços: Expressões Declarações (escopo simples) Declarações (escopos aninhados) Comandos de atribuição Arrays e Registros Expressões booleanas Comandos de decisão Comandos de iteração 17 Declarações Associar posições de memória para nomes locais de procedimentos Atualizar na tabela de símbolos: endereço de memória relativo: base da área estática de dados dados locais no registro de ativação Geração de endereços pode ter máquina alvo em mente: ex. inteiros consecutivos diferem de 4 bytes 18

Declarações Em linguagens como C, Pascal e Fortran, variáveis de um mesmo procedimento pertencem a um mesmo grupo Indexação base + deslocamento Antes da primeira declaração zera o deslocamento Para cada declaração processada: criar entrada na tabela de símbolos com deslocamento igual ao deslocamento atual incrementar o valor do deslocamento proporcional ao tamanho do objeto definido na declaração Declarações Usar tradução dirigida pela sintaxe: atributos: tipo tamanho deslocamento Rotina Suporte: adsimb(nome, tipo, deslocamento): cria uma nova entrada na tabela de símbolos para nome, confere o mesmo tipo e o endereço relativo deslocamento array(num, tipo) ponteiro(tipo) 19 20 Cálculo de tamanhos: inteiro: 4 bytes real: 8 bytes array: número de elementos x tamanho do tipo apontador: 4 bytes P {deslocamento := 0} D 21 22 P {deslocamento := 0} D P M D M {deslocamento := 0} ε Esquema de tradução tabela de símbolos bloco unitário P MD M ε {desloc = 0} D D ; D {adsimb (id.nome, T.tipo, desloc); desloc = desloc + T.tam} T int {T.tipo = int; T.tam = 4} T real {T.tipo = real; T.tam = 8} T array [num] of T 1 {T.tipo = array(num.val, T 1.tipo); T.tam = num.val* T 1.tam} 23 T T 1 {T.tipo = ponteiro(t 1.tipo); T.tam = 4} 24

Árvore de derivação - a: int; b: real; ε TAC Geração de código de três endereços: Expressões Declarações (escopo simples) Declarações (escopos aninhados) Comandos de atribuição Arrays e Registros Expressões booleanas Comandos de decisão Comandos de iteração 25 26 Controlando Escopo Controlando Escopo Como estender para múltiplos escopos? Cada procedimento possui um escopo onde endereços relativos devem ser criados Usar uma tabela de símbolos para cada escopo P MD M ε D D; D 27 D proc id; ND; S N ε 28 Ações semânticas Estruturas auxiliares geratab(anterior): cria uma tabela de símbolos retornando um apontador para a mesma. Guarda o valor anterior para a tabela criada anteriormente adsimb(tabela, nome, tipo, deslocamento) cria uma nova entrada para nome na tabela de símbolos deftam(tabela, largura): registra a largura acumulada de todas as entradas de tabela no cabeçalho associado a tabela de símbolos adproc(tabela, nome, tipo, deslocamento) cria uma nova entrada para o nome de procedimento nome Pilhas de tabela de símbolos (tabptr) Pilhas de deslocamentos (desloc) 29 30 na tabela de símbolos

: esquema de tradução para gerar : esquema de tradução para gerar P MD M ε D D; D P MD {deftam(top(tabptr),top(desloc)); pop(tabptr); pop(desloc)} D proc id; ND; S N ε T int T real T array [num] of T 1 M ε D D; D D proc id; ND; S T ^T 1 31 32 : esquema de tradução para gerar P MD M ε D D; D {deftam(top(tabptr),top(desloc)); pop(tabptr); pop(desloc)} {t=geratab(nil); push(t,tabptr); push(0,desloc)} : esquema de tradução para gerar P MD M ε D D; D {deftam(top(tabptr),top(desloc)); pop(tabptr); pop(desloc)} {t=geratab(nil); push(t,tabptr); push(0,desloc)} {adsimb (top(tabptr),id.nome, T.tipo, top(desloc)); top(desloc) =top(desloc) + T.tam} D proc id; ND; S 33 D proc id; ND; S 34 : esquema de tradução para gerar : esquema de tradução para gerar P MD M ε D D; D {deftam(top(tabptr),top(desloc)); pop(tabptr); pop(desloc)} {t=geratab(nil); push(t,tabptr); push(0,desloc)} {adsimb (top(tabptr),id.nome, T.tipo, top(desloc)); top(desloc) =top(desloc) + T.tam} N ε T int T real T array [num] of T 1 T ^T 1 D proc id; ND; S {t=top(tabptr); deftam(t,top(desloc)); pop(tabptr);pop(desloc); adproc(top(tabprt),id.nome, t)} 35 36

N ε : esquema de tradução para gerar {t=geratab(top(tabptr)); push(t,tabptr);push(0,desloc)} T int {T.tipo = int; T.tam = 4} T real {T.tipo = real; T.tam = 8} T array [num] of T 1 T ^T 1 {T.tipo = arranjo(num.val, T 1.tipo); T.tam = num.val* T 1.tam} {T.tipo = ponteiro(t 1.tipo); T.tam = 4} 37 38 39 40 41 42

43 44 TAC Geração de código de três endereços: Expressões Declarações (escopo simples) Declarações (escopos aninhados) Comandos de atribuição Arrays e Registros Expressões booleanas Comandos de decisão Comandos de iteração 45 46 S id := E E E1+E2 E E1*E2 E -E1 E E1 E id Comandos de atribuição { p = lookup(id.nome); if p <> NULL then geracod (p := E.ptr) else erro} {E.ptr = geratemp; geracod (E.ptr := E1.ptr + E2.ptr) } {E.ptr = geratemp; geracod (E.ptr := E1.ptr * E2.ptr) } {E.ptr = geratemp; geracod (E.ptr := -u E1.ptr) } {E.ptr = E1.ptr;} {p=lookup(id.nome); if p<> NULL then E.ptr = p; else erro} 47 TAC Geração de código de três endereços: Expressões Declarações (escopo simples) Declarações (escopos aninhados) Comandos de atribuição Arrays e Registros Expressões booleanas Comandos de decisão Comandos de iteração 48

Arrays Como acessar elementos? A[i] Arrays Como acessar elementos? A[i] base + (i linf) * w base: endereço de memória relativo para o array linf: limite inferior do intervalo de subscritos w: largura de cada elemento do array i: índice que se deseja acessar 49 50 Arrays base + (i linf) * w base: endereço de memória relativo para o array linf: limite inferior do intervalo de subscritos w: largura de cada elemento do array i: índice que se deseja acessar Rearranjar: i * w + (base linf * w) Arrays 2D Como acessar elementos? A[i1,i2] calculado em tempo de compilação 51 52 Arrays 2D A[i1,i2] base: endereço de memória relativo para o array linf1, linf2: limite inferior do intervalo de subscritos w: largura de cada elemento do array i1, i2: índice que se deseja acessar n2: lsup2 linf2 + 1 Arrays 2D A[i1,i2] base + ((i1 linf1) * n2 + i2 linf2) * w base: endereço de memória relativo para o array linf1, linf2: limite inferior do intervalo de subscritos w: largura de cada elemento do array i1, i2: índice que se deseja acessar n2: lsup2 linf2 + 1 53 54

Tradução de Arrays 2D base + ((i1 linf1) * n2 + i2 linf2) * w base: endereço de memória relativo para o array linf1, linf2: limite inferior do intervalo de subscritos w: largura de cada elemento do array i1, i2: índice que se deseja acessar n2: lsup2 linf2 + 1 Rearranjar: ((i1 * n2) + i2) * w + (base ((linf1 * n2) + linf2) * w) Generalização Fórmula geral: ((...((i 1 n 2 + i 2 )n 3 + i 3 )...)n k + i k ) * w + base-((..((linf 1 n 2 + linf 2 )n 3 + linf 3 )...)n k +linf k ) *w Recorrência: e 1 = i 1 e m = e m-1 * n m + i m calculado e armazenado em c(array) 55 56 Tradução de Arrays L id [Elist] id Elist Elist, E E Tradução de Arrays L id [Elist] id Elist Elist, E E L Elist] id Elist Elist, E id [ E 57 58 Tradução de Arrays L id [Elist] id Elist Elist, E E L Elist] id Elist Elist, E id [ E 7. Elist Elist, E Facilita atrelar o nome do array à expressão de índice mais a esquerda (atributo sintetizado ao invés de herdado) 59 60

x := A[y,z] A é uma array de 10x20 com linf1=linf2=1, w=4 código gerado: t1 := y * 20 t1 := t1 + z t2 := c // constante c = basea 84 t3 := 4 * t1 t4 := t2 [ t3] x := t4 base ((linf1 * n2) + linf2) * w) Atributos semânticos Atributos: local: ponteiro para um dado nome contendo um valor deslocamento: deslocamento dentro do array (nulo quando for identificador simples) array: ponteiro para a tabela de símbolos contendo a entrada do array Variáveis, funções: ndim: registra o número de dimensões em uma lista de índice limite(array, j) retorna nj, o número de elementos da j_ésima dimensão 61 62 S L:=E { IF L.deslocamento = NULL THEN // L é um identificador simples emitir (L.local := E.local) ELSE emitir (L.local [ L.deslocamento ] := E.local)} 7. Elist Elist, 63E E E 1 + E 2 { E.local := geratemp; emitir (E.local := E 1.local + E 2.local)} E (E 1 ) { E.local := E 1.local} 7. Elist Elist, E 8. Elist 64 id[e E L { IF L.deslocamento = NULL THEN // L é um identificador simples E.local := L.local ELSE E.local := geratemp; emitir (E.local := L.local [ L.deslocamento ] )} 7. Elist Elist, E65 L Elist ] { L.local := geratemp; L.deslocamento := geratemp; emitir (L.local := c(elist.array)); emitir (L.deslocamento := Elist.local * largura(elist.array))} w usado no cálculo do índice constante usada no cálculo do índice i * w + (base linf * w) 7. Elist Elist, 66 E

L id { L.local := id.local; L.deslocamento := null } 7. Elist Elist, 67 E Elist EList 1, E { t := geratemp; m := Elist 1.ndim + 1; emitir(t := EList 1.local * limite(elist 1.array,m)); emitir(t := t + E.local); Elist.array := Elist 1.array; Elist.local := t; Elist.ndim := m} 7. Elist Elist, 68 E Elist id [ E { Elist.array := id.local; Elist.local := E.local; Elist.ndim := 1} 7. Elist Elist, 69 E x := A[y,z] L.local = x L.deslocamento = null x Elist.local = y Elist.ndim = 1 Elist.array = A A [ E.local = y y S := Elist.local = t1 Elist.ndim = 2 Elist.array = A L.local = y L.deslocamento = null, E.local = t4 L.local = t2 L.deslocamento = t3 E.local = z L.local = z L.deslocamento = null z ] 70 t1 := y * 20 t1 := t1 + z t2 := c /// constante c = basea 84 L.local = x L.deslocamento = null x Elist.local = y Elist.ndim = 1 Elist.array = A A [ E.local = y y S := Elist.local = t1 Elist.ndim = 2 Elist.array = A L.local = y L.deslocamento = null, t3 := 4 * t1 t4 := t2[t3] x := t4 E.local = t4 L.local = t2 L.deslocamento = t3 E.local = z L.local = z L.deslocamento = null z ] 71