ÉTICA PROFISSIONAL EM CONTABILIDADE FAPAN 2014 – PROFº MARCO AURÉLIO MATERIAL CEDIDO PELO PROF. IVÃ.
1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof....
Transcript of 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof....
![Page 1: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/1.jpg)
1
Geração de Código Intermediário
Prof. Alexandre Monteiro
Baseado em material cedido pelo Prof. Euclides Arcoverde
Recife
![Page 2: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/2.jpg)
Contatos
Prof. Guilherme Alexandre Monteiro Reinaldo
Apelido: Alexandre Cordel
E-mail/gtalk: [email protected]
Site: http://www.alexandrecordel.com.br/fbv
Celular: (81) 9801-1878
![Page 3: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/3.jpg)
3
Etapas da Compilação
Análise Léxica
Análise Sintática
Analise Semântica
Geração de CódigoIntermediário
Geração de CódigoFinal
![Page 4: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/4.jpg)
4
Sumário da Aula
Introdução
Código de Três Endereços
Traduzindo Expressões
Traduzindo Comandos
![Page 5: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/5.jpg)
Introdução
![Page 6: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/6.jpg)
6
Geração de Código Intermediário
O objetivo dessa etapa é gerar um código intermediário equivalente ao código fonte dado como entrada para o compilador
Entrada: árvore sintática anotada
Saída: código intermediário
![Page 7: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/7.jpg)
7
Código Intermediário
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)
Idealmente, um código intermediário deve ser simples e independente de máquina
![Page 8: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/8.jpg)
8
Objetivo
É simples para:• Ser fácil de traduzir para código de máquina
É 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)
![Page 9: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/9.jpg)
9
Código Intermediário
Existem vários tipos de código intermediário
A escolha depende da linguagem fonte e, até mesmo, da(s) linguagem(ns) alvo
Um desenvolvedor pode criar novos tipos de código intermediário, conforme a necessidade
![Page 10: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/10.jpg)
10
Código Intermediário
O livro considera a árvore sintática (já vista) como um tipo de código intermediário
• Mas não é tão simples... :)
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)
![Page 11: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/11.jpg)
Código de Três Endereços
![Page 12: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/12.jpg)
12
Código de Três Endereços
É uma linguagem de baixo nível (simples), porém independente de máquina
Programas representados como uma simples lista de instruções
As instruções usam, no máximo, três operandos (endereços)
![Page 13: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/13.jpg)
13
Tipos de Endereços
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
![Page 14: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/14.jpg)
14
Tipos de Instruções
Instruções de atribuição da forma
Onde op é um operador binário aritmético, binário ou lógico• Exemplo:
x = y op z
aux = t1 + temp
![Page 15: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/15.jpg)
15
Tipos de Instruções
Instruções de atribuição da forma
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;
![Page 16: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/16.jpg)
16
Tipos de Instruções
Instruções de cópia
Usadas, em alguns casos, para facilitar a geração do código intermediário
Numa fase posterior, de otimização, essa instrução pode ser removida
x = y
![Page 17: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/17.jpg)
17
Tipos de Instruções
Desvio incondicional
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
![Page 18: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/18.jpg)
18
Tipos de Instruções
Desvios condicionais
Desviam para o rótulo L dependendo do valor booleano de x
if x goto L
ifFalse x goto L
![Page 19: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/19.jpg)
19
Tipos de Instruções
Desvios condicionais com operadores relacionais (<, >, ==, !=, ...)
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
![Page 20: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/20.jpg)
20
Tipos de Instruções
Chamada de procedimento
Chama o procedimento Proc
call Proc
![Page 21: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/21.jpg)
21
Tipos de Instruções
Preparação de parâmetros
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
![Page 22: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/22.jpg)
22
Tipos de Instruções
Retorno de valor
Usada dentro de um procedimento para retornar o valor y
return y
![Page 23: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/23.jpg)
23
Tipos de Instruções
Atribuições de endereços e ponteiros
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 = &yx = *y*x = y
![Page 24: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/24.jpg)
Traduzindo Expressões
![Page 25: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/25.jpg)
25
Traduzindo Expressões
Uma expressão com várias operações...
...é decomposta em expressões menores, com uma operação cada
myVar = aux + temp * 3
t1 = 3 t2 = temp * t1 t3 = aux + t2 myVar = t3
![Page 26: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/26.jpg)
26
Traduzindo Expressões
A árvore sintática, na verdade, já guarda as expressões decompostas da forma desejada
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
![Page 27: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/27.jpg)
27
Traduzindo Expressões
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
![Page 28: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/28.jpg)
28
Exemplo
Figura 6.20 do livro (página 243)
![Page 29: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/29.jpg)
Traduzindo Comandos
![Page 30: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/30.jpg)
30
Traduzindo Instruções
Veremos como fazer a tradução de alguns comandos mais representativos
• Atribuição• If-Else• While
Referências• Figuras 6.20 (pag. 243) e 6.36 (pág. 257) do
livro
![Page 31: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/31.jpg)
31
Atribuição
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
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
![Page 32: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/32.jpg)
32
Atribuição
Exemplo:
Código de três endereços:
myVar = aux + temp * 3
t1 = 3 t2 = temp * t1 t3 = aux + t2 myVar = t3
![Page 33: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/33.jpg)
33
If-Else
Criar dois labels (rótulos) únicos
• Fx: para o caso falso
• Rx: para a próxima instrução, após o if-else
![Page 34: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/34.jpg)
34
If-Else
A primeira coisa a fazer é gerar o código da expressão de teste
• Retorna o nome de uma variável
Depois, deve-se gerar um comando de desvio condicional ifFalse-goto aplicado à variável e ao label Fx
• Só vai desviar quando for falso
![Page 35: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/35.jpg)
35
If-Else
Depois, deve-se gerar o código do comando dentro do if
• Só vai ser atingido quando a expressão for verdadeira
E então, gerar um desvio incondicional goto para o label Rx
• Impede que seja executado o comando do else
![Page 36: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/36.jpg)
36
If-Else
A seguir, deve-se gerar o label Fx
• Marca o início do código do else
Gerar o código do comando dentro do else
E, por fim, gerar o label Rx
• Marca o início do comando seguinte
![Page 37: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/37.jpg)
37
If-Else
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
![Page 38: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/38.jpg)
38
While
Criar dois labels únicos
• Ix: para o início do while
• Rx: para o próximo comando, após o while
Naturalmente, deve-se começar gerando o label Ix na saída
![Page 39: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/39.jpg)
39
While
Depois, gerar primeiro o código da expressão
• Receber o nome da variável
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
![Page 40: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/40.jpg)
40
While
Em seguida, deve-se gerar o código do comando interno do while
Depois, gerar uma instrução de desvio incondicional goto para o label Ix
• Para avaliar a expressão novamente
Por fim, gerar o label Rx
![Page 41: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/41.jpg)
41
While
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
![Page 42: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/42.jpg)
42
Traduzindo Instruções
Essa é UMA possível maneira de gerar código para esses comandos
É uma maneira mais direta e mais fácil de implementar, mas gera código ineficiente
• A fase de otimização, poderia melhorá-lo
Usem como base para os demais comandos
![Page 43: 1 Geração de Código Intermediário Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.](https://reader033.fdocument.pub/reader033/viewer/2022042623/552fc15e497959413d8e5897/html5/thumbnails/43.jpg)
43
Bibliografia
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)