A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.

Apresentações semelhantes


Apresentação em tema: "1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife."— Transcrição da apresentação:

1 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

2 Contatos n Prof. Guilherme Alexandre Monteiro Reinaldo n Apelido: Alexandre Cordel n /gtalk: n Site: n Celular: (81)

3 3 Etapas da Compilação Análise Léxica Análise Sintática Analise Semântica Geração de Código Intermediário Geração de Código Final

4 4 Sumário da Aula n Introdução n Código de Três Endereços n Traduzindo Expressões n Traduzindo Comandos

5 Introdução

6 6 Geração de Código Intermediário n O objetivo dessa etapa é gerar um código intermediário equivalente ao código fonte dado como entrada para o compilador n Entrada: árvore sintática anotada n Saída: código intermediário

7 7 Código Intermediário n O nome “intermediário” indica que ele não é mais tão abstrato quanto o código fonte, nem é também o código final (específico de máquina) n Idealmente, um código intermediário deve ser simples e independente de máquina

8 8 Objetivo n É simples para: Ser fácil de traduzir para código de máquina n É independente de máquina para: Deixar apenas o back-end dependente de máquina Permitir gerar código para várias máquinas diferentes (a partir de uma mesma linguagem fonte)

9 9 Código Intermediário n Existem vários tipos de código intermediário n A escolha depende da linguagem fonte e, até mesmo, da(s) linguagem(ns) alvo n Um desenvolvedor pode criar novos tipos de código intermediário, conforme a necessidade

10 10 Código Intermediário n O livro considera a árvore sintática (já vista) como um tipo de código intermediário Mas não é tão simples... :) n Veremos aqui um tipo mais interessante de código intermediário – o código de três endereços Mais fácil de traduzir para códigos assembly (x86 ou MIPS, por exemplo)

11 Código de Três Endereços

12 12 Código de Três Endereços n É uma linguagem de baixo nível (simples), porém independente de máquina n Programas representados como uma simples lista de instruções n As instruções usam, no máximo, três operandos (endereços)

13 13 Tipos de Endereços n Um endereço pode ser: Um nome – representando uma variável, função, etc. Uma constante – valor literal de um número, uma string, um caractere, etc. Um temporário – variável auxiliar criada pelo compilador (t1, t2, etc.) Um rótulo – localização de uma instrução

14 14 Tipos de Instruções n Instruções de atribuição da forma n Onde op é um operador binário aritmético, binário ou lógico Exemplo: x = y op z aux = t1 + temp

15 15 Tipos de Instruções n Instruções de atribuição da forma n Onde op é um operador unário, como: negação lógica, menos, conversão de tipo Exemplos: x = op y t1 = (int) temp; t1 = - temp;

16 16 Tipos de Instruções n Instruções de cópia n Usadas, em alguns casos, para facilitar a geração do código intermediário n Numa fase posterior, de otimização, essa instrução pode ser removida x = y

17 17 Tipos de Instruções n Desvio incondicional n Desvia para o rótulo L : faz com que a próxima instrução a ser executada seja a que tem o rótulo L Exemplo: goto L label2: aux = t + 1;... goto label2

18 18 Tipos de Instruções n Desvios condicionais n Desviam para o rótulo L dependendo do valor booleano de x if x goto L ifFalse x goto L

19 19 Tipos de Instruções n Desvios condicionais com operadores relacionais (, ==, !=,...) n Desvia para L se o resultado da operação relacional for verdadeiro Exemplo: if x op_cond y goto L label2: aux = t + 1; if aux < temp goto label2

20 20 Tipos de Instruções n Chamada de procedimento n Chama o procedimento Proc call Proc

21 21 Tipos de Instruções n Preparação de parâmetros n Definem os valores que serão passados em uma chamada de procedimento O exemplo dado representa: Proc(x1, x2,...) param x1 param x2... call Proc

22 22 Tipos de Instruções n Retorno de valor n Usada dentro de um procedimento para retornar o valor y return y

23 23 Tipos de Instruções n Atribuições de endereços e ponteiros n Acessam, respectivamente: O endereço de memória da variável y O valor que está no endereço que y guarda O valor que está no endereço que x guarda x = &y x = *y *x = y

24 Traduzindo Expressões

25 25 Traduzindo Expressões n Uma expressão com várias operações... n...é decomposta em expressões menores, com uma operação cada myVar = aux + temp * 3 t1 = 3 t2 = temp * t1 t3 = aux + t2 myVar = t3

26 26 Traduzindo Expressões n A árvore sintática, na verdade, já guarda as expressões decompostas da forma desejada n Cada sub-expressão terá o seu valor guardado por alguma variável Pode ser necessário criar uma variável temporária Criar atributo em cada nó da árvore

27 27 Traduzindo Expressões n A regra geral para traduzir um nó (que realiza uma só operação) é: Gerar o código das sub-expressões Receber os nomes das variáveis usadas para guardar o valor de cada uma delas Criar uma instrução para executar a operação sobre essas variáveis

28 28 Exemplo n Figura 6.20 do livro (página 243)

29 Traduzindo Comandos

30 30 Traduzindo Instruções n Veremos como fazer a tradução de alguns comandos mais representativos Atribuição If-Else While n Referências Figuras 6.20 (pag. 243) e 6.36 (pág. 257) do livro

31 31 Atribuição n Primeiro, deve-se gerar código para a expressão do lado direito Retorna o nome da variável que terá o valor da expressão n Por fim, basta fazer uma instrução de cópia entre a variável retornada e a variável do lado esquerdo da atribuição

32 32 Atribuição n Exemplo: n Código de três endereços: myVar = aux + temp * 3 t1 = 3 t2 = temp * t1 t3 = aux + t2 myVar = t3

33 33 If-Else n Criar dois labels (rótulos) únicos Fx: para o caso falso Rx: para a próxima instrução, após o if-else

34 34 If-Else n A primeira coisa a fazer é gerar o código da expressão de teste Retorna o nome de uma variável n Depois, deve-se gerar um comando de desvio condicional ifFalse-goto aplicado à variável e ao label Fx Só vai desviar quando for falso

35 35 If-Else n Depois, deve-se gerar o código do comando dentro do if Só vai ser atingido quando a expressão for verdadeira n E então, gerar um desvio incondicional goto para o label Rx Impede que seja executado o comando do else

36 36 If-Else n A seguir, deve-se gerar o label Fx Marca o início do código do else n Gerar o código do comando dentro do else n E, por fim, gerar o label Rx Marca o início do comando seguinte

37 37 If-Else n Exemplo: int x = 0; if (x < 10) { x = 20; } else { x = 10; } int y = x; x = 0 t1 = x < 10 ifFalse t1 goto F1 x = 20 goto R1 F1: x = 10 R1: y = x

38 38 While n Criar dois labels únicos Ix: para o início do while Rx: para o próximo comando, após o while n Naturalmente, deve-se começar gerando o label Ix na saída

39 39 While n Depois, gerar primeiro o código da expressão Receber o nome da variável n Depois, gerar um desvio condicional ifFalse-goto aplicado à variável e ao label Rx Quando a expressão não for verdade, passa para o comando após o while

40 40 While n Em seguida, deve-se gerar o código do comando interno do while n Depois, gerar uma instrução de desvio incondicional goto para o label Ix Para avaliar a expressão novamente n Por fim, gerar o label Rx

41 41 While n Exemplo: x = 0; while (x < 10) { x = x + 1; } y = x; x = 0 I1: t1 = x < 10 ifFalse t1 goto R1 t2 = x + 1 x = t2 goto I1 R1: y = x

42 42 Traduzindo Instruções n Essa é UMA possível maneira de gerar código para esses comandos n É uma maneira mais direta e mais fácil de implementar, mas gera código ineficiente A fase de otimização, poderia melhorá-lo n Usem como base para os demais comandos

43 43 Bibliografia n AHO, A., LAM, M. S., SETHI, R., ULLMAN, J. D., Compiladores: princípios, técnicas e ferramentas. Ed. Addison Wesley. 2a Edição, 2008 (Capítulo 4)


Carregar ppt "1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife."

Apresentações semelhantes


Anúncios Google