PROgrama de METodos rIgurosos de DesarrollO de Software de la Comunidad de Madrid
mid
Descripción
Investigación
  Resultados
    Programación declarativa
    Especificación y verificación
    Fiabilidad y seguridad
    Eficiencia
  Publicaciones
  Herramientas
Participación de la empresa
Personal
Charlas & Eventos
Ofertas de empleo
Contacto
Support
Comunidad de Madrid EU flag

Eficiencia

Compilación optimizante.

En esta línea hemos perseguido la definición de esquemas de compilación para que la ejecución del programa sea consciente del consumo de recursos, así como el desarrollo de métodos para optimizar programas en varios sentidos: número de pasos de ejecución, tamaño del programa, consumo de memoria, número de accesos a memoria o a los registros, etc. El objetivo final es obtener optimizadores automáticos que sean capaces de equilibrar distintos requisitos respecto al consumo de recursos.

Durante el período del proyecto correspondiente al presente informe se ha completado la tesis doctoral de José Francisco Morales. En ella se han desarrollado y mejorado técnicas avanzadas de compilación para Prolog, ortogonales a extensiones del lenguaje, y se han explorado algunos de los aspectos más relevantes, como la generación de código nativo optimizado (mediante compilación a C), código de bytes e intérpretes altamente optimizados, usando información de análisis estático para guiar la traducción, así como la generación automática de máquinas abstractas.

Hemos propuesto asimismo una nueva técnica de tabulación ("swapping tabling") que aúna las virtudes de las dos estrategias de planificación más conocidas ("local" y "batch"), proporcionando rapidez cuando sólo hace falta una solución (como en "batch"), pero que reduce el uso de memoria para fragmentos de ejecución tabulados (como "batch"). Los resultados experimentales confirman que esta es una opción que da excelentes resultados en cualquiera de esas dos situaciones.

Paralelización automática.

Nuestro objetivo final es la construcción de compiladores paralelizantes con métodos que permitan el aprovechamiento de los analizadores del consumo de recursos para mejorar el proceso de paralelización. Con este referente, hemos desarrollado un enfoque novedoso para el problema del control de la granularidad en la ejecución paralela de programas, que aplica técnicas de lógica difusa al control de granularidad en la paralelización automática. Mediante numerosos experimentos, hemos mostrado que el uso de dichas condiciones mejora en término medio el consumo de recursos de las ejecuciones.

Especialización.

Una aplicación clásica de la evaluación parcial -una de las técnicas de mayor éxito en la especialización de programas- consiste en evaluar parcialmente un intérprete de programas escritos en un lenguaje fuente determinado para un programa concreto dado. El intérprete está escrito en un lenguaje de destino determinado, de manera que el resultado de la especialización es la compilación efectiva del programa fuente al lenguaje de destino.

Partiendo de este enfoque, y con la intención de desarrollar técnicas para la generación de código fiable, hemos utilizado al esquema de compilación de programas en código de bytes de Java a programas lógicos con restricciones para desarrollar un esquema genérico de generación automática de casos de prueba para programas en código de bytes. El esquema está basado en técnicas existentes de evaluación parcial en el paradigma de la programación lógica con restricciones. En particular, se abordan, y se proponen las correspondientes soluciones, para problemas como la generación de estructuras de datos alojadas dinámicamente, las excepciones, la compartición de memoria, la herencia y el polimorfismo. Este modelo asegura la escalabilidad del enfoque y además permite tratar con código nativo. El esquema propuesto junto con sus extensiones y mejoras ha sido totalmente implementado dando lugar al sistema PET, un generador automático de casos de prueba para programas de código de bytes de Java.

Análisis de programas.

Como complemento a las líneas anteriores hemos procurado desarrollar nuevos análisis, o mejorar los ya existentes, a fin de poder inferir propiedades de los programas que sean de especial interés para su optimización, paralelización y especialización.

Hemos propuesto un enfoque novedoso para inferir información sobre datos almacenados en la memoria global ("heap") de lenguajes orientados a objetos, transfiriéndolos, cuando sea posible, a variables locales, tras lo cual pueden aplicarse análisis que ignoren el "heap". En el campo de los lenguajes lógicos, hemos desarrollado un análisis capaz de inferir precisa y eficientemente qué procedimientos en un programa son deterministas, y qué grupos de cláusulas de un procedimiento son mutuamente excluyentes. Dicha información es útil en sí misma para procedimientos de verificación, pero es también esencial para contruir otros análisis más complejos sobre ella.

También se han realizado avances en el campo del "shape analysis" que permiten predecir cómo se distribuirán los datos en la memoria durante la ejecución. Dicha información es útil para realizar paralelización automática de programas.

contact the webmaster