Un tejedor de aspectos es una utilidad de metaprogramación para lenguajes orientados a aspectos diseñada para tomar instrucciones especificadas por aspectos (representaciones aisladas de conceptos significativos en un programa) y generar el código de implementación final . El tejedor integra aspectos en las ubicaciones especificadas por el software como paso previo a la compilación . Al fusionar aspectos y clases (representaciones de la estructura de entidades en el programa), el tejedor genera una clase tejida.
Disponible en | AspectC ++ , AspectJ |
---|---|
Tipo | Programación Orientada a Aspectos |
Los tejedores de aspectos toman instrucciones conocidas como consejos especificados mediante el uso de cortes de punta y puntos de unión , segmentos especiales de código que indican qué métodos deben manejarse por código de aspecto. La implementación del aspecto luego especifica si el código relacionado debe agregarse antes, después o a lo largo de los métodos relacionados. Al hacer esto, los tejedores de aspectos mejoran la modularidad , manteniendo el código en un lugar que de otro modo se habría intercalado en varias clases no relacionadas.
Motivación
Muchos lenguajes de programación ya son ampliamente aceptados y comprendidos. Sin embargo, el deseo de crear lenguajes de programación radicalmente diferentes para soportar el paradigma de programación orientada a aspectos no es significativo debido a preocupaciones relacionadas con el negocio; existen riesgos asociados con la adopción de nuevas tecnologías. [1] El uso de un lenguaje completamente nuevo depende de la capacidad de una empresa para adquirir nuevos desarrolladores. Además, el código base existente de una empresa debería descartarse. Finalmente, una empresa necesitaría adquirir una nueva cadena de herramientas (conjunto de herramientas) para el desarrollo, lo que a menudo es un gasto tanto en dinero como en tiempo. [2] Las principales preocupaciones sobre las hojas de ruta para la adopción de nuevas tecnologías tienden a ser la necesidad de capacitar a nuevos desarrolladores y adaptar los procesos existentes a la nueva tecnología. [3]
Para abordar estas preocupaciones comerciales, un tejedor de aspectos permite el uso de lenguajes ampliamente adoptados como Java con programación orientada a aspectos a través de adaptaciones menores como AspectJ que funcionan con herramientas existentes. [4] En lugar de desarrollar un lenguaje completamente nuevo, el tejedor de aspectos interpreta las extensiones definidas por AspectJ y construye código Java "tejido" que luego puede ser utilizado por cualquier compilador Java existente. Esto asegura que cualquier código existente orientado a objetos seguirá siendo un código orientado a aspectos válido y que el desarrollo se sentirá como una extensión natural del lenguaje orientado a objetos. [5] El lenguaje de programación AspectC ++ extiende C ++ a través del uso de un tejedor de aspectos, ofreciendo la eficiencia adicional sobre AspectJ que es necesaria para los sistemas embebidos mientras aún conserva los beneficios de la programación orientada a aspectos. [6]
Implementación
Los tejedores de aspectos operan tomando instrucciones especificadas por aspectos , conocidas como consejos , y distribuyéndolas automáticamente entre las distintas clases del programa. El resultado del proceso de tejido es un conjunto de clases con los mismos nombres que las clases originales pero con código adicional inyectado en las funciones de las clases automáticamente. El consejo especifica la ubicación exacta y la funcionalidad del código inyectado. [7]
A través de este proceso de tejido, los tejedores de aspectos permiten un código que de otro modo se habría duplicado en todas las clases. Al eliminar esta duplicación, los tejedores de aspectos promueven la modularidad de las preocupaciones transversales . [8] Los aspectos definen el código de implementación que de otro modo se habría duplicado y luego usan puntos de acceso y puntos de unión para definir el consejo. Durante el tejido, el tejedor de aspecto utiliza los cortes puntuales y los puntos de unión, conocidos como designador de cortes puntuales , para identificar las posiciones en las clases candidatas en las que se debe inyectar la implementación. [9] Luego, la implementación se inyecta en las clases en los puntos identificados, lo que permite que el código se ejecute en los momentos adecuados sin depender de la duplicación manual por parte del programador . [10]
Aspecto Logger { método pointcut () : ejecución ( * * (..)); antes () : método () { System . fuera . println ( "Ingresando" + thisJoinPoint . getSignature (). toString ()); } después () : método () { System . fuera . println ( "Saliendo" + thisJoinPoint . getSignature (). toString ()); } } public class Foo { public void bar () { System . fuera . println ( "Ejecutando Foo.bar ()" ); } public void baz () { System . fuera . println ( "Ejecutando Foo.baz ()" ); } } |
Un aspecto y una clase de muestra definidos en el lenguaje de programación AspectJ |
public class Foo { public void bar () { System . fuera . println ( "Ingresando Foo.bar ()" ); Sistema . fuera . println ( "Ejecutando Foo.bar ()" ); Sistema . fuera . println ( "Dejando Foo.bar ()" ); } public void baz () { System . fuera . println ( "Ingresando Foo.baz ()" ); Sistema . fuera . println ( "Ejecutando Foo.baz ()" ); Sistema . fuera . println ( "Dejando Foo.baz ()" ); } } |
La clase de tejido que resulta de ejecutar un tejido de aspecto en la muestra anterior. |
Tejiendo en AspectJ
En el lenguaje de programación AspectJ , los puntos de corte, los puntos de unión y el código modularizado se definen en un bloque de aspecto similar al de las clases de Java . Las clases se definen utilizando la sintaxis de Java. El proceso de tejido consiste en ejecutar el consejo de aspecto para producir solo un conjunto de clases generadas que tienen el código de implementación de aspecto entretejido. [11]
El ejemplo de la derecha muestra una implementación potencial de un aspecto que registra la entrada y salida de todos los métodos . Sin un tejedor de aspectos, esta característica requeriría la duplicación de código en la clase para cada método. En cambio, el código de entrada y salida se define únicamente dentro del aspecto. [12]
El tejedor de aspectos analiza el consejo especificado por el pointcut en el aspecto y usa ese consejo para distribuir el código de implementación en la clase definida. El código difiere ligeramente en cada método debido a ligeras variaciones en los requisitos del método (ya que el identificador del método ha cambiado). El tejedor de aspectos determina el código apropiado para generar en cada situación según lo definido por el consejo de implementación y luego lo inyecta en métodos que coinciden con el punto de corte especificado. [13]
Tejiendo al código de bytes
En lugar de generar un conjunto de tejido de código fuente , algunos AspectJ tejedores en lugar de la armadura los aspectos y clases juntos directamente en código de bytes , actuando tanto como el tejedor aspecto y compilador . [14] [15] Se espera que el desempeño de los tejedores de aspecto que también realizan el proceso de compilación requiera más tiempo de cálculo debido al proceso de tejido involucrado. Sin embargo, el proceso de tejido de códigos de bytes produce un código de tiempo de ejecución más eficiente que el que normalmente se lograría mediante una fuente tejida compilada.
Tejido en tiempo de ejecución
Los desarrollos en AspectJ han revelado el potencial de incorporar la compilación justo a tiempo en la ejecución de código orientado a aspectos para abordar las demandas de rendimiento. [16] En tiempo de ejecución , un tejedor de aspectos podría traducir aspectos de una manera más eficiente que los enfoques tradicionales de tejido estático. Al usar AspectJ en una máquina virtual Java , se ha demostrado que el tejido dinámico de aspectos en tiempo de ejecución mejora el rendimiento del código en un 26%. [17] Si bien algunas implementaciones de máquinas virtuales justo a tiempo implementan esta capacidad a través de una nueva máquina virtual, algunas implementaciones pueden diseñarse para usar características que ya existen en las máquinas virtuales actuales. [18] [19] El requisito de una nueva máquina virtual es contrario a uno de los objetivos de diseño originales de AspectJ. [5]
Para lograr el tejido justo a tiempo, es necesario un cambio en la máquina virtual que ejecuta el código de bytes compilado . Una solución propuesta para AspectJ utiliza un enfoque en capas que se basa en la máquina virtual Java existente para agregar soporte para la administración de puntos de unión y devoluciones de llamada a un motor de programación orientado a aspectos dinámicos . [19] Una implementación alternativa usa un motor de tejido que usa puntos de interrupción para detener la ejecución en el punto de corte, seleccionar un método apropiado, incrustarlo en la aplicación y continuar. [20] Se ha demostrado que el uso de puntos de interrupción de esta manera reduce el rendimiento debido a una gran cantidad de cambios de contexto . [17]
Actuación
El desempeño de los tejedores de aspectos, así como el desempeño del código que producen, ha sido objeto de análisis. Es preferible que la mejora en la modularidad proporcionada por el tejido de aspecto no afecte el rendimiento en tiempo de ejecución. Los tejedores de aspectos pueden realizar optimizaciones específicas de aspectos. [21] Si bien las optimizaciones tradicionales, como la eliminación de variables especiales no utilizadas del código de aspecto, se pueden realizar en tiempo de compilación , algunas optimizaciones solo las puede realizar el tejedor de aspectos. Por ejemplo, AspectJ contiene dos palabras clave similares pero distintas thisJoinPoint
, que contiene información sobre esta instancia particular de código tejido, y thisJoinPointStaticPart
que contiene información común a todas las instancias de código relevantes para ese conjunto de consejos. La optimización de la sustitución thisJoinPoint
con la palabra clave más eficiente y estáticathisJoinPointStaticPart
solo puede realizarla el tejedor de aspectos. Al realizar este reemplazo, el programa tejido evita la creación de un objeto de punto de unión en cada ejecución. [14] Los estudios han demostrado que la creación innecesaria de objetos de punto de unión en AspectJ puede llevar a una sobrecarga de rendimiento del 5% en tiempo de ejecución, mientras que la degradación del rendimiento es solo aproximadamente del 1% cuando este objeto no se crea. [22]
El rendimiento en tiempo de compilación es generalmente peor en los tejedores de aspectos que en los compiladores tradicionales debido al trabajo adicional necesario para localizar métodos que coincidan con los puntos de corte especificados. Un estudio realizado mostró que el compilador de AspectJ ajc es aproximadamente un 34% más lento que el compilador de Sun Microsystems Java 1.3 y aproximadamente un 62% más lento que el compilador de Java 1.4 . [23]
Ver también
- Programación Orientada a Aspectos
- Preprocesador
- Compilador
Referencias
- ^ Kiczales (octubre de 2001), p.2
- ^ Kiczales (octubre de 2001), p.7
- ^ Colyer (2003), p.6
- ^ Kiczales (octubre de 2001), p.5
- ↑ a b Kiczales (junio de 2001), p.3
- ^ Spinczyk (2002), p.1
- ^ Varita (2004), p.1
- ^ Varita (2004), p.7
- ↑ Viega (noviembre de 2000), p.2
- ^ Spinczyk (octubre de 2007), p.21
- ↑ Wang (julio de 2007), p.4
- ↑ Avgustinov (2007), p. 2
- ^ Hilsdale (2004), págs. 5-6
- ↑ a b Hilsdale (2004), p.2
- ↑ McEachen (2005), p.1
- ↑ Popovici (2003), p.1
- ↑ a b Sato (septiembre de 2003), p.17
- ↑ Sato (septiembre de 2003), p.2
- ↑ a b Papovici (2003), p.3
- ↑ Sato (septiembre de 2003), p.11
- ↑ Gal (2001), p. 3
- ^ Colyer (2003), p.2
- ↑ Hilsdale (2004), p.7
Bibliografía
- Avgustinov, Pavel; Hajiyev, Elnar; Ongkingco, Neil; de More, Oege; Sereni, Damien; Tibble, Julian; Verbaere, Mathieu (2007). Semántica de cortes de puntos estáticos en AspectJ . Actas del 34º Simposio anual ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación . ACM . págs. 11-23. CiteSeerX 10.1.1.109.1796 . doi : 10.1145 / 1190216.1190221 . ISBN 978-1-59593-575-5.
- Colyer, Adrian; Clemente, Andy; Bodkin, Ron; Hugunin, Jim (2003). Uso de AspectJ para la integración de componentes en middleware (PDF) . Acompañante de la 18ª Conferencia Anual ACM SIGPLAN sobre Programación, Sistemas, Lenguajes y Aplicaciones Orientados a Objetos . págs. 339–344. doi : 10.1145 / 949344.949440 . ISBN 978-1-58113-751-4. Consultado el 23 de enero de 2009 .[ enlace muerto permanente ]
- Gal, Andreas; Schröder-Preikschat, Wolfgang; Spinczyk, Olaf (2001). "En sistemas operativos de sobrecarga mínima y programación orientada al aspecto" (PDF) . Actas del 4º Taller sobre Orientación a Objetos y Sistemas Operativos en la 15ª Conferencia Europea de Programación Orientada a Objetos (ECOOP-OOOSW) . Consultado el 27 de enero de 2010 .
- Hilsdale, Erik; Hugunin, Jim (2004). Consejos de tejido en AspectJ (PDF) . Actas de la 3ª Conferencia Internacional sobre Desarrollo de Software Orientado a Aspectos . ACM . págs. 24–35. doi : 10.1145 / 976270.976276 . ISBN 978-1-58113-842-9. Archivado desde el original (PDF) el 27 de julio de 2011 . Consultado el 23 de enero de 2009 .
- Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffrey; Griswold, William (octubre de 2001). "Introducción a AspectJ". Comunicaciones de la ACM . 44 (10): 59–65. CiteSeerX 10.1.1.147.2820 . doi : 10.1145 / 383845.383858 .
- Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffery; Griswold, William G. (junio de 2001). Una descripción general de AspectJ (PDF) . Actas de la Conferencia europea sobre programación orientada a objetos . Apuntes de conferencias en Ciencias de la Computación. 2072 . págs. 327–354. doi : 10.1007 / 3-540-45337-7_18 . ISBN 978-3-540-42206-8. Archivado desde el original (PDF) el 30 de julio de 2004 . Consultado el 4 de enero de 2010 .
- McEachen, Nathan; Alexander, Roger (2005). Distribución de clases con preocupaciones tejidas: una exploración de posibles escenarios de fallas . Actas de la IV Conferencia Internacional sobre Desarrollo de Software Orientado a Aspectos . ACM . págs. 192-200. doi : 10.1145 / 1052898.1052915 . ISBN 978-1-59593-043-9.
- Popovici, Andrei; Alonso, Gustavo; Gross, Thomas (2003). Aspectos Just-In-Time: Eficiente tejido dinámico para Java . Actas de la 2ª Conferencia Internacional sobre Desarrollo de Software Orientado a Aspectos . ACM . págs. 100 109. doi : 10.1145 / 643603.643614 . ISBN 978-1-58113-660-9.
- Sato, Yoshiki; Chiba, Shigeru; Tatsubori, Michiaki (septiembre de 2003). "Un tejedor de aspectos selectivo y justo a tiempo" (PDF) . Actas del II Congreso Internacional de Programación Generativa e Ingeniería de Componentes . Apuntes de conferencias en Ciencias de la Computación. 2830 : 189-208. doi : 10.1007 / 978-3-540-39815-8_12 . ISBN 978-3-540-20102-1. Archivado desde el original (PDF) el 24 de septiembre de 2010 . Consultado el 4 de enero de 2010 .
- Spinczyk, Olaf; Gal, Andreas; Schröder-Preikschat, Wolfgang (2002). "AspectC ++: una extensión orientada a aspectos del lenguaje de programación C ++" (PDF) . Actas de la Cuadragésima Conferencia Internacional sobre Herramientas del Pacífico . 21 : 53–60. Archivado desde el original (PDF) el 13 de octubre de 2009 . Consultado el 4 de enero de 2010 .
- Spinczyk, Olaf; Lohmann, Daniel (octubre de 2007). "El diseño e implementación de AspectC ++" (PDF) . Sistemas basados en el conocimiento . 20 (7): 636–651. CiteSeerX 10.1.1.149.7119 . doi : 10.1016 / j.knosys.2007.05.004 . Consultado el 23 de enero de 2010 .
- Viega, John; Voas, Jeffrey (noviembre de 2000). "¿Puede la programación orientada a aspectos conducir a un software más confiable?". Software IEEE . 17 (6): 19-21. doi : 10.1109 / 52.895163 .
- Varita, Michael; Kiczales, Gregor; Dutchyn, Christopher (2004). "Una semántica para consejos y puntos de unión dinámicos en la programación orientada a aspectos" (PDF) . Transacciones ACM sobre lenguajes y sistemas de programación . 26 (5): 890–910. CiteSeerX 10.1.1.57.6581 . doi : 10.1145 / 1018203.1018208 . Archivado desde el original (PDF) el 25 de agosto de 2011 . Consultado el 23 de enero de 2009 .
- Wang, Yi; Zhao, Jianjun (julio de 2007). Especificación de Pointcuts en AspectJ (PDF) . Actas de la 21ª Conferencia Anual Internacional de Aplicaciones y Software Informático . 2 . págs. 5–10. CiteSeerX 10.1.1.547.6577 . doi : 10.1109 / COMPSAC.2007.196 . ISBN 978-0-7695-2870-0. Consultado el 23 de enero de 2010 .
Otras lecturas
- Suzuki, Junichi; Yamamoto, Yoshikazu (junio de 1999). Moreira, AM; Demeyer, Moreira (eds.). "Ampliación de UML con aspectos: soporte de aspectos en la fase de diseño" (PDF) . Actas del Taller de Tecnología Orientada a Objetos . 1743 : 299–300. Archivado desde el original (PDF) el 22 de julio de 2011 . Consultado el 4 de enero de 2010 .