Diferença chave – Otimização de código dependente da máquina vs. independente da máquina
Programas de computador são conjuntos de instruções dadas ao hardware, para realizar tarefas. Esses programas são escritos principalmente em linguagens de alto nível e o computador não entende essa linguagem. 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 construir o código de destino. A otimização de código é uma delas. Existem duas técnicas de otimização, como otimização de código dependente de máquina e otimização de código independente de máquina. A principal diferença entre a otimização de código dependente de máquina e a otimização de código independente de máquina é que a otimização dependente de máquina é aplicada ao código objeto, enquanto a otimização de código independente de máquina é aplicada ao código intermediário.
O que é otimização de código dependente de máquina?
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 léxico 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 haja um pedaço de código como p=q + r;
Aqui, p, q são inteiros, mas r é um float. Usando o analisador semântico, a variável c integer é convertida em float. Portanto, ele faz a análise semântica. A saída do analisador semântico vai para o gerador de código intermediário. Ele retorna um código intermediário que então 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 alvo. A saída do otimizador de código é fornecida ao gerador de código e, finalmente, o código de destino é compilado.
Figura 01: Fases do Compilador
Na otimização de código dependente de máquina, a otimização é aplicada ao código-fonte. Alocar uma quantidade suficiente de recursos pode melhorar a execução do programa nesta otimização.
O que é otimização de código independente de máquina?
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 alcançar a otimização de código independente da máquina. Eles são descritos usando os seguintes exemplos.
Leia as linhas de código abaixo.
for (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. Assim, esta linha pode ser colocada fora do loop da seguinte forma.
b=x+2;
for (j=0; j< 10; j++)
{a[j]=5j;
}
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 de j nunca será igual a 10. Ele já está inicializado com o valor 5. Portanto, este bloco if pode ser removido. Esta técnica é a eliminação de 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=a2; ou pode ser substituído por adição, b=a + a;
Consulte o código abaixo.
for (j=1; j <=5; j++) {
valor=j5;
}
Em vez da multiplicação, o código pode ser alterado da seguinte forma.
int temp=5;
for (j=1; j<=5; j++) {
temp=temp + 5;
valor=temp;
}
É possível avaliar as expressões que são constantes em tempo de execução. É chamado de dobra constante. Pode ser declarado como b[j+1]=c [j+1];
Em vez disso, pode ser alterado da seguinte forma.
n=j +1;
b[n]=c[n];
Pode haver loops como segue.
for (j=0; j<5; j++) {
printf(“a\n”);
}
for (j=0; j <5; j++) {
printf(“b\n”);
}
Imprimindo a e b, ambos têm o mesmo número de iterações. Ambos podem ser combinados em um loop for da seguinte forma.
for (j=0; j <5; j++) {
printf(“a \n”);
printf(“b\n”);
}
Outra técnica importante é a eliminação da 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=bc + k;
d=b c + m;
Este código pode ser convertido da seguinte forma.
temp=bc;
a=temp + k;
d=temp + m;
Não é necessário calcular bc repetidamente. O valor multiplicado pode ser armazenado em uma variável e reutilizado.
Qual é a semelhança entre otimização de código dependente de máquina e independente de máquina?
Ambos pertencem ao código Otimização
Qual é a diferença entre otimização de código dependente de máquina e independente de máquina?
Otimização de código dependente da máquina vs. independente da máquina |
|
A otimização de código dependente da máquina é aplicada ao código objeto. | Otimização de código independente de máquina é aplicada ao código intermediário. |
Envolvimento com Hardware | |
Otimização dependente da máquina envolve registradores de CPU e referências absolutas de memória. | Otimização de código independente de máquina não envolve registros de CPU ou referências absolutas de memória. |
Resumo – Otimização de código dependente da máquina vs. independente da máquina
A otimização de código consiste em duas técnicas de otimização, a saber, otimização de código dependente de máquina e otimização de código independente de máquina. A diferença entre a otimização de código dependente da máquina e a otimização independente da máquina é que a otimização dependente da máquina é aplicada ao código objeto, enquanto a otimização do código independente da máquina é aplicada ao código intermediário.
Baixe a versão em PDF de Otimização de Código Dependente de Máquina vs Otimização de Código Independente de Máquina
Você pode baixar a versão em PDF deste artigo e usá-lo 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