Você está na página 1de 14

Lista de figura

Figura1: fases de um compilador……………………………………………………….6

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


1
Lista de tabela

Tabela1: representação das notações…………………………………………………10

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


2
Lista de siglas e abreviatura

HIR - High Intermediate Representation (Representação Intermediaria Alta).


MIR - Medium Intermediate Representation (Representação Intermediaria Media).

LIR- Low Intermediate Representation (Representação Intermediaria Baixa).

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


3
Índice

Lista de figura ....................................................................................................................1


Lista de tabela ....................................................................................................................2
Lista de siglas e abreviatura ...............................................................................................3
Introdução ..........................................................................................................................5
FASES DE UM COMPILADOR ........................................................................................6
GERAÇÃO DE CÓDIGO INTERMEDIÁRIO ..................................................................7
Vantagens do código intermediário.................................................................................7
Desvantagens do código intermediário ............................................................................8
TIPOS DE CÓDIGO INTERMEDIÁRIO ..........................................................................8
Características de código intermediário ..........................................................................8
CATEGORIAS DA LINGUAGEM INTERMEDIARIA ....................................................9
Árvores Sintáticas ...........................................................................................................9
Grafo de sintaxe............................................................................................................ 10
Notação Pós-Fixa .......................................................................................................... 10
Notação Pré -Fixa .......................................................................................................... 10
CÓDIGO DE TRÊS ENDEREÇOS.................................................................................. 11
Instruções de atribuição................................................................................................ 11
Conclusão ......................................................................................................................... 13
Bibliografia....................................................................................................................... 14

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


4
Introdução

Um compilador é um programa ou um conjunto de programas que traduz um


código fonte para uma linguagem de mais baixo nível escrito em uma linguagem de
programação de alto nível, com grande capacidade de abstração. A geração de código se
completa com a tradução do código intermediário em instruções do processador. O
processo de compilação pode ser dividido, a diversos modos, nas fases de análise léxica,
análise sintática e geração de código. Enquanto que, para as duas primeiras,
extensamente estudadas, já se dispõe de descrições adequadas para o seu funcionamento
esperado, possibilitando assim a automatização completa da implementação de
analisadores léxicos e sintáticos para a maior parte das linguagens de programação
correntes, tal não acontece com a geração de código. Um compilador traduz a
linguagem fonte (C, C++, Java, Pascal, e outras que fazem parte do conjunto de
linguagens fontes) em uma outra linguagem equivalente.

O código intermediário é o código que está entre o código fonte e o código


objecto. A geração do código intermediários e a transformação da árvore ou grafo
sintático em um segmento de códigos. As formas internas (linguagens intermediárias)
possibilitam a reutilização dos códigos e permitindo a optimização dos mesmos.

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


5
FASES DE UM COMPILADOR

Conceitualmente um compilador opera em fases, cada uma das quais transforma


o programa fonte de uma representação para outra. Uma decomposição típica de um
compilador é mostrada na figura abaixo:

Figura1: fases de um compilador

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


6
GERAÇÃO DE CÓDIGO INTERMEDIÁRIO

Definição

A geração de código intermediário é a transformação da árvore de derivação


(representação interna produzida pelo analisador sintático) em uma sequência de código
mais próximo do código objeto.

A representação intermediária é um programa para máquina abstrata, que pode


ter várias formas, devendo ter dois aspectos importantes: ser fácil de produzir e fácil de
traduzir no programa alvo.

A linguagem utilizada para a geração de um código em formato intermediário


entre a linguagem de alto nível e a linguagem assembly deve representar todas as
expressões do programa original, de forma independente do processador para o qual o
programa será gerado.

Na verdade, compiladores não trabalham diretamente com o código de um


processador específico. Naturalmente um compilador pode ser considerado como um
modelo de:

 Análise ("front-end modules") - traduz um programa fonte em uma


representação (linguagem) intermediária;
 Síntese ("back-end modules") - a partir do código intermediário gera o código
objeto final.

Embora um programa fonte possa ser traduzido diretamente para a linguagem


objeto, o uso de uma representação intermediária, independente de máquina, tem as
seguintes vantagens e desvantagens:

Vantagens do código intermediário


 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;
COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


7
 Possibilita a tradução de código intermediário para diversas máquinas.

Desvantagens do código intermediário


 O compilador requer um passo a mais no processo de compilação, logo a
tradução do código fonte para o código objecto leva a uma compilação lenta.

TIPOS DE CÓDIGO INTERMEDIÁRIO

HIR- High Intermediate Representation (Representação Intermediaria Alta).

Está representação é usada nos primeiros estágios do compilador a simplificar as


construções gramaticais para optimização e geração de código. Exemplo: árvore e grafo
de síntese, notações pré-fixada e pos-fixada e representações lineares.

MIR- Medium Intermediate Representation (Representação Intermediaria Media).

Nesta representação há uma boa base para a geração de código eficiente, pois
pode expressar todas as características de linguagens de programação de forma
independente da linguagem, contem representações de variáveis, temporários e
registradores. Exemplo: árvore e grafo de síntese, notações pré-fixada e pós-fixada e
código de três endereços: as quadruplas e as triplas.

LIR- Low Intermediate Representation (Representação Intermediaria Baixa).

É a representação de uma linguagem que se aproxima da linguagem de máquina,


linguagem essa que é dependente da máquina. Exemplo: instruções assembler.

Características de código intermediário


 Pode assumir muitas formas, em geral é alguma forma de linearização da árvore
sintáctica;
 Pode ser muito abstracta (como árvore sintáctica) ou mais próxima do código
objecto;
 Pode ou não usar informações sobre a máquina alvo e o ambiente de execução
(como disponibilidade de registadores, tamanho dos tipos);

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


8
 Pode ou não incorporar informações da tabela de símbolos (como esboço, níveis
aninhamentos), dispensando ou não a tabela na geração de código objecto;

CATEGORIAS DA LINGUAGEM INTERMEDIARIA

 Representações gráficas: árvore e grafo de sintaxe;


 Notação pós-fixada ou pré-fixada;
 Código de três endereços: quadruplas e triplas.

Árvores Sintáticas
Uma árvore sintática (ou de sintaxe) mostra a estrutura hierárquica de um
programa fonte.

Arvore sintática é uma forma de sintetizar a arvore gramatical, útil para a


representação das construções de linguagem. A geração das arvores sintáticas é feita
através de ações semânticas. Entretanto, essa árvore de derivação em geral não é
conveniente, uma vez que inclui muitos detalhes desnecessários, que foram incluídos na
sintaxe da linguagem fonte para resolver problemas de ambiguidade, precedência,
pontuação, clareza, legibilidade, etc. Por essa razão, em alguns casos é conveniente a
definição de uma segunda sintaxe, chamada sintaxe abstrata, que ignora todos os
aspectos não essenciais da sintaxe original, conhecida como sintaxe concreta.

Exemplo: a:=(b*c) + (b*c).

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


9
Grafo de sintaxe
Um Grafo também é uma representação intermediaria de um compilador, para
cada expressão identifica cada as subexpressões comuns existentes na mesma arvore
sintática por sua vez um grafo possui um nó para cada subexpressão de uma expressão.

Esse grafo irá representar as dependências existentes entre os atributos sintetizados e


herdados de uma árvore de derivação. Exemplo: a:=(b*c) + (b*c)

A diferença entre um Grafo de sintaxe e uma árvore sintática é que, um nó de


um Grafo de dependência representando uma subexpressão comum, possui mais de um
pai.

Notação Pós-Fixa
Os operandos aparecem antes dos operadores, adequada para representar
expressões aritméticas e lógicas. As expressões pós-fixas podem ser obtidas
caminhando-se em pós-ordem, na ordem sintática correspondente.

Notação Pré-Fixa
Na notação pré-fixa os operadores aparecem depois dos operandos.

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


10
Tabela1: representação das notações

CÓDIGO DE TRÊS ENDEREÇOS

O código de três endereços é composto por uma sequência de instruções


envolvendo operações binárias ou unárias e uma atribuição. O nome ``três endereços''
está associado à especificação, em uma instrução, de no máximo três variáveis: duas
para os operadores binários e uma para o resultado. Assim, expressões envolvendo
diversas operações são decompostas nesse código em uma série de instruções,
eventualmente com a utilização de variáveis temporárias introduzidas na tradução.
Dessa forma, obtém-se um código mais próximo da estrutura da linguagem assembly e,
consequentemente, de mais fácil conversão para a linguagem-alvo.

Instruções de atribuição
São aquelas nas quais o resultado de uma operação é armazenado na variável
especificada à esquerda do operador de atribuição, aqui denotado por :=. Há três formas
para esse tipo de instrução. Na primeira, a variável recebe o resultado de uma operação
binária:

x := y op z

O resultado pode ser também obtido a partir da aplicação de um operador unário:

x := op y

Na terceira forma, pode ocorrer uma simples cópia de valores de uma variável para
outra:

x := y

Por exemplo, a expressão em C

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


11
a = b + c * d;

Seria traduzida nesse formato para as instruções:

_t1 := c * d

a := b + _t1

x := y op z - op é uma operação binária (aritmética, lógica ou relacional)

x := op y - op é uma operação unária (menos, negação lógica, deslocamento, conversão


de tipos)

x := y - atribui o valor de y a x

Em um compilador real, esses comandos podem ser implementados como


registos com campos para o operador e os operandos. Os dois tipos mais comuns desses
registos são as quádruplas e as triplas.

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


12
Conclusão

Depois de uma profunda análise o grupo chega a concluir que para se gerar o
código, não é necessário ir diretamente para a linguagem assembly do processador-alvo,
pois o analisador sintático gera o mesmo com uma linguagem próxima para uma
máquina abstrata, isso independente de processadores específicos. Depois esse código
produzido traduz para a linguagem assembly desejada que se deseja.

A representação intermediária é um programa para máquina abstrata, que pode


ter várias formas, devendo ter dois aspectos importantes: ser fácil de produzir e fácil de
traduzir no programa alvo.

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


13
Bibliografia

 LEHRER, Cristiano M.sc., Geração de Código Intermediário, 2009/2016.


 http://www.facom.ufms.br, Geração de Código Intermediário, Novembro 2006.
Acessado em 14/05/2017
 http://gersonc.anahy.org/repcomp/compiladores14, compiladores acessado em
13/05/2017
 http://www-di.inf.puc-rio.br compiladores acessado em 13/05/2017
 https://pt.wikibooks.org/wiki/Constru%C3%A7%C3%A3o_de_compiladores/G
era%C3%A7%C3%A3o_de_c%C3%B3digo_intermedi%C3%A1rio Acessado
em 12/05/2017
 https://pt.wikiversity.org/wiki/Introdu%C3%A7%C3%A3o_%C3%A0_Teoria_
dos_Compiladores/Gera%C3%A7%C3%A3o_e_Otimiza%C3%A7%C3%A3o_
de_C%C3%B3digo Acessado em 12/05/2017
 AHO, Alfred V.;SETHI, Ravi; ULMAN Jeffrey; Compiladores Princípios,
Técnicas e Ferramentas, 1986

COMPILADOR – CODIGO INTERMEDIARIO

JOSE JORGE NGUIRAZE JUNIOR


14

Você também pode gostar