SlideShare ist ein Scribd-Unternehmen logo
1 von 9
GERAÇÃO DE CÓDIGO OBJETO
Marcelo de Avila Rosa1
Cliceres Mack Dal Bianco2
Resumo:
A última fase de um compilador é o gerador de código objeto. Ele recebe como entrada a representação
intermediário (RI) do compilador e com as informações relevantes da tabela verdade produz como saída um código
objeto semanticamente equivalente à entrada. Este artigo traz alguns conceitos, tentando explicar o funcionamento
do Gerador de Código de um compilador.
Palavras-chaves: Compiladores; geração de código objeto; máquina objeto.
Abstract:
The last phase of a compiler's code generator object. It receives as input the intermediate representation (IR)
compiler with the relevant information and the truth table produces output a semantically equivalent to the input
object code. This article presents some concepts, trying to explain the operation of Code Generator a compiler.
Key words: Compilers; generation of object code; machine object.
INTRODUÇÃO
A fase de geração de código final é a última fase da compilação. A geração de um bom
código objeto é difícil devido aos detalhes particulares das máquinas para os quais o código é
gerado. Contudo, é uma fase importante, pois uma boa geração de código pode ser, por
exemplo, duas vezes mais rápida que um algoritmo de geração de código ineficiente. Nem todas
as técnicas de otimização são independentes da arquitetura da máquina-alvo. Otimizações
dependentes da máquina necessitam de informações tais como os limites e os recursos especiais
da máquina-alvo a fim de produzir um código mais compacto e eficiente. O código produzido
pelo compilador deve se aproveitar dos recursos especiais de cada máquina-alvo. Segundo Aho
(1995), o código objeto pode ser uma seqüência de instruções absolutas de máquina, uma
seqüência de instruções de máquina relocáveis, um programa em linguagem assembly ou um
programa em outra linguagem.
1
Acadêmico do Curso de Ciência da Computação URI-FW - Universidade Regional Integrada do Alto Uruguai
e das Missões - Campus Frederico Westphalen – RS –lelo.c.inf@gmail.com
2
Mestra em Ciência da Computação – Professora de Compiladoresda URI– adrianec@uri.edu.br
2
Um gerador de código é composto por três tarefas principais: seleção de instrução,
alocação e atribuição de registrador, e escalonamento de instrução. A seleção de instrução
compreende a escolha de instruções apropriadas da arquitetura alvo para implementar os
comandos da RI. A alocação e a atribuição de registrador decidem que valores devem ser
mantidos em registradores e também quais registradores usar. O escalonamento de instrução
envolve a decisão sobre a ordem em que a execução das instruções deve escalonar.
PRINCIPAIS REQUISITOS IMPOSTOS
As exigências tradicionalmente impostas a um gerador de código são severas. O código
de saída precisa ser correto e de alta qualidade, significando que o mesmo deve tornar efetivo
o uso dos recursos da máquina-alvo. Sobretudo, o próprio gerador de código deve rodar
eficientemente.
O que se deve ser levado em consideração é impossível, matematicamente, gerar um
código perfeito. Na verdade, o desenvolvedor deve se contentar com as técnicas heurísticas que
geram um bom código, mas não necessariamente um ótimo código. A escolha de um método
heurístico é importante, pois na medida em que um algoritmo de geração de código
cuidadosamente projetado pode produzir um código que seja várias vezes mais rápido do que
aquele produzido por um algoritmo concebido às pressas.
Pode-se definir isto nos seguintes itens a seguir:
 O código gerado deve ser correto e de alta qualidade;
 O código deve fazer uso efetivo dos recursos da máquina;
 O código gerado deve executar eficientemente;
 O problema de gerar código ótimo é insolúvel (indecidível) como tantos outros.
CONSIDERAÇÕES
Quatro aspectos que devem ser levado em consideração no momento em que for fazer
um gerador de código.
 Forma do código objeto ser gerado:
o Com uma linguagem absoluta, relocável ou assembly;
 Seleção das instruções de máquina:
o A escolha da seqüência apropriada pode resultar num código mais curto
e mais rápido;
3
 Alocação de registradores;
 Escolha da ordem de avaliação:
o A determinação da melhor ordem para execução das instruções é um
problema insolúvel;
o Alguns computadores requerem menos registradores para resultados
intermediários.
MÁQUINA OBJETO
Deve existir uma familiaridade com a máquina que criará o objeto assim como com o
conjunto de instruções. As arquiteturas de Máquinas alvos mais comuns são: RISC
(ReducedInstuction Set Computer), CISC (ComplexInstruction Set Computer) e baseadas em
Pilha.
Três aspectos básicos que devem ser analisados em um projeto que são:
 Forma do Código Objeto
o Linguagem absoluta:
 A geração de um programa em linguagem absoluta de máquina tem
a vantagem de que o programa objeto pode ser armazenado numa
área de memória fixa e ser imediatamente executada.
 Compiladores deste tipo são utilizados em ambientes universitários,
onde é altamente conveniente diminuir o custo de compilação.
 Os compiladores que geram código absoluto e executam
imediatamente são conhecidos como loadandgocompilers.
o Linguagem relocável:
 Ageração de código em linguagem de máquina relocável permite a
compilação de subprogramas.
 Módulos e objetos relocáveis podem ser ligados e carregados por um
ligador/carregador.
 Essa estratégia dá flexibilidade para compilar sub-rotinas
separadamente e para chamar outros programas previamente
compilados.
o Linguagem assembly:
 A tradução para linguagem assembly facilita o processo de geração
de código.
4
 São geradas instruções simbólicas e podem ser usadas as facilidades
de macro instruções.
 O preço pago é um passo adicional – tradução para linguagem de
máquina.
 É uma estratégia razoável, especialmente, para máquinas com pouca
memória, nas quais o compilador deve desenvolver-se em vários
passos.
 Escolha da seqüência da execução das instruções que é necessária, quanto mais
acertarem mais tempo economizará e o código será mais compacto.
 Escolha da ordem de avaliação. Sabe-se que é necessária a definição de uma
ordem para acertar e se aproximar da melhor seqüência, mas como fazer isso? É
um grande problema. As vezes é necessário optar por uma técnica de menor
número de registradores para alcançar no mínimo pelo menos resultados
intermediários.
ALOCAÇAO DE REGISTRADORES
Os trabalhos que necessitam do uso de registradores são processamentos mais ágeis e
menores, que levarão um curto período de tempo para serem executados. Por essa razão o uso
de registradores deve cumprir suas alocações com eficiência.
Instruções com registradores são mais curtas e mais rápidas do que instruções
envolvendo memória. Portanto, o uso eficiente de registradores é muito importante. A
atribuição ótima de registradores a variáveis é muito difícil e muito problemática quando a
máquina trabalha com registradores aos pares (para instruções de divisão e multiplicação), ou
provê registradores específicos para endereçamento e para dados.
O problema do uso otimizado de registradores fica simples quando a máquina possui
um único registrador para realizar operações aritméticas. O problema deixa de existir quando
as operações aritméticas são realizadas sobre uma pilha. Neste caso, deixa de ser necessária,
inclusive a utilização de variáveis temporais.
Pode-se dizer que o uso dos registradores frequentemente é subdividido em dois
subproblemas que são:
 Alocação de registradores: etapa na qual seleciona-se o conjunto de variáveis
que residirão nos registradores em cada ponto do programa.
5
 Atribuição de registradores: etapa na qual determina-se um registrador
específico em que uma variável residirá.
GERENCIAMENTO DE MEMÓRIA EM TEMPO DE EXECUÇÃO
Para o gerenciamento de memória é necessário conhecer os endereços de código objeto.
Os endereços são determinados de acordo com o tipo de alocação de memória utilizada. Em um
compilador é utilizado dois tipos de alocação. A alocação estática e a alocação em pilhas. Mas
também tem os endereços em tempo de execução, conhecido como dinâmico.
 Alocação Estática: O tamanho e o layout dos registros de ativação são
determinados pelo gerador de código a partir de informações sobre os nomes,
armazenados na tabela de símbolos. Para implementar o caso mais simples é
necessário uma máquina alvo que execute as duas instruções. Conforme a figura.
OST salva o endereço de retorno no registrador de ativação e o
BR transfere o controle para o código objeto do procedimento
chamado callee.
O calle.static.Area é uma constante que fornece o endereço de
início do registro de ativação para callee. A variável
callee.codeArea é uma constante que refere ao endereço da
primeira instrução do procedimento chamado callee.
O #here+20 faz o ponteiro de instrução corrente a percorrer
vinte bytes, ou seja, cinco palavras a frente da instruçãoST. O
que caracteriza as alocações estáticas é o conhecimento do seu
endereço no momento em que se constrói o código objeto.
 Alocação de Pilha: Quando se utiliza endereços relativos para armazenamento
nos registros de ativação de uma alocação estática, esta na verdade
transformando essa alocação em um outro tipo, em uma alocação dinâmica. No
entanto a posição de um registro só é conhecida quando é executado o código
objeto. Essa posição é armazenada em um registrador que forma a palavra pode
ser acessada como deslocamento a partir desse valor nesse registrador. O modo
de endereçamento indexado da máquina alvo é conveniente para essa finalidade.
6
O deslocamento pode ser positivo ou negativo, dependendo para onde o ponteiro
de deslocamento se mova. Neste exemplo considera-se um deslocamento
positivo com o SP apontando para o início do registro de ativação que está no
topo da pilha.
 Alocação em Tempo execução para os nomes (Dinâmica): A abordagem de
endereçamento em tempo de execução torna o compilador mais portável, pois o
front-end não precisa ser substituído nem mesmo quando o compilador for
transferido para uma máquina diferente, onde é necessária uma otimização em
tempo de execução. Para fazer o acesso, o nome é substituído pelo código para
acessar os endereços de memória.
BLOCOS BÁSICOS E GRAFOS DE FLUXO
Nos algoritmos de três endereços, uma solução muito útil para a sua compreensão é a
representação de três endereços chamados grafo de fluxo. Os nós deste grafo representam
computações e os lados representam o fluxo de controle.
Blocos Básicos:
São trechos de programa cujas instruções são sempre executadas em ordem (em linha
reta), da primeira até a última. É uma região de código seqüencial sem qualquer salto
de execução, onde o controle entra no início e o deixa no fim. Arestas direcionadas são
usadas para representar tais saltos na estrutura de controle. Ainda há dois blocos
especiais, o bloco de entrada e o bloco de saída, de onde se começa e termina o fluxo
respectivamente.
Um bloco básico computa um conjunto de expressões que são os valores dos nomes
vivos à saída de um bloco. Dois blocos básicos são equivalentes, se computarem o
mesmo conjunto de expressão. Várias transformações podem ser aplicadas a um bloco
básico sem que o conjunto de expressões computadas seja alterado. Muitas dessas
transformações ajudam na melhora da qualidade do novo código que será gerado a
partir do bloco básico.
Transformações Primárias:
Primeiramente é feito a eliminação de sub-expressões comuns. Para isto é usado a
Alocação estática.
Suponha-se o seguinte bloco básico
7
Como o segundo e o quarto enunciados computam a mesmaexpressão,
esse bloco base pode ser transformado no bloco equivalente.
Eliminação de código morto.
É o código no programa que nunca será executado com nenhum tipo de dados ou em
outras condições. Supondo que um programa continha código morto (deadcode), isto é,
código que não pode ser alcançado durante a execução de um programa, este programa
pode ser otimizado pela remoção deste código.
Renomeação de variáveis temporárias.
As variáveis temporárias durante a geração de código intermediário podem não ser
estritamente necessário. Normalmente esta eliminação é feita dando nomes para as
variáveis (temporariamente ou não) que vão guardar os valores temporários. Por
exemplo: se tiver no código fonte x:=a+b; o código intermediário terá t1 = a +b; x = t1;
ea variável t1 pode ser eliminada. Assim, podemos sempre transformar um bloco básico
num bloco equivalente, onde cada enunciado que define um temporário passa a definir
um equivalente.
Intercâmbio de enunciados.
Supondo ter um bloco com dois enunciados adjacentes t1:= b + c e t2:= x + y, pode-se
então intercambiar os enunciados sem alterar o valor do bloco somente se nem x bem y
forem t1, nem b nem c forem t2. Um bloco básico na forma normal permite qualquer
que seja a troca de enunciados possíveis.
Transformações Algébricas.
Pode-se aplicar transformações baseadas também em propriedades algébricas, como
comutatividade, associatividade, identidade, entre outros casos. Por exemplo:
X:=a+b*c, como a soma é comutativa, pode-se transformar em X:=b*c+a.
Grafos de Fluxo.
É uma representação que usa notação de grafo para descrever todos os caminhos que
podem ser executados por um programa de computador, onde cada nó representa um
bloco básico. Através do grafo de fluxo é possível adicionar informações a respeito do
fluxo de controle de blocos básicos.
Eliminação de código inalcançável.
8
Elimina também o problema do desvio sobre desvio, mas, neste caso o desvio sobre
desvio leva o código a não entrar em uma ou mais linhas do programa.
GERAÇÃO DO CÓDIGO SIMPLES
É importante considerar que a maioria dos geradores deve evitar a geração de instruções
de cargas e armazenamentos desnecessários.
Os registradores devem:
 Colocar nos registradores todos os operandos para realizar uma operação;
 Tem-se que guardar valores globais calculados em um bloco básico que é usado
em outros blocos;
 Serem usados para auxiliar o gerenciamento de memória em tempo de execução;
 Quando uma expressão grande está sendo avaliada, guardar resultados de sub-
expressões;
 Tais necessidades são concorrentes, justamente pelo fato de ter um número
limitado de registradores.
GERAÇÃO DO CÓDIGO OBJETO
A abordagem mais simples da etapa de geração de código objeto é:
Para cada instrução (do código intermediário) ter um gabarito com a correspondente
seqüência de instruções em linguagem simbólica do processador-alvo.
Exemplo:
le := ld1 + ld2
A seqüência de instruções em linguagem simbólica que corresponde a essa instrução
depende da arquitetura do processador para o qual o programa é gerado.
PRODUÇÃO DE CÓDIGO EXECUTÁVEL
O resultado da compilação é um arquivo em linguagem simbólica.
Montagem
9
 Processo em que o programa em linguagem simbólica é transformado em
formato binário, em código de máquina;
 O programa responsável por essa transformação é o montador.
Montadores
 Traduzem código em linguagem simbólica para linguagem de máquina.
CONCLUSÃO
O gerador de código recebe como entrada uma representação intermediária do programa
fonte e o mapeia em uma linguagem objeto. Se a linguagem objeto for código de máquina de
alguma arquitetura, devem-se selecionar os registradores ou localizações de memória para cada
uma das variáveis usadas pelo programa. Depois, os códigos intermediários são traduzidos em
sequências de instruções de máquina que realizam a mesma tarefa. Um aspecto crítico da
geração de código está relacionado à cuidadosa atribuição dos registradores às variáveis do
programa
REFERÊNCIAS BIBLIOGRÁFICAS
AHO, A. V.; ULLMAN, J. D. Compiadores: Princípios, Técnicas e Ferramentas.
Guanabarra, Koogan, 1995.
Gerador de Código Objeto Disponível em
<http://www.ybadoo.com.br/ead/cmp/09/CMP_slides.pdf>, acesso realizado em 02/06/2014.

Weitere ähnliche Inhalte

Was ist angesagt?

Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhanyKaren Costa
 
Linguagem c-para-microcontroladores
Linguagem c-para-microcontroladoresLinguagem c-para-microcontroladores
Linguagem c-para-microcontroladores34macchia34
 
Aula01 introducao operacoes
Aula01   introducao operacoesAula01   introducao operacoes
Aula01 introducao operacoesYuri Passos
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducaommind
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Kratos879
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+cThiago Freitas
 

Was ist angesagt? (19)

Linguagem C clecioamerico
Linguagem C clecioamericoLinguagem C clecioamerico
Linguagem C clecioamerico
 
Apresentação Linguagem C
Apresentação Linguagem CApresentação Linguagem C
Apresentação Linguagem C
 
Curso de Linguagem C
Curso de Linguagem CCurso de Linguagem C
Curso de Linguagem C
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Introducao a LPC
Introducao a LPCIntroducao a LPC
Introducao a LPC
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
 
Introdução à Linguagem C
Introdução à Linguagem CIntrodução à Linguagem C
Introdução à Linguagem C
 
Linguagem c-para-microcontroladores
Linguagem c-para-microcontroladoresLinguagem c-para-microcontroladores
Linguagem c-para-microcontroladores
 
Linguagem assembly
Linguagem assemblyLinguagem assembly
Linguagem assembly
 
Oc2 cap03
Oc2 cap03Oc2 cap03
Oc2 cap03
 
Assembly
AssemblyAssembly
Assembly
 
Aula01 introducao operacoes
Aula01   introducao operacoesAula01   introducao operacoes
Aula01 introducao operacoes
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducao
 
TDC2014 SP - C/C++ - Modularização de Código C
TDC2014 SP - C/C++ - Modularização de Código CTDC2014 SP - C/C++ - Modularização de Código C
TDC2014 SP - C/C++ - Modularização de Código C
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
 
Ud2
Ud2Ud2
Ud2
 
Linguagem C - Funções
Linguagem C - FunçõesLinguagem C - Funções
Linguagem C - Funções
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+c
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 

Andere mochten auch

Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]ronaldo ramos
 
Curso de IA - Parte 4 -
Curso de IA - Parte 4 -Curso de IA - Parte 4 -
Curso de IA - Parte 4 -ronaldo ramos
 
Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -ronaldo ramos
 
Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -ronaldo ramos
 
Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 - Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 - ronaldo ramos
 
Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3Anderson Favaro
 
Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -ronaldo ramos
 

Andere mochten auch (8)

Compiladores-aula01
Compiladores-aula01Compiladores-aula01
Compiladores-aula01
 
Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]
 
Curso de IA - Parte 4 -
Curso de IA - Parte 4 -Curso de IA - Parte 4 -
Curso de IA - Parte 4 -
 
Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -
 
Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -
 
Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 - Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 -
 
Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3
 
Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -
 

Ähnlich wie Compiladores

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORESARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORESwillian324163
 
Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresLuis Ferreira
 
Linguagem de programação
Linguagem de programaçãoLinguagem de programação
Linguagem de programaçãoSandro Lopes
 
Máquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da MicroarquiteturaMáquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da MicroarquiteturaLincoln Lamas
 
Gabarito da P1 de PROG
Gabarito da P1 de PROGGabarito da P1 de PROG
Gabarito da P1 de PROGMarcos de Vita
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosEmbarcados
 
10 apostila microcontroladores
10  apostila microcontroladores10  apostila microcontroladores
10 apostila microcontroladoresAlyson Cavalcante
 
Aula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxAula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxItamarGoncalves2
 
Programação de Microprocessadores
Programação de MicroprocessadoresProgramação de Microprocessadores
Programação de MicroprocessadoresDiogo Silva
 
Medindo e Modelando o Desempenho de Aplicações em um Ambiente Virtual
Medindo e Modelando o Desempenho de Aplicações em um Ambiente VirtualMedindo e Modelando o Desempenho de Aplicações em um Ambiente Virtual
Medindo e Modelando o Desempenho de Aplicações em um Ambiente VirtualRafael Reis
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação CJose Augusto Cintra
 
Aula 02 - Introdução a ALGORITMOS.pptx
Aula 02 - Introdução a ALGORITMOS.pptxAula 02 - Introdução a ALGORITMOS.pptx
Aula 02 - Introdução a ALGORITMOS.pptxjudsonBg3
 
Técnicas_Implementação
Técnicas_ImplementaçãoTécnicas_Implementação
Técnicas_ImplementaçãoWagner Zaparoli
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08Carlos Santos
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoAécio Costa
 

Ähnlich wie Compiladores (20)

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORESARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES
 
Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de Computadores
 
Resumo x86
Resumo x86Resumo x86
Resumo x86
 
Linguagem de programação
Linguagem de programaçãoLinguagem de programação
Linguagem de programação
 
C pic
C picC pic
C pic
 
Máquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da MicroarquiteturaMáquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da Microarquitetura
 
Gabarito da P1 de PROG
Gabarito da P1 de PROGGabarito da P1 de PROG
Gabarito da P1 de PROG
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcados
 
10 apostila microcontroladores
10  apostila microcontroladores10  apostila microcontroladores
10 apostila microcontroladores
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Aula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxAula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptx
 
Programação de Microprocessadores
Programação de MicroprocessadoresProgramação de Microprocessadores
Programação de Microprocessadores
 
Medindo e Modelando o Desempenho de Aplicações em um Ambiente Virtual
Medindo e Modelando o Desempenho de Aplicações em um Ambiente VirtualMedindo e Modelando o Desempenho de Aplicações em um Ambiente Virtual
Medindo e Modelando o Desempenho de Aplicações em um Ambiente Virtual
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Apostila cpic
Apostila cpicApostila cpic
Apostila cpic
 
Aula 02 - Introdução a ALGORITMOS.pptx
Aula 02 - Introdução a ALGORITMOS.pptxAula 02 - Introdução a ALGORITMOS.pptx
Aula 02 - Introdução a ALGORITMOS.pptx
 
Ac16 conjunto de instruções v2
Ac16   conjunto de instruções v2Ac16   conjunto de instruções v2
Ac16 conjunto de instruções v2
 
Técnicas_Implementação
Técnicas_ImplementaçãoTécnicas_Implementação
Técnicas_Implementação
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programação
 

Kürzlich hochgeladen

ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxOsnilReis1
 
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptxthaisamaral9365923
 
Simulado 1 Etapa - 2024 Proximo Passo.pdf
Simulado 1 Etapa - 2024 Proximo Passo.pdfSimulado 1 Etapa - 2024 Proximo Passo.pdf
Simulado 1 Etapa - 2024 Proximo Passo.pdfEditoraEnovus
 
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
activIDADES CUENTO  lobo esta  CUENTO CUARTO GRADOactivIDADES CUENTO  lobo esta  CUENTO CUARTO GRADO
activIDADES CUENTO lobo esta CUENTO CUARTO GRADOcarolinacespedes23
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditaduraAdryan Luiz
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxleandropereira983288
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024Jeanoliveira597523
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesMary Alvarenga
 
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -Aline Santana
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxkarinedarozabatista
 
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃOLEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃOColégio Santa Teresinha
 
Governo Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 BrasilGoverno Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 Brasillucasp132400
 
Orações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxOrações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxKtiaOliveira68
 
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMCOMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMVanessaCavalcante37
 
Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.keislayyovera123
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasCassio Meira Jr.
 
Modelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e TaniModelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e TaniCassio Meira Jr.
 

Kürzlich hochgeladen (20)

ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptxATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
ATIVIDADE AVALIATIVA VOZES VERBAIS 7º ano.pptx
 
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
 
Simulado 1 Etapa - 2024 Proximo Passo.pdf
Simulado 1 Etapa - 2024 Proximo Passo.pdfSimulado 1 Etapa - 2024 Proximo Passo.pdf
Simulado 1 Etapa - 2024 Proximo Passo.pdf
 
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
activIDADES CUENTO  lobo esta  CUENTO CUARTO GRADOactivIDADES CUENTO  lobo esta  CUENTO CUARTO GRADO
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditadura
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptx
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das Mães
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
 
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃOLEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
 
Governo Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 BrasilGoverno Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 Brasil
 
Orações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxOrações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptx
 
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMCOMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
 
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
 
Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades Motoras
 
Modelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e TaniModelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e Tani
 
Em tempo de Quaresma .
Em tempo de Quaresma                            .Em tempo de Quaresma                            .
Em tempo de Quaresma .
 

Compiladores

  • 1. GERAÇÃO DE CÓDIGO OBJETO Marcelo de Avila Rosa1 Cliceres Mack Dal Bianco2 Resumo: A última fase de um compilador é o gerador de código objeto. Ele recebe como entrada a representação intermediário (RI) do compilador e com as informações relevantes da tabela verdade produz como saída um código objeto semanticamente equivalente à entrada. Este artigo traz alguns conceitos, tentando explicar o funcionamento do Gerador de Código de um compilador. Palavras-chaves: Compiladores; geração de código objeto; máquina objeto. Abstract: The last phase of a compiler's code generator object. It receives as input the intermediate representation (IR) compiler with the relevant information and the truth table produces output a semantically equivalent to the input object code. This article presents some concepts, trying to explain the operation of Code Generator a compiler. Key words: Compilers; generation of object code; machine object. INTRODUÇÃO A fase de geração de código final é a última fase da compilação. A geração de um bom código objeto é difícil devido aos detalhes particulares das máquinas para os quais o código é gerado. Contudo, é uma fase importante, pois uma boa geração de código pode ser, por exemplo, duas vezes mais rápida que um algoritmo de geração de código ineficiente. Nem todas as técnicas de otimização são independentes da arquitetura da máquina-alvo. Otimizações dependentes da máquina necessitam de informações tais como os limites e os recursos especiais da máquina-alvo a fim de produzir um código mais compacto e eficiente. O código produzido pelo compilador deve se aproveitar dos recursos especiais de cada máquina-alvo. Segundo Aho (1995), o código objeto pode ser uma seqüência de instruções absolutas de máquina, uma seqüência de instruções de máquina relocáveis, um programa em linguagem assembly ou um programa em outra linguagem. 1 Acadêmico do Curso de Ciência da Computação URI-FW - Universidade Regional Integrada do Alto Uruguai e das Missões - Campus Frederico Westphalen – RS –lelo.c.inf@gmail.com 2 Mestra em Ciência da Computação – Professora de Compiladoresda URI– adrianec@uri.edu.br
  • 2. 2 Um gerador de código é composto por três tarefas principais: seleção de instrução, alocação e atribuição de registrador, e escalonamento de instrução. A seleção de instrução compreende a escolha de instruções apropriadas da arquitetura alvo para implementar os comandos da RI. A alocação e a atribuição de registrador decidem que valores devem ser mantidos em registradores e também quais registradores usar. O escalonamento de instrução envolve a decisão sobre a ordem em que a execução das instruções deve escalonar. PRINCIPAIS REQUISITOS IMPOSTOS As exigências tradicionalmente impostas a um gerador de código são severas. O código de saída precisa ser correto e de alta qualidade, significando que o mesmo deve tornar efetivo o uso dos recursos da máquina-alvo. Sobretudo, o próprio gerador de código deve rodar eficientemente. O que se deve ser levado em consideração é impossível, matematicamente, gerar um código perfeito. Na verdade, o desenvolvedor deve se contentar com as técnicas heurísticas que geram um bom código, mas não necessariamente um ótimo código. A escolha de um método heurístico é importante, pois na medida em que um algoritmo de geração de código cuidadosamente projetado pode produzir um código que seja várias vezes mais rápido do que aquele produzido por um algoritmo concebido às pressas. Pode-se definir isto nos seguintes itens a seguir:  O código gerado deve ser correto e de alta qualidade;  O código deve fazer uso efetivo dos recursos da máquina;  O código gerado deve executar eficientemente;  O problema de gerar código ótimo é insolúvel (indecidível) como tantos outros. CONSIDERAÇÕES Quatro aspectos que devem ser levado em consideração no momento em que for fazer um gerador de código.  Forma do código objeto ser gerado: o Com uma linguagem absoluta, relocável ou assembly;  Seleção das instruções de máquina: o A escolha da seqüência apropriada pode resultar num código mais curto e mais rápido;
  • 3. 3  Alocação de registradores;  Escolha da ordem de avaliação: o A determinação da melhor ordem para execução das instruções é um problema insolúvel; o Alguns computadores requerem menos registradores para resultados intermediários. MÁQUINA OBJETO Deve existir uma familiaridade com a máquina que criará o objeto assim como com o conjunto de instruções. As arquiteturas de Máquinas alvos mais comuns são: RISC (ReducedInstuction Set Computer), CISC (ComplexInstruction Set Computer) e baseadas em Pilha. Três aspectos básicos que devem ser analisados em um projeto que são:  Forma do Código Objeto o Linguagem absoluta:  A geração de um programa em linguagem absoluta de máquina tem a vantagem de que o programa objeto pode ser armazenado numa área de memória fixa e ser imediatamente executada.  Compiladores deste tipo são utilizados em ambientes universitários, onde é altamente conveniente diminuir o custo de compilação.  Os compiladores que geram código absoluto e executam imediatamente são conhecidos como loadandgocompilers. o Linguagem relocável:  Ageração de código em linguagem de máquina relocável permite a compilação de subprogramas.  Módulos e objetos relocáveis podem ser ligados e carregados por um ligador/carregador.  Essa estratégia dá flexibilidade para compilar sub-rotinas separadamente e para chamar outros programas previamente compilados. o Linguagem assembly:  A tradução para linguagem assembly facilita o processo de geração de código.
  • 4. 4  São geradas instruções simbólicas e podem ser usadas as facilidades de macro instruções.  O preço pago é um passo adicional – tradução para linguagem de máquina.  É uma estratégia razoável, especialmente, para máquinas com pouca memória, nas quais o compilador deve desenvolver-se em vários passos.  Escolha da seqüência da execução das instruções que é necessária, quanto mais acertarem mais tempo economizará e o código será mais compacto.  Escolha da ordem de avaliação. Sabe-se que é necessária a definição de uma ordem para acertar e se aproximar da melhor seqüência, mas como fazer isso? É um grande problema. As vezes é necessário optar por uma técnica de menor número de registradores para alcançar no mínimo pelo menos resultados intermediários. ALOCAÇAO DE REGISTRADORES Os trabalhos que necessitam do uso de registradores são processamentos mais ágeis e menores, que levarão um curto período de tempo para serem executados. Por essa razão o uso de registradores deve cumprir suas alocações com eficiência. Instruções com registradores são mais curtas e mais rápidas do que instruções envolvendo memória. Portanto, o uso eficiente de registradores é muito importante. A atribuição ótima de registradores a variáveis é muito difícil e muito problemática quando a máquina trabalha com registradores aos pares (para instruções de divisão e multiplicação), ou provê registradores específicos para endereçamento e para dados. O problema do uso otimizado de registradores fica simples quando a máquina possui um único registrador para realizar operações aritméticas. O problema deixa de existir quando as operações aritméticas são realizadas sobre uma pilha. Neste caso, deixa de ser necessária, inclusive a utilização de variáveis temporais. Pode-se dizer que o uso dos registradores frequentemente é subdividido em dois subproblemas que são:  Alocação de registradores: etapa na qual seleciona-se o conjunto de variáveis que residirão nos registradores em cada ponto do programa.
  • 5. 5  Atribuição de registradores: etapa na qual determina-se um registrador específico em que uma variável residirá. GERENCIAMENTO DE MEMÓRIA EM TEMPO DE EXECUÇÃO Para o gerenciamento de memória é necessário conhecer os endereços de código objeto. Os endereços são determinados de acordo com o tipo de alocação de memória utilizada. Em um compilador é utilizado dois tipos de alocação. A alocação estática e a alocação em pilhas. Mas também tem os endereços em tempo de execução, conhecido como dinâmico.  Alocação Estática: O tamanho e o layout dos registros de ativação são determinados pelo gerador de código a partir de informações sobre os nomes, armazenados na tabela de símbolos. Para implementar o caso mais simples é necessário uma máquina alvo que execute as duas instruções. Conforme a figura. OST salva o endereço de retorno no registrador de ativação e o BR transfere o controle para o código objeto do procedimento chamado callee. O calle.static.Area é uma constante que fornece o endereço de início do registro de ativação para callee. A variável callee.codeArea é uma constante que refere ao endereço da primeira instrução do procedimento chamado callee. O #here+20 faz o ponteiro de instrução corrente a percorrer vinte bytes, ou seja, cinco palavras a frente da instruçãoST. O que caracteriza as alocações estáticas é o conhecimento do seu endereço no momento em que se constrói o código objeto.  Alocação de Pilha: Quando se utiliza endereços relativos para armazenamento nos registros de ativação de uma alocação estática, esta na verdade transformando essa alocação em um outro tipo, em uma alocação dinâmica. No entanto a posição de um registro só é conhecida quando é executado o código objeto. Essa posição é armazenada em um registrador que forma a palavra pode ser acessada como deslocamento a partir desse valor nesse registrador. O modo de endereçamento indexado da máquina alvo é conveniente para essa finalidade.
  • 6. 6 O deslocamento pode ser positivo ou negativo, dependendo para onde o ponteiro de deslocamento se mova. Neste exemplo considera-se um deslocamento positivo com o SP apontando para o início do registro de ativação que está no topo da pilha.  Alocação em Tempo execução para os nomes (Dinâmica): A abordagem de endereçamento em tempo de execução torna o compilador mais portável, pois o front-end não precisa ser substituído nem mesmo quando o compilador for transferido para uma máquina diferente, onde é necessária uma otimização em tempo de execução. Para fazer o acesso, o nome é substituído pelo código para acessar os endereços de memória. BLOCOS BÁSICOS E GRAFOS DE FLUXO Nos algoritmos de três endereços, uma solução muito útil para a sua compreensão é a representação de três endereços chamados grafo de fluxo. Os nós deste grafo representam computações e os lados representam o fluxo de controle. Blocos Básicos: São trechos de programa cujas instruções são sempre executadas em ordem (em linha reta), da primeira até a última. É uma região de código seqüencial sem qualquer salto de execução, onde o controle entra no início e o deixa no fim. Arestas direcionadas são usadas para representar tais saltos na estrutura de controle. Ainda há dois blocos especiais, o bloco de entrada e o bloco de saída, de onde se começa e termina o fluxo respectivamente. Um bloco básico computa um conjunto de expressões que são os valores dos nomes vivos à saída de um bloco. Dois blocos básicos são equivalentes, se computarem o mesmo conjunto de expressão. Várias transformações podem ser aplicadas a um bloco básico sem que o conjunto de expressões computadas seja alterado. Muitas dessas transformações ajudam na melhora da qualidade do novo código que será gerado a partir do bloco básico. Transformações Primárias: Primeiramente é feito a eliminação de sub-expressões comuns. Para isto é usado a Alocação estática. Suponha-se o seguinte bloco básico
  • 7. 7 Como o segundo e o quarto enunciados computam a mesmaexpressão, esse bloco base pode ser transformado no bloco equivalente. Eliminação de código morto. É o código no programa que nunca será executado com nenhum tipo de dados ou em outras condições. Supondo que um programa continha código morto (deadcode), isto é, código que não pode ser alcançado durante a execução de um programa, este programa pode ser otimizado pela remoção deste código. Renomeação de variáveis temporárias. As variáveis temporárias durante a geração de código intermediário podem não ser estritamente necessário. Normalmente esta eliminação é feita dando nomes para as variáveis (temporariamente ou não) que vão guardar os valores temporários. Por exemplo: se tiver no código fonte x:=a+b; o código intermediário terá t1 = a +b; x = t1; ea variável t1 pode ser eliminada. Assim, podemos sempre transformar um bloco básico num bloco equivalente, onde cada enunciado que define um temporário passa a definir um equivalente. Intercâmbio de enunciados. Supondo ter um bloco com dois enunciados adjacentes t1:= b + c e t2:= x + y, pode-se então intercambiar os enunciados sem alterar o valor do bloco somente se nem x bem y forem t1, nem b nem c forem t2. Um bloco básico na forma normal permite qualquer que seja a troca de enunciados possíveis. Transformações Algébricas. Pode-se aplicar transformações baseadas também em propriedades algébricas, como comutatividade, associatividade, identidade, entre outros casos. Por exemplo: X:=a+b*c, como a soma é comutativa, pode-se transformar em X:=b*c+a. Grafos de Fluxo. É uma representação que usa notação de grafo para descrever todos os caminhos que podem ser executados por um programa de computador, onde cada nó representa um bloco básico. Através do grafo de fluxo é possível adicionar informações a respeito do fluxo de controle de blocos básicos. Eliminação de código inalcançável.
  • 8. 8 Elimina também o problema do desvio sobre desvio, mas, neste caso o desvio sobre desvio leva o código a não entrar em uma ou mais linhas do programa. GERAÇÃO DO CÓDIGO SIMPLES É importante considerar que a maioria dos geradores deve evitar a geração de instruções de cargas e armazenamentos desnecessários. Os registradores devem:  Colocar nos registradores todos os operandos para realizar uma operação;  Tem-se que guardar valores globais calculados em um bloco básico que é usado em outros blocos;  Serem usados para auxiliar o gerenciamento de memória em tempo de execução;  Quando uma expressão grande está sendo avaliada, guardar resultados de sub- expressões;  Tais necessidades são concorrentes, justamente pelo fato de ter um número limitado de registradores. GERAÇÃO DO CÓDIGO OBJETO A abordagem mais simples da etapa de geração de código objeto é: Para cada instrução (do código intermediário) ter um gabarito com a correspondente seqüência de instruções em linguagem simbólica do processador-alvo. Exemplo: le := ld1 + ld2 A seqüência de instruções em linguagem simbólica que corresponde a essa instrução depende da arquitetura do processador para o qual o programa é gerado. PRODUÇÃO DE CÓDIGO EXECUTÁVEL O resultado da compilação é um arquivo em linguagem simbólica. Montagem
  • 9. 9  Processo em que o programa em linguagem simbólica é transformado em formato binário, em código de máquina;  O programa responsável por essa transformação é o montador. Montadores  Traduzem código em linguagem simbólica para linguagem de máquina. CONCLUSÃO O gerador de código recebe como entrada uma representação intermediária do programa fonte e o mapeia em uma linguagem objeto. Se a linguagem objeto for código de máquina de alguma arquitetura, devem-se selecionar os registradores ou localizações de memória para cada uma das variáveis usadas pelo programa. Depois, os códigos intermediários são traduzidos em sequências de instruções de máquina que realizam a mesma tarefa. Um aspecto crítico da geração de código está relacionado à cuidadosa atribuição dos registradores às variáveis do programa REFERÊNCIAS BIBLIOGRÁFICAS AHO, A. V.; ULLMAN, J. D. Compiadores: Princípios, Técnicas e Ferramentas. Guanabarra, Koogan, 1995. Gerador de Código Objeto Disponível em <http://www.ybadoo.com.br/ead/cmp/09/CMP_slides.pdf>, acesso realizado em 02/06/2014.