En informática , el análisis de estrictez se refiere a cualquier algoritmo utilizado para demostrar que una función en un lenguaje de programación funcional no estricto es estricta en uno o más de sus argumentos. Esta información es útil para los compiladores porque las funciones estrictas se pueden compilar de manera más eficiente. Por lo tanto, si se demuestra que una función es estricta (mediante el análisis de estrictez) en el momento de la compilación, se puede compilar para utilizar una convención de llamada más eficiente sin cambiar el significado del programa que la contiene.
f
Nótese que se dice que una función diverge si retorna : operacionalmente, eso significaría que causa la terminación anormal del programa que la contiene (por ejemplo, falla con un mensaje de error) o que se repite infinitamente. La noción de "divergencia" es significativa porque una función estricta es una que siempre diverge cuando se le da un argumento que diverge, mientras que una función perezosa (o no estricta) es una que puede o no diverger cuando se le da dicho argumento. El análisis de estrictez intenta determinar las "propiedades de divergencia" de las funciones, lo que identifica algunas funciones que son estrictas.f
El análisis de estrictez se puede caracterizar como una interpretación abstracta hacia adelante que aproxima cada función del programa mediante una función que asigna las propiedades de divergencia de los argumentos a las propiedades de divergencia de los resultados. En el enfoque clásico iniciado por Alan Mycroft , la interpretación abstracta utilizaba un dominio de dos puntos donde 0 denota el conjunto considerado como un subconjunto del argumento o tipo de retorno, y 1 denota todos los valores del tipo. [1]
El compilador Glasgow Haskell (GHC) utiliza una interpretación abstracta hacia atrás conocida como análisis de demanda para realizar análisis de estrictez, así como otros análisis de programas. En el análisis de demanda, cada función se modela mediante una función que va desde las demandas de valor sobre el resultado hasta las demandas de valor sobre los argumentos. Una función es estricta en un argumento si una demanda de su resultado conduce a una demanda de ese argumento. [2]
El análisis de estrictez basado en proyecciones, introducido por Philip Wadler y RJM Hughes , utiliza proyecciones de estrictez para modelar formas más sutiles de estrictez, como la estrictez de cabeza en un argumento de lista. (Por el contrario, el análisis de demanda de GHC solo puede modelar la estrictez dentro de los tipos de productos, es decir, tipos de datos que solo tienen un único constructor ). Una función se considera estricta de cabeza si , donde es la proyección que evalúa de cabeza su argumento de lista. [3]
En la década de 1980 hubo una gran cantidad de investigaciones sobre el análisis de estrictez.