Asignatura: Entornos de programación

Entornos de programación

Concepto, funciones y tipos


Contenido

  1. Actividades de desarrollo de software
  2. Entornos de desarrollo de Software
  3. Productos CASE en general
  4. Entorno de programación
  5. Funciones de un Entorno de Programación
  6. Tipos de Entornos de Programación
    1. Entornos centrados en un lenguaje
    2. Entornos orientados a estructura
    3. Entornos basados en combinación de herramientas
    4. Entornos multilenguaje
    5. Entornos para ingeniería de software
  7. Entornos orientados a estructura
    1. Editores de estructura
    2. Lenguajes y entornos visuales
    3. Discusión
  8. Evolución de los entornos de programación
    1. Lectura y navegación del código
    2. Generación de documentación
    3. Análisis estático
    4. Técnicas avanzadas de construcción de código
    5. Discusión
  9. Referencias

Actividades de desarrollo de software

En Ingeniería de Software se denomina "ciclo de vida" a una determinada organización en el tiempo de las actividades de desarrollo de software. Las principales actividades son las siguientes:

Ciclo de desarrollo

La figura representa el denominado "ciclo de vida en cascada", donde las flechas indican el orden en que se van realizando las actividades. Este modelo está en desuso, pero sigue siendo adecuado para identificar las actividades principales y el orden natural entre ellas.

Análisis de requisitos
Se estudian las necesidades de los usuarios, se decide qué debe hacer la aplicación informática para satisfacerlas en todo o en parte, y se genera un Documento de Requisitos.
Diseño de la arquitectura
Se estudia el Documento de Requisitos y se establece la estructura global de la aplicación, descomponiéndola en partes (módulos, subsistemas) relativamente independientes. Se genera un Documento de Diseño.
Diseño detallado
En esta segunda parte de la actividad de diseño se fijan las funciones de cada módulo, con el detalle de su interfaz. Se genera el código de declaración (o especificación) de cada módulo.
Codificación
Se desarrolla el código de cada módulo.
Pruebas de unidades
Como complemento de la codificación, cada módulo o grupo de módulos se prueba por separado. En las pruebas se comprueba si cada módulo cumple con su especificación de diseño detallado.
Pruebas de integración
Se hace funcionar la aplicación completa, combinando todos sus módulos. Se realizan ensayos para comprobar que el funcionamiento de conjunto cumple lo establecido en el documento de diseño.
Pruebas de validación
Como paso final de la integración se realizan nuevas pruebas de la aplicación en su conjunto. En este caso el objetivo es comprobar que el producto desarrollado cumple con lo establecido en el documento de requisitos, y satisface por tanto las necesidades de los usuarios en la medida prevista.
Fase de mantenimiento
No hay actividades diferenciadas de las anteriores. El mantenimiento del producto exige rehacer parte del trabajo inicial, que puede corresponder a cualquiera de las actividades de las etapas anteriores.

Entornos de desarrollo de Software

Un entorno de desarrollo de software es una combinación de herramientas que automatiza o soporta al menos una gran parte de la tareas (o fases) del desarrollo: análisis de requisitos, diseño de arquitectura, diseño detallado, codificación, pruebas de unidades, pruebas de integración y validación, gestión de configuración, mantenimiento, etc. Las herramientas deben estar bien integradas, pudendo interoperar unas con otras.

Están formados por el conjunto de instrumentos (hardware, software, procedimientos, ...) que facilitan o automatizan las actividades de desarrollo. En el contexto de esta asignatura se consideran básicamente los instrumentos software.

En [2] se expone una visión práctica de los que es un entorno de desarrollo.

Productos CASE en general

Los productos CASE facilitan el desarrollo organizado del software aplicando técnicas de Ingeniería de Software. En sentido amplio podemos englobar en la tecnología CASE toda la variedad de herramientas aplicables en el desarrollo de software: herramientas de análisis y diseño; editores de código, documentos, diagramas, etc.; compiladores y montadores de código ejecutable (linkers); depuradores; analizadores de consistencia; herramientas para obtención de métricas; generadores de código o de documentación; etc., etc.

Debido a esa enorme variedad de productos, se han realizado diversos intentos para clasificarlos. Un punto de vista para su clasificación es el nivel de las funciones que realiza un producto determinado. En [3] (Table I) se sugiere la siguiente terminología para los niveles funcionales:

Entorno de programación

Las actividades mejor soportadas por herramientas de desarrollo son normalmente la centrales: codificación y pruebas de unidades. El conjunto de herramientas que soportan estas actividades constituyen lo que se llama un entorno de programación. A veces se utilizan las siglas IDE (Integrated Development Environment) para designar estos entornos, aunque no son un entorno de desarrollo completo, sino sólo una parte de él.

Funciones de un Entorno de Programación

Como se ha dicho, la misión de un Entorno de Programación es dar soporte a la preparación de programas, es decir, a las actividades de codificación y pruebas.

Tipos de Entornos de Programación

Un entorno de programación puede estar concebido y organizado de maneras muy diferentes. A continuación se mencionan algunas de ellas.

Entornos centrados en un lenguaje

Presentan las siguientes características generales:

Podemos encontrar ejemplos de estos entornos para todo tipo de lenguajes

Entornos orientados a estructura

Podrían considerarse incluidos en la clase anterior, ya que suelen ser específicos para un lenguaje de programación, pero están concebidos de manera diferente:

Estos entornos estuvieron de moda en los años 80. Los desarrollos fueron fundamentalmente académicos, y quedaron en desuso. En la actualidad los lenguajes de marcado (XML) pueden ser una buena forma de representar la estructura del código fuente con vistas a su manipulación. Existen editores y procesadores XML que podrían ser la base de nuevos entornos de programación orientados a estructura.

Entornos basados en combinación de herramientas

Consisten en una combinación de diversas herramientas capaces de interoperar entre ellas de alguna manera. Se denominan entornos toolkit. Presentan las siguientes características:

Entornos multilenguaje

Hay aplicaciones que combinan piezas de código fuente escritas en diferentes lenguajes de programación. Algunas posibilidades de combinación son las siguientes:

Entornos para ingeniería de software

Un entorno de programación, tal como se ha definido anteriormente, serviría para dar soporte a las tareas de desarrollo de software realizadas por una persona. Para desarrollar proyectos de software no triviales se necesita trabajar en equipo usando las recomendaciones de la ingeniería de software.

Cada miembro del equipo de desarrollo puede disponer de una estación de trabajo con un entorno de programación adecuado para realizar su trabajo individual, y se necesita además algún medio de combinar los trabajos individuales en una labor de conjunto, debidamente organizada.

Una manera intuitiva de organizar el entorno general de desarrollo es basarlo en un repositorio central de información, dotado de un sistema de gestión de configuración, y añadirle sistemas de mensajería, de gestión de incidencias, herramientas de modelado para análisis y diseño, de gestión del proyecto, etc.

???

Por ejemplo, hay plataformas generales que ofrecen este soporte como servicios web, incluso de manera gratuita para el desarrollo de software libre: SourceForge, Google Code, etc.

Entornos orientados a estructura

La idea de que un programa no es equivalente al texto de su código fuente, sino que lo esencial es la estructura lógica del cómputo que describe, ha llevado a la creación de los llamados entornos de programación orientados a estructura[1], en los que se manipula directamente la estructura lógica del código y no su representación como texto. Incluso hay casos en que el código del programa no se representa como texto sino en forma gráfica.

Editores de estructura

Los editores de estructura de código, llamados también editores sintácticos o más frecuentemente editores dirigidos por sintaxis (sintax-directed editors), permiten editar el código fuente manipulando directamente una representación interna de su estructura. A diferencia de la edición del código como texto, la edición de la estructura se hace sobre elementos sintácticos tales como expresiones, sentencias o funciones y no sobre elementos textuales tales como caracteres, palabras o líneas.

La representación habitual de la estructura del código es la de su árbol de sintaxis abstracta (AST). Ejemplo:

AST

Los entornos de programación basados en un editor de estructura se denominan entornos orientados a estructura. Suelen tener las siguientes características:

La mayoría de estos entornos se desarrollaron a finales del años 70 y a lo largo de los 80. Se emplearon habitualmente en ambientes académicos. Algunos ejemplos de entornos orientados a estructura son:

Como complemento se han llegado a desarrollar también generadores de entornos similares a los generadores de compiladores. En particular existe el Synthesizer Generator [10], capaz de generar entornos similares al sintetizador de Cornell para otros lenguajes de programación a partir de una descripción de la sintaxis y semántica del lenguaje mediante una gramática de atributos.

Lenguajes y entornos visuales

Este es un caso especial de entornos orientados a estructura. La representación externa del código fuente no es en forma de texto, sino gráfica. El editor permite ir construyendo el grafo que representa la estructura del código. El programa construido de esta manera se ejecuta directamente mediante un intérprete, o bien se exporta como texto en un lenguaje formal para ser compilado o interpretado externamente. Algunos ejemplos de este tipo de entornos son:

Tanto Prograph como Projector son lenguajes de flujo de datos. Un programa basado en flujo de datos se representa como un grafo en el que los nodos son operadores y los arcos son flujos de datos que conectan la salida de ciertos operadores con las entradas de otros. Una operación se ejecuta cuando hay datos presentes en todas las entradas requeridas. En ese momento se producen resultados que se transmiten por los arcos de salida, pudiendo entonces ejecutarse otras operaciones.

VFPE es un editor gráfico de la estructura (árbol sintáctico) de un programa funcional. El programa editado puede ejecutarse directamente o exportarse como código Haskell.

Discusión

Los entornos orientados a estructura presentan innegables ventajas respecto a los entornos basados en la edición del texto fuente. Entre ellas:

Si embargo estos entornos, tal como se concibieron inicialmente, no han llegado a utilizarse en la práctica habitual de desarrollo de software, ya que presentaban claros inconvenientes:

Muchos de los productos citados como ejemplo han desaparecido. Su interés es fundamentalmente histórico. No obstante, la idea de trabajar directamente sobre la estructura del código sigue resultando atractiva, y parece posible aplicarla de nuevo siendo conscientes de sus dificultades y aprovechando los avances tecnológicos actuales.

Evolución de los entornos de programación

Otra circunstancia que quizá ha colaborado a impedir la difusión de los entornos orientados a estructura es el hecho de que los entornos de programación convencionales basados en la manipulación del código fuente como texto han ido mejorando a lo largo de los años, ofreciendo algunas funciones similares a las que se pretendían conseguir con los entornos orientados a estructura. A continuación se analizan algunas de estas funciones.

Lectura y navegación del código

Los entornos basados en texto fuente han ido incrementando su orientación al lenguaje, ofreciendo facilidades tales como las siguientes:

Las últimas facilidades de la lista pueden tener un coste elevado. En bastantes casos hay que construir unas tablas internas, bastante voluminosas, que describen la estructura del código y permiten indexar la aparición de cada identificador en el texto fuente.

Generación de documentación

Si se incluyen en el código fuente comentarios de descripción de cada elemento importante es posible generar automáticamente documentación de referencia a base de extraer las declaraciones de dichos elementos junto con el texto de descripción. Por ejemplo, se pueden generar las páginas del manual de referencia de una librería, incluyendo índices alfabéticos o temáticos, o incluso incluir todo el código fuente en forma de páginas web enlazadas para consultarlas de manera muy cómoda.

Algunos ejemplos de esta tecnología son:

A continuación se reproduce un ejemplo tomado de la documentación disponible en el sitio web de Sun Microsystems, Inc [12]. El fragmento de código fuente es:

/**
 * Returns an Image object that can then be painted on the screen.
 * The url argument must specify an absolute {@link URL}. The name
 * argument is a specifier that is relative to the url argument.
 * <p>
 * This method always returns immediately, whether or not the
 * image exists. When this applet attempts to draw the image on
 * the screen, the data will be loaded. The graphics primitives
 * that draw the image will incrementally paint on the screen.
 *
 * @param  url  an absolute URL giving the base location of the image
 * @param  name the location of the image, relative to the url argument
 * @return      the image at the specified URL
 * @see         Image
 */
 public Image getImage(URL url, String name) {
    try {
        return getImage(new URL(url, name));
    } catch (MalformedURLException e) {
        return null;
    }
 }

A partir de él se genera el siguiente fragmento de documentación (convertido a XHTML):


getImage

public Image getImage(URL url,
                      String name)
Returns an Image object that can then be painted on the screen. The url argument must specify an absolute URL. The name argument is a specifier that is relative to the url argument.

This method always returns immediately, whether or not the image exists. When this applet attempts to draw the image on the screen, the data will be loaded. The graphics primitives that draw the image will incrementally paint on the screen.

Parameters:
url - an absolute URL giving the base location of the image
name - the location of the image, relative to the url argument
Returns:
the image at the specified URL
See Also:
Image

Análisis estático

En estas técnicas se analiza la estructura sintáctica y/o semántica del programa para realizar comprobaciones, extraer información y generar informes. Algunos ejemplos interesantes son:

Las operaciones de análisis mencionadas tienen partes en común, por lo que muchas veces una misma herramienta puede realizar simultánea o alternativamente varias de ellas.

Técnicas avanzadas de construcción de código

El desarrollo de metodologías de programación ha dado como resultado diversas técnicas y herramientas de ayuda a la construcción de nuevo código. Algunas de ellas se han incorporado a los entornos de programación integrados y otras están soportadas mediante herramientas independientes. A continuación se mencionan algunas de ellas.

Discusión

Las técnicas y facilidades incorporadas en los entornos de programación y desarrollo a lo largo de estos años resultan extraordinariamente útiles para abordar la construcción de grandes sistemas de software, con cientos de miles o millones de líneas de código. Pero su aplicación sobre la base convencional de representar y manipular el código fuente como texto tiene un coste enorme en esfuerzo para la creación de las herramientas y en recursos para su aplicación. Cada herramienta o función necesita analizar el texto de código para reconocer su estructura lógica. Para facilitar los tratamientos es frecuente que en el entorno se tengan a la vez una representación de código como texto y unas tablas o índices con su estructura lógica, que si es detallada ocupa un espacio muy superior al del mismo código. Además a medida que se modifica el código hay que mantener sincronizadas ambas representaciones, lo que exige una gran potencia de cálculo.

Los antiguos entornos orientados a estructura no llegaron a desarrollar las facilidades ahora disponibles, pero tenían un enfoque mucho más simple, con una sola representación del código, más eficiente y sencilla de manipular. Recientemente han surgido desarrollos en los que se recuperan en parte algunas ideas o técnicas de orientación a estructura.

Referencias

  1. S.A. Dart, R.J. Ellison, P.H. Feiler, A.N. Habermann: Software Development Environments. IEEE Computer, Vol.20 No.11 pp.18-28, Nov.1987.
  2. M.B. Doar: Practical Development Environments (el Cap.2: Project basics, está disponible como muestra, así como una vista parcial del libro). O'Reilly Media, 2005.
  3. C. Fernström, K-H Närfelt, L. Ohlsson: Software Factory Principles, Architecture, and Experiments. IEEE Software, Vol.9 No.2 pp.36-44, Mar.1992.
  4. A. Fuggetta: A Classification of CASE Technology. IEEE Computer, Vol.26 No.12 pp.25-38, Dic.1993.
  5. D.E. Perry, G.E. Kaiser: Models of Software Development Environments. IEEE Trans.Softw.Eng., Vol.17 No.3, pp.283-295, Mar.1991.
  6. T. Teitelbaum, T. Repps: The Cornell Program Synthesizer: A Syntax-Directed Programming Environment. Comm. ACM, V.24 N.9 pp.563-673, Sep.1981.
  7. V. Donzeau-Gouge, G. Huet, G. Kahn, B. Lang: Programming environments based on structured editors: the MENTOR experience.
    In Interactive Programming Environments, McGraw-Hill, 1984.
  8. A. Habermann, D. Notkin: Gandalf: Software development environments. IEEE Transactions on Software Engineering SE-12, pp 1117-1127, 1986.
  9. B. Templeton: Alice Pascal website (http://www.templetons.com/brad/alice.html)
  10. T. Reps, T. Teitelbaum: The Synthesizer Generator. ACM Softw.Engin.Notes, May 1984.
  11. L. R. Neal: Cognition-Sensitive Design and User Modeling for Syntax-Directed Editors.
    In Proceedings CHI+GI 1987 (Toronto, April 5-9, 1987) ACM, New York, pp 27-32.
  12. Sun Microsystems: Javadoc website (http://java.sun.com/j2se/javadoc/writingdoccomments/index.html).