back-end compilação aula-11-back-end.pdf. compilação back-end todo o processo de geração de...

Post on 22-Apr-2015

114 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Back-End Compilaçãoaula-11-back-end.pdf

Compilação Back-end

Todo o processo de geração de código para a máquina alvo é feita na etapa de compilação conhecida como back-end ou síntese.

Uma representação do código em uma estrutura de árvore (árvore sintática) é recebida das etapas do front-end após a execução da análise semântica.

O que ocorre em muitos casos é que a geração de código pode ser realizada através de ações semânticas processo conhecido com Tradução Dirigida por Sintaxe.

Compilação Back-end

Em geral a geração de código pode ocorrer diretamente para a máquina alvo ou o que mais comum e a geração de código ser realizada para uma etapa intermediaria e posteriormente ser gerado código para maquina alvo.

Livro

Geração de código intermediário

Transforma a árvore de derivação em um segmento de código denominado código intermediário.

Geração de código intermediário

Vantagens de utilização de uma representação intermediária. Otimização do código de modo a obter um código mais eficiente.

Simplificação de código pois o código intermediário representa uma versão inteligível do código.

Possibilidade da tradução do código intermediário em diversas máquinas.

Geração de código intermediário

A representação intermediária deve ser fácil de ser produzida, ou seja, criada e fácil de ser traduzida para a máquina alvo.

A maior principal diferença entre o código intermediário e o código final é que o código intermediário não especifica detalhes da máquina alvo, ela será uma representação da linguagem de alto nível com a linguagem assembly ou de máquina

O código intermediário deve representar todas as expressões do programa fonte.

Código de três endereços

É uma forma de representar uma linguagem intermediaria, é a forma mais comum de ser utilizada e cada instrução faz referência a no máximo três variáveis (endereços de memória). As instruções básicas dessa linguagem são as seguintes:

Código de três endereços

Onde A, B, e C representam variáveis, op representa

operadores, oprel um operadores relacionais e L um rótulo.

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 e atribuições e desvios.

Dessa forma as expressões da linguagem são decompostas na representação em uma serie de instruções.

Outro detalhe importante é o uso de variáveis temporárias nesse processo.

Com esse tipo de representação intermediara obtemos um código mais próximo possível ao assembly o que consequentemente facilita a geração de código para a máquina alvo.

Código de três endereços

Exemplo mais complexo de um código intermediário.

Código de três endereços

Exemplo mais complexo de um código intermediário.

JVM

Ver exemplos de Byte Code em Java

Linguagem de programação que possuem implementação para a JVM javap -c br.com.unoesc.Nome

JRuby

http://en.wikipedia.org/wiki/List_of_JVM_languages

Otimização de código

Essa fase é responsável por gerar um código mais eficiente que envolvem diretamente o uso de memória, espaço e velocidade de execução da instruções.

Normalmente quando a ganhos de espaços a perda de tempo de execução e vice-versa.

Nessa etapa são aplicados técnicas que permitem detectar processos que otimizem o código.

Otimização de código

As técnicas podem variar de compilador par compilador e devem manter o significado do programa original.

Devem executar a maior parte das melhorais de código dentro de um dentro de um determinado nível de esforço de otimização.

Essa etapa tende a consumir muito tempo na compilação e deve ser implementada somente se o compilador exigir um código mais eficiente.

Otimização de código

O processo de otimização de código envolve duas tarefas: Otimização de código intermediário: Com base no código

intermediário é eliminado atribuições redundantes, expressões comuns, variáveis temporárias desnecessárias, troca de instruções de lugar.

Otimização de código

Otimização de código

O processo de otimização de código envolve duas tarefas: Otimização de código objeto: Realiza a troca de instruções de

maquinas por instruções mais rápidas e de melhor utilização de registradores.

Otimização de código

Otimização de código em C

Exemplo em utilizando o compilador GCC No compilador gcc temos o parâmetro -O que determina esse

esforço. O comando gcc –O0 (nenhuma optimização) até gcc –O3 (Máxima otimização)

Otimização de código em C

Parâmetro O que faz-O0 Nenhuma otimização

-O1 Reduzir o tempo de compilação e o tamanho do executável.

-O2 Não causa aumento do executável, é o melhor, mais seguro (por conta da portabilidade) e o mais usado nos dias atuais na distribuição de softwares em Linux;

-O3 Opção com melhor nível de otimização; entretanto, é a que mais causa efeitos colaterais: arquivos maiores, maior uso de memória RAM.

Exercícios

top related