Análisis de Demanda para el Lenguaje Curry basado en
Transcripción
Análisis de Demanda para el Lenguaje Curry basado en
ANALISIS DE DEMANDA PARA EL LENGUAJE CURRY BASADO EN GENERACIÓN DINÁMICA DE DOMINIOS FINITOS Es ampliamente conocido que los lenguajes declarativos son en general menos eficientes que los lenguajes imperativos. Aunque los factores que influyen en esta menor eficiencia son muchos, una de las características que más dificultan su evaluación es el hecho de que suelen estar dotados de evaluación perezosa. Este tipo de evaluación dota a los lenguajes declarativos de mayor expresividad que los lenguajes imperativos pero a costa de tener un lenguaje con una evaluación ‘pesada’. Un posible método para mejorar la eficiencia de los lenguajes dotados de evaluación perezosa es reservar esta estrategia de evaluación para cuando sea realmente necesaria y usar la evaluación impaciente en el resto de ocasiones. Es necesario pues, poder decidir cuando, dado un código declarativo concreto, la evaluación perezosa es realmente necesaria. Una expresión se puede evaluar de forma impaciente conservando el resultado que se obtendría mediante evaluación perezosa si es preciso conocer su valor totalmente evaluado para que la ejecución del programa pueda continuar. El análisis de estricticidad (y su versión más general, el análisis de demanda) es una herramienta destinada a encontrar qué expresiones deben ser completamente evaluadas y cuales no. De este modo, cuanto más preciso sea el análisis de demanda que se realice sobre un programa más se podrá mejorar su eficiencia. Dado un cierto código declarativo realizar sobre él un análisis estático (tal como el análisis de demanda) es en general una tarea compleja. Por este motivo, el análisis de demanda se suele acometer sobre ‘simplificaciones’del programa real. La interpretación abstracta es uno de los métodos que permiten realizar esta simplificación. La interpretación abstracta exige disponer de un dominio de datos (el dominio abstracto) que se asemeje de algún modo al dominio real sobre el que se ejecute el programa real pero que sea mucho más reducido o simple en otro sentido, de modo que sea más fácil operar con el dominio abstracto que con el real. Hasta ahora se han propuesto varios métodos de análisis basados en dominios abstractos pero estos dominios suelen adolecer de ciertos problemas generales: • El dominio es infinito. • El dominio propuesto sólo es aplicable a un tipo concreto de datos, no siendo de utilidad para analizar otros programas que utilicen otros tipos de datos (por ejemplo, el dominio de 4 puntos de Wadler sólo es aplicable a listas). El objetivo de este trabajo es el de presentar un método que permita crear un dominio finito que sea aplicable a un número grande de tipos de datos. De esta forma se resuelven, al menos parcialmente los dos problemas anteriormente mencionados: • El dominio creado es finito por lo que en general será más fácilmente tratable que un dominio infinito. • El dominio presentado no se diseña ‘a priori’sino que se genera analizando los tipos de datos que intervienen en el programa que se examina. El dominio no es pues, fijo. A cada tipo de datos le corresponde un dominio distinto. Para la generación del nuevo dominio se usa el formalismo de los predicados parciales. Los nodos del dominio son todos los ‘reduces’(catamorfismos) que se pueden construir para el tipo de datos considerado donde las funciones del catamorfismo son todos los predicados parciales existentes de aridad igual a la de los constructores de datos del tipo. Así, por ejemplo, para el conocido tipo de listas definido como: Data list a = Nil | Cons a (list a) Para ‘Nil’existen dos posibles funciones de aridad 0 mientras las funciones posibles para sustituir a ‘Cons’(que deben ser de aridad 2) son 6. Por tanto los nodos del espacio correspondiente al tipo de listas serán 2*6=12. A estos habrá que añadir un nodo espacial que representa a todos los términos del tipo. En total, 13 elementos. Un nodo del espacio abstracto representa aquellos términos para los que el ‘reduce’del nodo devuelve el valor ‘True’del dominio 2 (dominio imagen de los predicados parciales). Por la forma en la que se construyen los nodos del dominio los conjuntos con los que se relacionan representan propiedades ‘positivas’(es decir, en el caso de las listas uno de los nodos podría representar listas con todos sus elementos definidos pero es seguro que ningún nodo va a representar la las listas con al menos un elemento no definido). Tras establecer la generación del dominio se pasa a abordar el problema de ‘refinarlo’. En efecto, aunque cada nodo representa un ‘reduce’distinto, no todos representan conjuntos distintos de términos reales. Es por eso que se ha diseñado un método que permite detectar qué nodos son iguales para poder tener un dominio sin nodos ‘iguales’ con objeto de tener un dominio lo más pequeño posible sin perder precisión en el análisis. El método de detección de nodos iguales se basa en generar un conjunto ‘suficiente’de términos de prueba y observar qué nodos devuelven el mismo resultado para estos términos de prueba. Finalmente, se esboza como se puede usar el nuevo dominio para realizar el análisis de demanda. El procedimiento se basa en el empleo de las ‘ecuaciones de demanda’y en la comprobación de los resultados que se devuelven para ciertos términos clave del tipo de datos bajo estudio. Se incluye en este apartado una pequeña comparación de los resultados que se pueden obtener mediante el dominio de 4 puntos de Wadler y los obtenidos con el dominio generado en este trabajo. Se verá que decidir cual de los dos resultados es mejor no es obvio ya que los conjuntos de términos reales tratados por ambos dominios no son los mismos y que por tanto habrá ocasiones en las que los dos resultados sean mejores que el otro. La decisión final depende del objetivo final que se persiga con el análisis que se quiera realizar. Adicionalmente, el trabajo incluye un procedimiento para construir el ‘reduce’de una amplia variedad de tipos de datos (en concreto, los tipos uniformes). La construcción automatizada del ‘reduce’de un tipo es de utilidad para crear un sistema que realice el análisis de demanda de forma totalmente mecánica.