Código intermedio :
el código intermedio es un código independiente de la máquina, pero está cerca de la instrucción de la máquina. Árbol de sintaxis, notación Postfix, código de 3 direcciones, DAG se puede utilizar como lenguaje intermedio.
Necesidad de código intermedio:
- Supongamos que tenemos x no del idioma de origen e y no del idioma de destino:
- Sin ICG, tenemos que cambiar cada idioma de origen al idioma de destino directamente. Por lo tanto, para cada par de origen-objetivo necesitaremos un compilador. Por lo tanto, necesitamos compiladores (x*y), que pueden ser un número muy grande y que es literalmente imposible.
- Con ICG, solo necesitaremos una cantidad x de compiladores para convertir cada idioma fuente en código intermedio. También necesitaremos un compilador para convertir el código intermedio en los idiomas de destino.
por lo tanto, solo necesitaremos (x+y) no del compilador con ICG, que es mucho menor que x*y no del compilador.
- Se facilita la reorientación:
se puede crear un compilador para una máquina diferente adjuntando un back-end (que genera código de destino) para la nueva máquina a un front-end existente (que genera código intermedio). - Independiente de la máquina:
se puede aplicar un optimizador de código independiente de la máquina al código intermedio. Así que esto se puede ejecutar en cualquier máquina. - Simplicidad:
el código intermedio es lo suficientemente simple como para convertirlo fácilmente en cualquier código de destino. Por lo tanto, ICG reduce la sobrecarga de generación de código de destino. - Complejidad:
el código intermedio es lo suficientemente complejo como para representar toda la estructura compleja de los lenguajes de alto nivel. - Modificación:
podemos modificar fácilmente nuestro código para obtener un mejor rendimiento aplicando técnicas de optimización al código intermedio.
Optimización de código :
la optimización de código aplicada en el código de destino (código ensamblador) es una técnica de transformación que se utiliza para mejorar el código consumiendo menos recursos. La optimización de código es de 3 tipos:
- Optimización dependiente de la máquina: la optimización aplicada después de la generación del código objetivo (código ensamblador) es una optimización dependiente de la máquina.
- Independiente de la máquina: en esto, el compilador transforma una parte del código intermedio que no involucra ningún registro de CPU y/o ubicaciones de memoria absolutas. por ejemplo, código de 3 direcciones.
- Optimización local: la optimización que se realiza dentro del bloque (secuencia de declaraciones consecutivas) es la optimización local e, g. If-Else, switch-case, declaraciones condicionales y bucles como Do-While, For y repeat-until, etc.
Necesidad de optimización de código:
- Reducción de frecuencia de bucle:
la optimización de bucle es el proceso de optimización dentro del bucle. Esto reduce la frecuencia de evaluación de la expresión y saca del bucle las declaraciones invariantes del bucle. - Eliminación de código muerto:
elimina instrucciones innecesarias sin cambiar el comportamiento del código. - Velocidad:
la optimización del código aumenta la velocidad del programa. - Recursos:
después de la optimización del código, nuestro programa exige menos recursos, por lo que guarda nuestro recurso (es decir, CPU, memoria) para otro programador. - código ordenado y limpio:
después de eliminar la subexpresión común y el código redundante, nuestro código se convierte en el código limpio. - Reducción de la fuerza: la reducción
de la fuerza significa reemplazar un operador costoso por un operador simple (barato/de baja resistencia). - Para ejecutar menos número de iteraciones usamos optimización de código.
- Combinar los cuerpos de dos bucles siempre que compartan la misma variable de índice, es decir, para la interferencia de bucles o la fusión de bucles es una optimización de código.
Publicación traducida automáticamente
Artículo escrito por PinakiBanerjee0 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA