Infraestructura big code para mejorar la calidad en el desarrollo de software

  1. Rodríguez Prieto, Óscar
Dirigida por:
  1. Francisco Ortín Soler Director

Universidad de defensa: Universidad de Oviedo

Fecha de defensa: 12 de junio de 2020

Tribunal:
  1. Juan Manuel Cueva Lovelle Presidente
  2. Daniel Fernández Lanvín Secretario
  3. José Baltasar García Pérez-Schofield Vocal
  4. David Llewellyn Vocal
  5. José María Álvarez Rodríguez Vocal
Departamento:
  1. Informática

Tipo: Tesis

Teseo: 626853 DIALNET lock_openRUO editor

Resumen

En la última década, el uso de repositorios de código como GitHub, SourceForge o BitBucket se ha visto incrementado significativamente. Según los datos de GitHub, en noviembre de 2018 se había registrado 100 millones de repositorios; posteriormente, en 2019 se crearon 44 millones de nuevos repositorios. La información de estos repositorios de código masivos puede ser utilizada como datos para la construcción de herramientas, servicios y modelos orientados a mejorar el desarrollo software. La nueva área de investigación sobre este tema ha sido bautizada como “big code”, debido a su paralelismo con el big data y al uso de código fuente (source code) como datos. Aunque la gran mayoría de los programas se codifican como información textual, éstos contienen información sintáctica y semántica típicamente representada por medio de árboles y grafos. Las herramientas para mejorar el desarrollo software extraen dicha información y la utilizan para distintas tareas como el análisis estático de programas, la desofuscación de código, el cálculo de métricas software, la transformación de programas, la búsqueda avanzada de código y la comprobación de guías de estilo. No obstante, la mayoría de estas herramientas se diseñan ad-hoc para resolver la tarea específica para la que fueron construidas. Por otra parte, suele existir un compromiso entre la escalabilidad de los sistemas y el nivel de detalle de la información que proporcionan sobre el código fuente: los que soportan programas de millones de líneas de código tan solo proveen un subconjunto reducido de la información. En esta tesis doctoral se presenta ProgQuery, una infraestructura que permite a los usuarios la creación de sus propias herramientas orientadas a procesar la información sintáctica y semántica del código fuente. Se diseñaron 7 representaciones basadas en grafos que modelan distinta información sintáctica y semántica relativa a programas Java. Estas representaciones están superpuestas unas con otras, es decir, los nodos sintácticos y semánticos de los distintos grafos se interconectan entre sí, facilitando la combinación de distintos tipos de información. Se modificó el compilador de Java para procesar dichas representaciones y almacenarlas en una base de datos orientada a grafos Neo4j. Al emplear la misma estructura de datos en el sistema de persistencia, se evitan los desajustes de impedancia derivados de utilizar bases de datos relacionales. Algunas ventajas de esta aproximación son el acceso directo a las entidades de los grafos, mayor rendimiento que el modelo relacional y la posibilidad de utilizar diversos mecanismos para recuperar la información de la base de datos. En esta tesis utilizamos la infraestructura propuesta en dos escenarios. Primero, haciendo uso de Cypher, un lenguaje declarativo de consulta para grafos, se implementaron en ProgQuery 13 análisis estáticos publicados por el equipo CERT del Instituto de Ingeniería del Software de la Universidad de Carnegie Mellon. Estos análisis se expresan en forma de consultas que detectan errores comunes de programación en Java, no detectados por los compiladores. El segundo escenario consiste en la extracción de información de programas para clasificar código fuente, aplicando aprendizaje automático supervisado. La herramienta desarrollada es capaz de determinar si un programador es experto o novato con una precisión media del 99,6%. Finalmente, se llevó a cabo la evaluación de ProgQuery, comparando su rendimiento con el de los sistemas relacionados existentes. Nuestro sistema es más eficiente que los demás en cuanto al tiempo de análisis y, además, es más escalable al tamaño de los programas y a la complejidad de los análisis. ProgQuery es capaz de analizar los programas Java de mayor tamaño existentes en los repositorios (decenas de millones de líneas de código) en decenas de segundos, mientras el resto de sistemas evaluados muestran errores por falta de memoria. Adicionalmente, la cantidad de código empleada para codificar las consultas indica que ProgQuery es más expresivo que las otras aproximaciones. Sin embargo, la información adicional almacenada por nuestro sistema hace que el tiempo de inserción de los programas y el tamaño de la base de datos aumente, pero estos incrementos son significativamente menores que las mejoras de rendimiento obtenidas.