Propagación constante en el diseño del compilador

La propagación constante es una de las técnicas de optimización de código local  en Compiler Design. Se puede definir como el proceso de reemplazar el valor constante de las variables en la expresión. En palabras más simples, podemos decir que si se le asigna un valor a una constante conocida, simplemente podemos reemplazar ese valor por una constante. Las constantes asignadas a una variable se pueden propagar a través del gráfico de flujo y se pueden reemplazar cuando se usa la variable. 

La propagación constante se ejecuta utilizando resultados de análisis de definición de alcance en compiladores, lo que significa que si la definición de alcance de todas las variables tiene la misma asignación que asigna una misma constante a la variable, entonces la variable tiene un valor constante y puede sustituirse por la constante. 

Supongamos que estamos usando la variable pi y le asignamos un valor de 22/7

pi = 22/7 = 3.14

En el código anterior, el compilador primero debe realizar la operación de división , que es una operación costosa, y luego asignar el resultado calculado 3.14 a la variable pi. Ahora, si en cualquier momento tenemos que usar este valor constante de pi, entonces el compilador tiene que buscar nuevamente el valor y nuevamente realizar la operación de división y luego asignarlo a pi y luego usarlo. Esta no es una buena idea cuando podemos asignar directamente el valor 3.14 a la variable pi, reduciendo así el tiempo necesario para ejecutar el código.  

Además, la propagación constante reduce el número de casos en los que los valores se copian directamente de una ubicación o variable a otra, para simplemente asignar su valor a otra variable. Para un ejemplo :

Considere el siguiente pseudocódigo:  

a = 30
b = 20 - a /2
c = b * ( 30 / a + 2 ) -  a

Podemos ver que en la primera expresión valor de a le han asignado un valor constante que es 30. Ahora, cuando el compilador llega a ejecutar la segunda expresión se encuentra con a, entonces sube a la primera expresión para buscar el valor de a y luego asigne el valor de 30 a a nuevamente, y luego ejecuta la segunda expresión. Ahora llega a la tercera expresión y encuentra b y a nuevamente, y luego necesita evaluar la primera y la segunda expresión nuevamente para calcular el valor de c. Por lo tanto, a debe propagarse 3 veces. Este procedimiento requiere mucho tiempo.

En su lugar, podemos reescribir el mismo código que:

a = 30
b = 20 - 30/2
c = b * ( 30 / 30 + 2) - 30

Este código actualizado es más rápido en comparación con el código anterior, ya que el compilador no necesita volver una y otra vez a las expresiones anteriores buscando y copiando el valor de una variable para calcular las expresiones actuales. Esto ahorra mucho tiempo y, por lo tanto, reduce la complejidad del tiempo y realiza operaciones de manera más eficiente.   

Tenga en cuenta que el comportamiento de esta técnica de propagación constante depende del compilador, ya que pocos compiladores realizan operaciones de propagación constante dentro de los bloques básicos; mientras que unos pocos compiladores realizan operaciones de propagación constante en un flujo de control más complejo. 

Publicación traducida automáticamente

Artículo escrito por disha55handa y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *