Ir al contenido principal

De Modelos, Metamodelos y Metametamodelos

Todo informático, cuando recién está iniciandose en la materia, sólo ve código y programación. La mayoría de ellos, una vez que empiezan a trabajar en proyectos reales, suponen que aquélla es la única y exclusiva forma de desarrollar software; paradigmas como Xtreme Programming (Programación Extrema) intentan exacerbar la idea de que el código lo es todo a la hora de crear software.


Siendo la Programación Extrema una metodología que da buenos resultados en proyectos de pequeña y mediana envergadura, existen otras alternativas que están cobrando fuerza a la hora de desarrollar software, las cuales se centran en la idea de abstraer de los detalles de implementación, enfocándose directamente en la problemática que el software intenta resolver. Una de esas metodologías es Model Driven Architecture (Arquitectura Dirigida por Modelos), donde la idea central es definir la estructura y comportamiento del sistema utilizando lenguajes de modelamiento (UML en este caso), para luego, utilizando herramientas de software especializadas, transformar dichos modelos en una implementación en el lenguaje de programación requerido.

La pregunta que surge alrededor de esto es: ¿De qué sirven los lenguajes de modelamiento si ya tengo un lenguaje de programación para crear software?. La respuesta a ello es exactamente la misma que se puede dar respecto a las ventajas que un lenguaje de programación de alto nivel (como Java o C++) tiene sobre el lenguaje de máquina: Los lenguajes de modelamiento le hacen la vida mas fácil al desarrollador de software, porque reducen la complejidad del sistema al abstraerlo de detalles innecesarios.

Antiguamente, los primeros computadores requerían ser programados a muy bajo nivel, en lo que se conoce como Lenguaje de Máquina. Dicho lenguaje está compuesto básicamente por secuencias de ceros y unos, las cuales al combinarse representan las instrucciones y los datos de los programas ejecutados por el computador. Es muy difícil programar dichos lenguajes, porque para hacer incluso la más mínima operación, como por ejemplo, sacar un promedio de datos en un arreglo, es necesario escribir un montón de instrucciones.

Para reducir la complejidad del lenguaje de máquina, se creó el lenguaje Assembler (Ensamblador), que básicamente lo que hace es representar las secuencias de ceros y unos con códigos de letras, llamadas Expresiones Mnemotécnicas, las cuales son más fáciles de manejar para un programador; con Assembler, ya no es necesario recordar qué secuencia de ceros y unos representa cada instrucción, sino que sólo basta recordar su expresión mnemotécnica equivalente.

Desafortunadamente, assembler aún es muy básico y complejo de manejar, especialmente para programas grandes. En respuesta a la necesidad de simplificar el desarrollo, nacieron los lenguajes de programación de alto nivel, los cuales son los que forman normalmente el grueso de las mallas curriculares de las carreras de informática. Lenguajes como Pascal, C++, Java, C#, Basic caen dentro de esta categoría. La gran ventaja que ofrecen es que abstraen al programador de muchos detalles innecesarios, tales como la gestión de memoria, manejo interno de estructuras de datos (por ejemplo las que representan números decimales, que manejarlas en assembler es bastante doloroso), operaciones de entrada/salida, etc. Unas pocas líneas de código en un lenguaje de alto nivel equivalen a muchísimas líneas en lenguaje assembler.

Los lenguajes de programación de alto nivel son los que están en boga actualmente para desarrollar software, sin embargo, el nivel de complejidad que las plataformas han alcanzado actualmente, unido a la necesidad de adaptar el software a requerimientos en constante cambio, han creado la necesidad de simplificar aún más el desarrollo. Ahora es necesario aumentar aún más en el nivel de abstracción, ocultar aún más detalles de implementación, para así poder reducir la complejidad que el ingeniero de software debe enfrentar a la hora de crear un sistema. Es por ello que nacen los lenguajes de modelamiento: notaciones en su mayoría visuales, que intentan representar un sistema de software a un nivel mucho más alto que los lenguajes de programación, representándolo en forma más intuitiva para personas sin especialización en informática.

De dichos esfuerzos nace UML, el lenguaje de modelamiento unificado, una notación visual que representa elementos como: los requerimientos del sistema (casos de uso, diagrama de actividades), estructura general (diagrama de clases), comportamiento del sistema (diagramas de secuencia, colaboración y de transición de estados), implantación (diagramas de componentes y de despliegue).

UML es una herramienta bastante útil para representar la información del sistema en un nivel muy general, la cual puede ser traducida en forma automática a código en el lenguaje que sea requerido por el sistema. Sin embargo, la expresividad de dicho lenguaje no es suficiente para cubrir todo tipo de situaciones. Nacen así extensiones a UML para modelar otros elementos, tales como persistencia, seguridad, interfaces gráficas, etc.

Ante la proliferación de tantas extensiones, y la carencia de un estándar en que dichas extensiones sean especificadas, nace la necesidad de definir claramente un Metamodelo para UML. Un metamodelo es un modelo de un modelo; en el caso de UML, una definición de la estructura del lenguaje de modelamiento. Aunque desde un principio la especificación de UML contenía un metamodelo, éste era bastante ambiguo a la hora de extender sus capacidades.

Después de varios años de desarrollo apareción un nuevo estándar para UML, la versión 2.0, la cual incluye no sólo un nuevo metamodelo para el lenguaje de modelamiento en sí, sino que además un Metametamodelo (llamado MOF), o sea una especificación de la estructura de un lenguaje que sirve para crear lenguajes de modelamiento (uff... que enredado, no?). La idea detrás de esto es bastante simple: proveer de un lenguaje que permita a cada grupo de desarrolladores definir sus propios lenguajes de modelamiento. Si alguien necesita desarrollar un software que trabaje con páginas web, a través de este metametamodelo puede especificar qué cosas necesita en su lenguaje de modelamiento, por ejemplo: páginas html, formularios, enlaces entre páginas, etc., para luego modelar directamente el software utilizando estos elementos. Si otra persona necesita modelar un sistema orientado a objetos, a través del metametamodelo también puede especificar qué cosas necesita: clases, métodos, atributos, relaciones de herencia, etc., y luego crear un sistema basado en estos elementos.

Esto que suena tan esotérico puede ser "aterrizado" al usar una herramienta que soporte este paradigma. Una de ellas que resulta ser particularmente simple de utilizar es GME (Generic Modeling Environment; Ambiente de Modelamiento Generico) que es una herramienta que permite crear lenguajes de modelamiento. Si la descargan y siguen el tutorial (donde muestra como crear una herramienta para modelar redes de computadores) verán que el concepto de un metametamodelo no es tan complicado.

Comentarios

Anónimo dijo…
Muchas gracias por este interesante texto, que ha sido leído por varios alumnos.

He podido escuchar diferentes opiniones de los alumnos al respecto, y por cierto, se tiende a pensar que los metamodelos pueden limitar la capacidad de los ingenieros a la hora de generar código eficiente y a la medida.

Sin embargo, como tu bien dices en tu texto, también muchos ingenieros en su tiempo pensaban que la proliferación de lenguajes de alto nivel eran perjudicial para el desarrollo de aplicaciones eficientes ya que se le delegaba al compilador la responsabilidad de generar el código de máquina a partir del código fuente en alto nivel. De hecho, cuento como anécdota, que en la U. había un profesor que nos hacía hacer los programas en C y luego de generar el lenguaje assembler nos hacía revisar este para detectar los puntos donde el compilador no había sido eficiente en su generación para posteriormente modificarlo, y finalmente compilar el assembler para generar el código de máquina.

Con el paso del tiempo los lenguajes de alto nivel fueron mejorados y optimizados, y hoy nadie duda en compilar directamente el código fuente al de máquina.

En el caso particular de Java mucha gente opinaba que el compilar a un código intermedio, bytecode, era una mala idea. Hoy en día se puede observar que los lenguajes de programación más utilizados en Chile son Java y .NET, este último utiliza un mecanismo similar de compilación que Java, donde se han demostrado su eficiencia en grandes sistemas de tipo transaccional.

Espero que nos puedas entregar más información sobre este tema u otro. Me gustaría que nos pudieras ilustrar con el ejemplo que referencias un segundo artículo, estamos en contacto. ;)

Saludos.
Estoy trabajando en ello. En los últimos días he estado experimentando con metamodelo para un un modelador de sitios web, generador de código incluido. Cuando tenga algo listo, lo publico.
GRUPO1 dijo…
En serio es un texto muy detallado y mut claro, fue el unico que encontre tan especifico para estudiar gracias

Entradas más populares de este blog

Código Python para pasar de notación postfija a infija

Este código es un borrador en  Python que convierte una expresión en notación postfija a notación infija ordenada por paréntesis:

TIPS: Tres algoritmos para convertir una imagen de color a gris en python

Hace un tiempo necesitaba convertir unas imágenes que estaban en color a escalas de grises utilizando python. Buscando en internet encontré un sitio donde explicaban las fórmulas que se utilizan en el GIMP para realizar la conversión.

La tira cómica de Raulito el Friki

Buscando algunas cosas que necesitaba para comunicar un dispositivo por voip, me encontré en un grupo de interés que hacía referencias al sitio y luego de leer un rato no paré de reírme.