En la teoría de compiladores , los usos expuestos hacia arriba o los usos alcanzables [1] son todos los usos de una variable a los que se puede llegar desde un punto en el programa. Un uso de una variable es un punto o una declaración en el que se hace referencia a esa variable (se lee) sin modificarla. Un uso de una variable A es alcanzable desde un punto p si existe una ruta de flujo de control en el gráfico de flujo de control desde p hasta el uso sin una definición de A en la ruta.
Un análisis de usos alcanzables es un análisis de flujo de datos [1] para calcular todos los usos alcanzables de un programa. Es muy similar al análisis de vida . Una variable está activa en un punto del programa si tiene uno o más usos alcanzables. En comparación con el análisis de vida, el análisis de usos alcanzables proporciona información adicional sobre dónde se utiliza la variable.
Los usos expuestos hacia arriba ocurren en la etapa de propagación de copia de la compilación del programa . [2] Durante la etapa de propagación de copia, las instancias de un objetivo se reemplazan con asignaciones a sus valores. Durante este proceso, es necesario que el compilador comprenda a qué instancias de un objetivo se está accediendo para que pueda ocurrir la sustitución apropiada, relacionada con el concepto de definición de alcance en el análisis de alcance. [3] Esto se hace con el propósito de simplificar el código antes de la ejecución: si el número de usos expuestos hacia arriba de una asignación es cero, no contribuye al resultado final del código y se puede eliminar de manera segura. [1] Esto también es útil para mejorar la seguridad del código durante las etapas de compilación. [4]
Considere el siguiente pseudocódigo:
x = 1y = zSi es falso : x = 0demás : x = y + 2
Es seguro asumir que la línea 5 nunca ocurrirá, como lo demuestra el hecho de que el número de usos hacia arriba expuestos para este punto es cero. Por lo tanto, esto se puede simplificar:
y = zx = z + 2
Esto conduce a un resultado que es menos complejo de compilar y más eficiente de ejecutar. [2] Esto también cumple con la definición de alcanzar la definición : en este contexto, el análisis de flujo ascendente fue la técnica utilizada para demostrar las necesidades de alcanzar la definición. Las técnicas adicionales permiten un análisis más complejo de problemas de flujo de control más profundamente entrelazados o complejos, como aquellos con varias formas de bucles. [4]