Un Lenguaje para la Especificación y Validación de Arquitecturas de Software

Tesis doctoral

C. Canal

Depto. de Lenguajes y Ciencias de la Computación, Universidad de Málaga, Diciembre 2000

Prólogo

A medida que aumenta la complejidad de los sistemas de software surgen nuevos aspectos del desarrollo de aplicaciones que hasta ese momento no se habían tenido en cuenta, al menos de una forma explícita. De este modo, el proceso de desarrollo se ha ido convirtiendo gradualmente en una labor de ingeniería, en la que nuevas tareas, como la elaboración de especificaciones, el diseño del sistema, la construcción de prototipos, la integración y pruebas, la gestión de la configuración y otras muchas han ido cobrando importancia frente a las labores de programación que eran las que primaban en un inicio. La Ingeniería del Software ha ido respondiendo a esta situación con el desarrollo de nuevos modelos, notaciones, técnicas y métodos.

Dentro de esta tendencia se encuadra el creciente interés por los aspectos arquitectónicos del software del que estamos siendo testigos en los últimos tiempos. Estos aspectos se refieren a todo lo relativo a la estructura de alto nivel de los sistemas: su organización en subsistemas y la relación entre éstos; la construcción de aplicaciones vista como una actividad fundamentalmente composicional en la que se reutilizan elementos creados posiblemente por terceros; el desarrollo de familias de productos caracterizadas por presentar una arquitectura común; el mantenimiento y la evolución entendidos como sustitución de unos componentes por otros dentro de un marco arquitectónico, etc. En efecto, un aspecto crítico a la hora de desarrollar sistemas de software complejos es el diseño de su arquitectura, representada como un conjunto de elementos computacionales y de datos interrelacionados de un modo determinado.

Este interés no debe tomarse como algo aislado, sino que está integrado en una tendencia más general que ha llevado al establecimiento de lo que ya se denomina como Ingeniería del Software basada en Componentes. Fenómenos como el uso generalizado de la Web como medio para la comunicación y el intercambio global demandan el desarrollo de nuevas tecnologías para la construcción de aplicaciones abiertas y distribuidas. Estas aplicaciones tienen una estructura compleja y dinámica, formada por la interconexión de una gran cantidad de componentes. Las características específicas de estos sistemas están teniendo un enorme impacto en la forma en que el software es producido y comercializado. Desde este punto de vista, el objetivo de la Ingeniería del Software basada en Componentes es la creación de una colección de componentes de software reutilizables, de forma que el desarrollo de nuevas aplicaciones consista básicamente en la selección, adaptación y composición de componentes, en lugar de implementar la aplicación desde el principio.

Si bien es importante la reutilización de componentes, no lo es menos el poder reutilizar la propia estructura o arquitectura de la aplicación. Desde este punto de vista, se ha caracterizado recientemente la Arquitectura del Software como un campo específico de estudio para los investigadores e ingenieros del software. Su ámbito se centra en el nivel del proceso de diseño en el que se deciden las propiedades estructurales del sistema, es decir, aquéllas derivadas de la forma en la que se combinan sus diferentes partes y que no pueden ser tratadas de forma adecuada dentro de los módulos o componentes que forman el sistema.

No obstante, el campo de estudio de la Arquitectura del Software no es algo nuevo. Los sistemas de software han tenido arquitectura desde que el primer programa fue dividido en módulos, y los programadores han sido responsables de establecer las interacciones entre dichos módulos y lograr así determinadas propiedades globales para sus sistemas. Históricamente, la arquitectura de los sistemas ha sido desarrollada y utilizada de forma implícita, en muchos casos como mero accidente durante el proceso de implementación, o como herencia de sistemas anteriores. Los profesionales del desarrollo de software han adoptado a menudo uno o varios patrones arquitectónicos como estrategia para la organización de sus aplicaciones, pero han utilizado estos patrones de manera informal, sin reflejarlos de manera explícita en el sistema resultante.

De este modo, la descripción de los aspectos arquitectónicos del software ha estado tradicionalmente limitada al uso de ciertas expresiones, tales como arquitectura cliente/servidor, arquitectura en capas, etc., por lo general acompañadas con diagramas informales. Estas descripciones carecen de un significado preciso, lo que limita de manera drástica su utilidad, impidiendo, por ejemplo, cualquier análisis de las propiedades de los sistemas así descritos. Lógicamente, este tipo de representaciones no es el adecuado para dar a la Arquitectura del Software el rango que se merece. Existe una clara necesidad de notaciones de alto nivel, específicamente orientadas al problema de describir la arquitectura de los sistemas de software.

La importancia de representar de forma explícita la arquitectura de los sistemas de software es evidente. En primer lugar, estas representaciones elevan el nivel de abstracción, facilitando la comprensión de los sistemas de software complejos. En segundo lugar, hacen que aumenten las posibilidades de reutilizar tanto la arquitectura como los componentes que aparecen en ella. Por último, si la notación utilizada tiene una base formal adecuada, es posible analizar la arquitectura del sistema, determinando cuáles son sus propiedades aún antes de construirlo.

En los últimos años se han ido proponiendo toda una serie de lenguajes para la descripción de la arquitectura del software. Aunque la mayoría de estos lenguajes de primera generación están aún en desarrollo o tienen carácter experimental, son buenos ejemplos de la búsqueda de las estructuras lingüísticas necesarias para describir las propiedades arquitectónicas de los sistemas de software.

Objetivos

El presente proyecto de tesis se enmarca dentro de este contexto. Su principal aportación es la definición de LEDA, un lenguaje de especificación para la descripción y validación de la arquitectura de los sistemas de software. Entre los objetivos planteados a la hora de realizar este trabajo debemos destacar los siguientes:

  • El lenguaje debe abordar la descripción de la arquitectura del software siguiendo para ello un enfoque composicional, de forma que los sistemas se construyan mediante la interconexión de componentes más sencillos.

  • La especificación de los componentes debe limitarse a su interfaz, en la que se describirá toda la información de interés desde un punto de vista arquitectónico, pero ocultando al mismo tiempo detalles de implementación que sean irrelevantes a este nivel.

  • La propuesta ha de tener un fundamento formal, adecuado a las necesidades de la Arquitectura del Software, y que permita el análisis de los sistemas descritos, con objeto de validar sus propiedades.

  • Ha de ser posible la descripción de sistemas dinámicos, es decir, que presenten una configuración o una topología de comunicación cambiantes.

  • El lenguaje dispondrá de mecanismos que faciliten la evolución del sistema, tanto durante la especificación del mismo ---que será considerada como un proceso de refinamiento---, como una vez implementado, con vistas a adaptarlo a cambios en los requisitos.

  • Del mismo modo, han de incorporarse mecanismos que faciliten la reutilización, tanto de los componentes como de la arquitectura.

  • La propuesta no debe limitarse únicamente a la especificación y análisis de la arquitectura, sino que tiene que facilitar la implementación del producto final, ofreciendo una guía para el proceso de desarrollo.

  • Las especificaciones deben poder utilizarse tanto para la simulación de los sistemas descritos como para la generación de prototipos a partir de las mismas, con objeto de automatizar en la medida de lo posible el desarrollo del sistema.

Estructura de la memoria

Esta memoria está organizada en cinco capítulos. En el primero de ellos se ofrece una visión general de la Arquitectura del Software y del estado del arte en este campo, poniendo especial énfasis, como es lógico, en los lenguajes de descripción de arquitectura, para lo que se comentan las propuestas más significativas realizadas hasta la fecha. Además, se aborda el estudio de las relaciones entre la Arquitectura del Software y otros campos y propuestas relacionados, como son la Ingeniería del Software basada en Componentes, los patrones de diseño o el Lenguaje Unificado de Modelado. Así mismo, este capítulo contiene una revisión de los formalismos utilizados en las diferentes propuestas sobre Arquitectura del Software, incluyendo entre ellos al cálculo p, que es la base formal utilizada en el presente trabajo.

El Capítulo 2 se dedica a los fundamentos formales de este trabajo. En él se desarrolla un estudio más a fondo del cálculo p y de sus cualidades para la descripción de la arquitectura del software. Se definen además los conceptos de rol y de arquitectura en el contexto del cálculo p y se presentan relaciones de compatibilidad, herencia y extensión entre roles, demostrándose diversos resultados a partir de las mismas, como son la composición y la sustitución con éxito de componentes en el contexto de una arquitectura.

A continuación, en el Capítulo 3 se presenta LEDA, el lenguaje de descripción de arquitectura objeto de este trabajo. Las características más significativas del lenguaje se describen con ayuda de numerosos ejemplos. En este capítulo se esboza también la semántica del lenguaje en términos del cálculo p. Por último, un estudio de caso muestra cómo utilizar el lenguaje para la especificación de un sistema distribuido de subastas, ejemplo típico de aplicación desarrollada sobre Internet.

El Capítulo 4 trata de los aspectos metodológicos del desarrollo de sistemas a partir de su especificación en LEDA. En él se describe cómo obtener un prototipo en un lenguaje orientado a objetos a partir de la especificación, y cómo este prototipo sirve de base para el desarrollo iterativo e incremental del sistema. En particular, el generador produce código Java, aunque nuestra propuesta puede aplicarse a cualquier otro lenguaje orientado a objetos. El núcleo del generador de código está formado por un conjunto de clases que modelan procesos, enlaces y acciones, por lo que puede considerarse como un intérprete del cálculo p en Java.

Por último, el Capítulo 5 contiene las conclusiones de este trabajo, así como una serie de líneas futuras de continuación del mismo. Esta memoria se completa con tres apéndices, que contienen la sintaxis BNF y la notación gráfica del lenguaje, así como el código completo generado para el estudio de caso del Capítulo 3.

(Tesis)