LENGUAJES DE PROGRAMACIÓN.
JPAL
Esta herramienta enfatiza en los puntos de enlace, ya que son especificados independientemente del lenguaje base. Debido al término en inglés Junction Point, JPAL significa Junction Point Aspect Language, en español, Lenguaje de Aspectos basados en Puntos de Enlace.
El tejedor JPAL genera un esquema llamado Esquema del Tejedor. El cual desarrolló un mecanismo que automáticamente conecta el código base con los programas de aspectos en puntos de control(acciones).
El Esquema del Tejedor genera código que invoca, cuando es alcanzado en ejecución, las acciones correspondientes para permitir la ejecución de los programas de aspectos. Con lo cual se genera una vinculación dinámica con los programas de aspectos, y hace posible modificar en tiempos de ejecución los programas de aspectos. Sin embargo, esta solución no es lo suficientemente poderosa como para agregar o reemplazar programas de aspectos en ejecución. Para tal efecto se agrega al Esquema del Tejedor una entidad llamada Administrador de Programas de Aspectos (APA), el cual puede registrar un nuevo aspecto de una aplicación y llamar a métodos de aspectos registrados. Es implementado como una librería dinámica que almacena los aspectos y permite dinámicamente agregar, quitar o modificar aspectos, y mandar mensajes a dichos aspectos.
El Esquema Tejedor y APA se comunican mediante protocolo de comunicación entre procesos. La arquitectura de este lenguaje es la siguiente:
D
D es un ambiente de lenguajes de aspectos para la programación distribuida. Se denomina ambiente de lenguajes debido a que integra dos lenguajes, COOL, para controlar la sincronización de hilos, y RIDL, para programar la interacción entre componentes remotos. Estos dos lenguajes se diseñaron de manera independiente de un lenguaje componente. Sin embargo establecen un número de condiciones sobre este.
El diseño de D es semi-independiente del lenguaje componente, debido a que impone requerimientos sobre el lenguaje que también satisfacen los lenguajes orientados a objetos. Gracias a esto, el lenguaje componente puede ser cualquiera mientras sea orientado a objetos. Por lo tanto, podría ser implementado con C++, Smalltalk, CLOS, Java o Eiffel.
COOL
Los programas en COOL son comprendidos por un conjunto de módulos coordinadores. Estos módulos se asocian a las clases por medio del nombre, sin embargo, un mismo coordinador podría coordinar más de una clase. Mínimamente se puede sincronizar un método, y para declarar un corrdinador, se debe describir la estrategia de coordinación.
Los coordinadores no son clases, utilizan un lenguaje diferente, por lo tanto tampoco pueden ser instanciados. Su asociación a las instancias de las clases se realiza automáticamente, utilizando un protocolo bien definido para su relación.
Los coordinadores tienen conocimiento de las clases que coordinan para definir la mejor estrategia de coordinación posible. Sin embargo, las clases no tienen conocimiento de los aspectos, es decir que dentro de una clase no es posible nombrar a un coordinador.
La asociación entre los objetos y los coordinadores es uno-a-uno por defecto y recibe el nombre de coordinación “per object”. Sin embargo, un coordinador también puede asociarse con todos los objetos de una o más clases y recibe el nombre de coordinación “per class”. .
Protocolo de coordinación entre un módulo coordinador y un objeto.
El siguiente sería un aspecto implementado en COOL para la verificación en una cola circular.
RIDL
RIDL (Remote Interaction and Data transfers aspect Language) es un lenguaje de aspectos de dominio específico que maneja la transferencia de datos entre diferentes espacios de ejecución.
Un programa RIDL consiste de un conjunto de módulos de portales. Los módulos de portales o directamente portales se asocian con las clases por el nombre. Un portal es el encargado de manejar la interacción remota y la transferencia de datos de la clase asociada a él, y puede asociarse como máximo a una clase. La unidad mínima de interacción remota es el método.
La declaración de los portales identifica clases cuyas instancias pueden invocarse desde espacios remotos. Dichas instancias se llaman objetos remotos. La declaración de un portal identifica qué métodos de una clase serán exportados sobre la red. En el portal estos métodos se llaman operaciones remotas. Para cada una de estas operaciones se describe qué objetos remotos esperan y qué datos enviarán a los llamadores.
Los portales no son clases, al igual que los coordinadores en COOL, no pueden ser instanciados y sirven para un propósito muy específico. Tampoco son tipos en el sentido estricto de la palabra. Un portal se asocia automáticamente con una instancia de la clase en el momento que una referencia a esa instancia se exporta fuera del espacio donde la instancia fue creada. Durante el tiempo de vida de la instancia esta relación se mantiene mediante un protocolo bien definido.
Este último punto establece una dependencia explícita entre los portales y la relaciones estructurales completas de las clases. Esta dependencia expone la necesidad de controlar la transferencia de datos entre los distintos espacios de ejecución.
AspectC
AspectC es un lenguaje de aspectos de propósito general que extiende C, es un subconjunto de AspectJ sin ningún soporte para la programación orientada a objetos o módulos explícitos. El código de aspectos, conocido como aviso, interactúa con la funcionalidad básica en los límites de una llamada a una función, y puede ejecutarse antes, después, o durante dicha llamada. Los elementos centrales del lenguaje tienen como objetivo señalar llamadas de funciones particulares, acceder a los parámetros de dichas llamadas, y adherir avisos a ellas.
Los puntos de corte en AspectC toman las siguientes formas:
- Llamadas a una función: call(f(arg)), captura todas las llamadas a la función f con un argumento.
- Durante el flujo de control: cflow(cualquier corte), captura el contexto de ejecución dinámico del corte.
- Referencias a una variable: varref(nombre_variable), captura las referencias a la variable nombre_variable.
Como el lenguaje C es de naturaleza estática, el tejedor de AspectC es estático.
AspectC++
AspectC++ es un lenguaje de aspectos de propósito general que extiende el lenguaje C++ para soportar el manejo de aspectos. En este lenguaje los puntos de enlace son puntos en el código componente donde los aspectos pueden interferir. Los puntos de enlaces son capaces de referir a código, tipos, objetos, y flujos de control.
Las expresiones de corte son utilizadas para identificar un conjunto de puntos de enlaces. Se componen a partir de los designadores de corte y un conjunto de operadores algebraicos. La declaración de los avisos es utilizada para especificar código que debe ejecutarse en los puntos de enlace determinados por la expresión de corte.
La información del contexto del punto de enlace puede exponerse mediante cortes con argumentos y expresiones que contienen identificadores en vez de nombres de tipos, todas las veces que se necesite. Diferentes tipos de aviso pueden ser declarados, permitiendo que el aspecto introduzca comportamiento en diferentes momentos: el aviso después (after advice), el aviso antes (before advice) y el aviso durante (around advice). Los aspectos en AspectC++ implementan en forma modular los conceptos entrecruzados y son extensiones del concepto de clase en C++. Además de atributos y métodos, los aspectos pueden contener declaraciones de avisos. Los aspectos pueden derivarse de clases y aspectos, pero no es posible derivar una clase de un aspecto.
AspectJ
Extensión Java del proyecto Eclipse para soportar el manejo de aspectos agregando a la semántica de Java las cuatro entidades ya descritas:
- Puntos de enlace.
- Puntos de corte.
- Advices(Consejos).
- Instrucciones y declaraciones.
Algunas ventajas de este lenguaje son:
- Permite modelar referencias transversales.
- Ofrece ventajas de modularidad.
- Soporta tejido dinámico y estático.
- El programador necesita de una herramienta para poder comprender la funcionalidad completa del sistema.
- Los diseñadores deben reconocer los aspectos de un sistema, por lo que el modelado, planificación y control son mucho más importantes en la fase de desarrollo.
El siguiente es un ejemplo implementado en AspectJ para registro de transacciones bancarias.
AspectS
AspectS, un lenguaje de aspectos de propósito general, utiliza el modelo de lenguaje de AspectJ y ayuda a descubrir la relación que hay entre los aspectos y los ambientes dinámicos. Soporta programación en un metanivel, manejando el fenómeno de Código Mezclado a través de módulos de aspectos relacionados. Está implementado en Squeak sin cambiar la sintaxis, ni la máquina virtual.
En este lenguaje los aspectos se implementan a través de clases y sus instancias actúan como un objeto, respetando el principio de uniformidad. Un aspecto puede contener un conjunto de receptores, enviadores o clases enviadoras. Estos objetos se agregan o se remueven por el cliente y serán usados por el proceso de tejer en ejecución para determinar si el comportamiento debe activarse o no.
Los tipos de avisos definibles en AspectS son:
- Antes y después de la invocación a un (AsBeforeAfterAdvice).
- Para manejo de excepciones(AsHandlerAdvice).
- Durante la invocación de un método(AsAroundAdvice).
Un calificador de avisos (AsAdviceQualifier) es usado para controlar la selección del aviso apropiado. Es similar al concepto de designadores de cortes de AspectJ.
Utiliza un tejedor dinámico que transforma el sistema base de acuerdo a lo especificado en los aspectos. El código tejido se basa en el MethodWrapper y la meta-programación. MethodWrapper es un mecanismo que permite introducir código que es ejecutado antes, después o durante la ejecución de un método.
El proceso de tejer sucede cada vez que una instancia de aspectos es instalada. Para revertir los efectos de un aspecto al sistema, el aspecto debe ser desinstalado. A este proceso se lo conoce como “destejer”, del inglés unweaving. El tejido de AspectS es completamente dinámico ya que ocurre en ejecución.