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.

Documentos relacionados