Rights:
Atribución-NoComercial-SinDerivadas 3.0 España
Abstract:
Over the last few years, software complexity has grown exponentially followed
by a rise in the number of reported defects. In general, the cost of detecting and
mitigating a defect in a software system increases non-linearly as it progresses
through the lifOver the last few years, software complexity has grown exponentially followed
by a rise in the number of reported defects. In general, the cost of detecting and
mitigating a defect in a software system increases non-linearly as it progresses
through the lifecycle of a project and may cause a substantial loss. Consequently,
it is desirable to detect software defects as soon as possible with the aim of
minimizing the associated costs.
In this regard, design-by-contract aids in specifying assumptions made by a
software component, both from the provider and consumer perspectives. Such
specification enables the verification of the correct use of an interface. However,
this methodology is under-used and may have other applications in software
verification and optimization. While this may be true, software reliability can
also be attained by properly hiding the complexity related to the use of low-level
interfaces. Indeed, the development of distributed scientific applications that
execute among multiple multi-core nodes poses several challenges compared to
sequential programming. While the use of parallel pattern libraries is becoming
popular, many distributed applications still rely directly on the MPI model.
Additionally, while many organizations use C/C++ for the implementation of
high-performance applications, it is not uncommon to see prototypes written in
an interpreted language during the early stages. In some cases, bridging the
gap between the prototype and the production software is attained by the use
of a C/C++ interpreter. However, state-of-the-art interpreters still have some
limitations.
To tackle these issues, this thesis aims at reducing the number of software
defects, either by detecting them or by avoiding the introduction of new problems.
This way, resulting programs have fewer defects, thus reducing the development
efforts incurred by the debugging of large applications. In short, in
this thesis, we contribute with the following. First, we introduce a prototype
for contract based programming for the C++ programming language which is
aligned with the latest proposals from the C++ standards committee. Second,
we provide a framework that leverages C++ contracts to aid in the verification
of concurrent shared-memory data structures. Third, we extend a generic parallel
pattern interface to enable porting a shared-memory parallel application to
distributed-memory with minimum efforts. Finally, we provide a methodology
to relax the one definition rule in C++ interpreters, thus allowing users to give a new definition for a declaration. Evaluations show that these contributions
help to reduce both, the presence of software defects and the required development
efforts.[+][-]
Durante los últimos años, la complejidad del software ha crecido exponencialmente
seguido de un ascenso en el número de defectos informados. En general,
el coste de detectar y mitigar un defecto en un sistema software aumenta de
forma no-lineal al progresarDurante los últimos años, la complejidad del software ha crecido exponencialmente
seguido de un ascenso en el número de defectos informados. En general,
el coste de detectar y mitigar un defecto en un sistema software aumenta de
forma no-lineal al progresar a través del ciclo de vida de un proyecto, y puede
causar una pérdida substancial. En consecuencia, es deseable detectar los defectos
de software tan pronto como sea posible con el objetivo de minimizar el
coste asociado.
En este sentido, el diseño por contrato ayuda a especificar las asunciones
hechas por un componente software desde ambas perspectivas, la del suministrador
y la del consumidor. Tales especificaciones permiten la verificación del
uso correcto de una interfaz. Sin embargo, esta metodología está infrautilizada
y puede tener otras aplicaciones en verificación y optimización de software. Por
otro lado, la fiabilidad del software también puede conseguirse ocultando adecuadamente
la complejidad derivada del uso de interfaces de bajo nivel. A este
respecto, el desarrollo de aplicaciones científicas distribuidas que ejecuten en
múltiples máquinas multi-núcleo plantea varios desafíos comparado con la programación
secuencial. Aunque el uso de bibliotecas de patrones paralelos se está
volviendo popular, algunas aplicaciones distribuidas aún confían directamente
en el modelo MPI. Además, mientras que muchas organizaciones usan C/C++
para la implementación de aplicaciones de alto rendimiento, no es raro ver prototipos
escritos en un lenguaje interpretado durante las primeras etapas de desarrollo.
En algunos casos, el cierre de la brecha entre el prototipo y el software
de producción se consigue con el uso de un intérprete de C/C++. Sin embargo,
los últimos intérpretes aún tienen algunas limitaciones.
Para abordar estas cuestiones, esta tesis busca reducir el número de defectos
software, ya sea detectándolos o evitando la introducción de nuevos problemas.
De esta manera, los programas resultantes tienen menos defectos, reduciendo
así los esfuerzos de desarrollo y el tiempo de depuración de grandes aplicaciones.
En resumen, esta tesis contribuye con lo siguiente. En primer lugar, se presenta
un prototipo de soporte a la programación basada en contratos para el lenguaje
C++, de acuerdo con las últimas propuestas del comité de normalización de dicho
lenguaje. En segundo lugar, se propone un marco de trabajo que aprovecha
dicha característica para ayudar en la verificación de estructuras de datos concurrentes
en memoria compartida. En tercer lugar, se extiende una interfaz genérica de patrones paralelos que permite portar una aplicación paralela de
memoria compartida al modelo de memoria distribuida con un esfuerzo mínimo.
Finalmente, se define una metodología para relajar la regla de definición
única (ODR) en intérpretes de C++, permitiendo así que los usuarios puedan
suministrar una nueva definición para una declaración. La evaluación demuestra
que estas contribuciones ayudan a reducir tanto la presencia de defectos en
el software como el esfuerzo de desarrollo requerido.[+][-]