Programas de computador são conjuntos de instruções fornecidas ao hardware para executar tarefas. Esses programas são escritos principalmente em idiomas de alto nível, e o computador não entende esse idioma. Portanto, um compilador é usado para converter essas instruções em código de máquina ou código de destino. Ele passa por várias fases para criar o código de destino. A otimização de código é um deles. Existem duas técnicas de otimização como, dependente da máquina e otimização do código independente da máquina. o diferença chave entre a otimização do código dependente da máquina e independente da máquina é que o a otimização dependente da máquina é aplicada ao código do objeto, enquanto a otimização do código independente da máquina é aplicada ao código intermediário.
1. Visão geral e principais diferenças
2. O que é Otimização de Código Dependente da Máquina
3. O que é Otimização de Código Independente da Máquina
4. Semelhanças entre otimização de código dependente de máquina e independente de máquina
5. Comparação lado a lado - otimização de código dependente da máquina versus independente da máquina em forma de tabela
6. Resumo
Ao converter o código fonte em código objeto ou código alvo, o compilador passa por várias fases. Primeiro, o código-fonte é fornecido ao analisador Lexical, que produz tokens. Em seguida, a saída é fornecida ao analisador de sintaxe, que investiga se os tokens gerados estão em ordem lógica. Essa saída é fornecida ao analisador semântico. Suponha que exista um trecho de código como p = q + r;
Aqui, p, q são números inteiros, mas r é um ponto flutuante. Usando o analisador semântico, a variável c inteira é convertida em um flutuador. Portanto, faz a análise semântica. A saída do analisador semântico vai para o gerador de código intermediário. Retorna um código intermediário que depois vai para o otimizador de código. A otimização de código é o processo de eliminar as instruções não essenciais do programa sem alterar o significado do código fonte real. Não é uma otimização obrigatória, mas pode melhorar o tempo de execução do código de destino. A saída do otimizador de código é fornecida ao gerador de código e, finalmente, o código de destino é construído.
Figura 01: Fases do compilador
Na otimização de código dependente da máquina, a otimização é aplicada ao código-fonte. Alocar quantidade suficiente de recursos pode melhorar a execução do programa nessa otimização.
Quando a otimização é feita no código intermediário, ela é chamada de otimização de código independente da máquina. Existem diferentes técnicas para obter otimização de código independente da máquina. Eles são descritos usando os seguintes exemplos.
Leia as linhas de código abaixo.
para (j = 0; j<10; j ++)
b = x + 2;
a [j] = 5 * j;
De acordo com o código acima, b = x + 2 é calculado repetidamente em cada iteração. Uma vez que b é calculado, ele não muda. Portanto, essa linha pode ser colocada fora do loop da seguinte maneira.
b = x + 2;
para (j = 0; j< 10; j++)
a [j] = 5 * j;
Isso é chamado de movimento de código.
Leia as linhas de código abaixo.
j = 5;
if (j == 10)
a = b + 20;
De acordo com o código acima, 'if block' nunca será executado porque o valor j nunca será igual a 10. Ele já foi inicializado com o valor 5. Portanto, esse bloco if pode ser removido. Essa técnica é a eliminação do código morto.
Outro método é a redução de força. Operações aritméticas como multiplicação requerem mais memória, tempo e ciclos de CPU. Essas expressões caras podem ser substituídas por expressões baratas como b = a * 2; ou pode ser substituído por adição, b = a + a;
Consulte o código abaixo.
para (j = 1; j <= 5; j ++)
valor = j * 5;
Em vez da multiplicação, o código pode ser alterado da seguinte maneira.
int temp = 5;
para (j = 1; j<=5; j++)
temp = temp + 5;
valor = temp;
É possível avaliar as expressões que são constantes no tempo de execução. É chamado dobragem constante. Pode-se afirmar como b [j + 1] = c [j + 1];
Em vez disso, pode ser alterado da seguinte maneira.
n = j +1;
b [n] = c [n];
Pode haver loops da seguinte maneira.
para (j = 0; j<5; j++)
printf ("a \ n");
para (j = 0; j <5; j++)
printf ("b \ n");
Imprimindo aeb, ambos têm o mesmo número de iterações. Ambos podem ser combinados em um loop for, como a seguir.
para (j = 0; j <5; j++)
printf ("a \ n");
printf ("b \ n");
Outra técnica importante é a Eliminação de subexpressão comum. É substituir as expressões idênticas por uma única variável para fazer o cálculo. Consulte o código abaixo.
a = b * c + k;
d = b * c + m;
Este código pode ser convertido da seguinte maneira.
temp = b * c;
a = temperatura + k;
d = temperatura + m;
Não é necessário calcular b * c repetidamente. O valor multiplicado pode ser armazenado em uma variável e reutilizado.
Otimização de código dependente da máquina versus independente da máquina | |
A otimização de código dependente da máquina é aplicada ao código do objeto. | A otimização de código independente de máquina é aplicada ao código intermediário. |
Envolvimento com hardware | |
A otimização dependente da máquina envolve registros da CPU e referências de memória absoluta. | A otimização de código independente da máquina não envolve registros da CPU ou referências de memória absoluta. |
A otimização de código consiste em duas técnicas de otimização, a saber, otimização de código dependente e independente de máquina. A diferença entre a otimização dependente da máquina e o código independente da máquina é que a otimização dependente da máquina é aplicada ao código do objeto, enquanto a otimização do código independente da máquina é aplicada ao código intermediário.
Você pode fazer o download da versão em PDF deste artigo e usá-la para fins offline, conforme nota de citação. Faça o download da versão em PDF aqui Diferença entre otimização de código dependente de máquina e independente de máquina
1. “Design do compilador | Otimização de código. ” GeeksforGeeks. Disponivel aqui
2.Point, Tutoriais. "Design do compilador - otimização de código". Www.tutorialspoint.com, Tutorials Point, 15 de agosto de 2017. Disponível aqui
3.Estudies4you. “Material de Estudo JNTUH CSE.” Diferença entre otimização de código dependente da máquina e independente. Disponivel aqui
1. 'Compilador' Por I, Surachit, (CC BY-SA 3.0) via Commons Wikimedia