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 un paso de precompilación. Al fusionar aspectos y clases ( representaciones de la estructura de entidades en el programa), el tejedor genera una clase tejida.
Los tejedores de aspectos toman instrucciones conocidas como consejos especificados mediante el uso de puntos de corte y puntos de unión , segmentos especiales de código que indican qué métodos deben ser manejados por el 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 solo lugar que de otra manera habría estado intercalado en varias clases no relacionadas.
Motivación
Muchos lenguajes de programación ya son ampliamente aceptados y comprendidos. Sin embargo, no existe un deseo significativo de crear lenguajes de programación radicalmente diferentes para respaldar el paradigma de programación orientada a aspectos debido a los riesgos comerciales 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, sería necesario descartar la base de código existente de una empresa. Finalmente, una empresa necesitaría adquirir una nueva cadena de herramientas (conjunto de herramientas) para el desarrollo, lo que a menudo es costoso tanto en dinero como en tiempo. [2] Las principales preocupaciones sobre las hojas de ruta para la adopción de nuevas tecnologías incluyen 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 crea código Java "tejido" que luego puede ser utilizado por cualquier compilador Java existente. Esto garantiza que cualquier código orientado a objetos existente 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 se necesita para los sistemas integrados mientras se conservan los beneficios de la programación orientada a aspectos. [6]
Implementación
Los tejedores de aspectos funcionan tomando instrucciones especificadas por aspectos , conocidas como consejos , y distribuyéndolas automáticamente a través de las distintas clases del programa. El resultado del proceso de tejedura es un conjunto de clases con los mismos nombres que las clases originales pero con código adicional inyectado automáticamente en las funciones de las clases . Los consejos especifican la ubicación exacta y la funcionalidad del código inyectado. [7]
A través de este proceso de entrelazado, los tejedores de aspectos permiten un código que de otra manera se habría duplicado en 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 otra manera se habría duplicado y luego usan puntos de corte y puntos de unión para definir el consejo. Durante el entrelazado, el tejedor de aspectos usa los puntos de corte y los puntos de unión, conocidos como designadores de puntos de corte , 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 apropiados sin depender de la duplicación manual por parte del programador . [10]
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 Java . Las clases se definen utilizando la sintaxis de Java. El proceso de entrelazado 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 entrelazado en él. [11]
El ejemplo de la derecha muestra una posible implementación de un aspecto que registra la entrada y salida de todos los métodos . Sin un tejedor de aspectos, esta función 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 punto de corte en el aspecto y utiliza 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 pequeñas variaciones en los requisitos para el 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 los métodos que coinciden con el punto de corte especificado. [13]
Tejiendo con código de bytes
En lugar de generar un conjunto de código fuente entrelazado , algunos tejedores de AspectJ entrelazan los aspectos y las clases directamente en bytecode , actuando como tejedores de aspectos y compiladores . [14] [15] Se espera que el rendimiento de los tejedores de aspectos que también realizan el proceso de compilación requiera más tiempo de cálculo debido al proceso de entrelazado involucrado. Sin embargo, el proceso de entrelazado de bytecode produce un código en tiempo de ejecución más eficiente que el que normalmente se lograría a través de una fuente entrelazada compilada.
Tejido en tiempo de ejecución
Los avances 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 entrelazador de aspectos podría traducir aspectos de una manera más eficiente que los enfoques de entrelazado estático tradicionales. Al usar AspectJ en una máquina virtual Java , se ha demostrado que el entrelazado 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 entrelazado justo a tiempo, se necesita un cambio en la máquina virtual que ejecuta el bytecode 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 gestión de puntos de unión y devoluciones de llamadas a un motor de programación orientado a aspectos dinámico . [19] Una implementación alternativa utiliza un motor de entrelazado que utiliza 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 rendimiento de los tejedores de aspectos, así como el rendimiento del código que producen, ha sido objeto de análisis. Es preferible que la mejora en la modularidad proporcionada por el tejedor de aspectos no afecte al rendimiento en tiempo de ejecución. Los tejedores de aspectos pueden realizar optimizaciones específicas de aspecto. [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 pueden ser realizadas por 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 entretejido, 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 reemplazar con la palabra clave thisJoinPointmás eficiente y estática solo puede ser realizada por el tejedor de aspectos. Al realizar este reemplazo, el programa entretejido evita la creación de un objetothisJoinPointStaticPart 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 generar una sobrecarga de rendimiento del 5 % en tiempo de ejecución, mientras que la degradación del rendimiento es solo de aproximadamente el 1 % cuando no se crea este objeto. [22]
El rendimiento en tiempo de compilación es generalmente peor en los compiladores de aspecto que en sus contrapartes de compiladores tradicionales debido al trabajo adicional necesario para localizar métodos que coincidan con los puntos de corte especificados. Un estudio mostró que el compilador AspectJ ajc es aproximadamente un 34% más lento que el compilador Java 1.3 de Sun Microsystems y aproximadamente un 62% más lento que el compilador Java 1.4 . [23]
Véase también
Referencias
- ^ Kiczales (octubre de 2001), pág. 2
- ^ Kiczales (octubre de 2001), pág. 7
- ^ Colyer (2003), pág. 6
- ^ Kiczales (octubre de 2001), pág. 5
- ^ ab Kiczales (junio de 2001), pág. 3
- ^ Spinczyk (2002), pág. 1
- ^ Varita (2004), pág. 1
- ^ Varita (2004), pág. 7
- ^ Viega (noviembre de 2000), pág. 2
- ^ Spinczyk (octubre de 2007), pág. 21
- ^ Wang (julio de 2007), pág. 4
- ^ Avgustinov (2007), pág. 2
- ^ Hilsdale (2004), págs. 5-6
- ^ de Hilsdale (2004), pág. 2
- ^ McEachen (2005), pág. 1
- ^ Popovici (2003), pág. 1
- ^ ab Sato (septiembre de 2003), pág. 17
- ^ Sato (septiembre de 2003), pág. 2
- ^ de Papovici (2003), pág. 3
- ^ Sato (septiembre de 2003), pág. 11
- ^ Gal (2001), pág. 3
- ^ Colyer (2003), pág. 2
- ^ Hilsdale (2004), pág. 7
Bibliografía
- Avgustinov, Pavel; Hajiyev, Elnar; Ongkingco, Neil; de More, Oege; Sereni, Damien; Tibble, Julian; Verbaere, Mathieu (2007). "Semántica de puntos de corte estáticos en aspectJ". Actas del 34.º simposio anual ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación . ACM . pp. 11–23. CiteSeerX 10.1.1.109.1796 . doi :10.1145/1190216.1190221. ISBN . 978-1-59593-575-5.S2CID16484088 .
- Colyer, Adrian; Clement, Andy; Bodkin, Ron; Hugunin, Jim (2003). "Uso de AspectJ para la integración de componentes en middleware". Companion of the 18th Annual ACM SIGPLAN conference on Object-oriented programming, systems, language, and applications (PDF) . pp. 339–344. doi :10.1145/949344.949440. ISBN 978-1-58113-751-4. S2CID 12646493 . Consultado el 23 de enero de 2009 .[ enlace muerto permanente ]
- Gal, Andreas; Schröder-Preikschat, Wolfgang; Spinczyk, Olaf (2001). "Sobre sistemas operativos con un consumo mínimo de recursos y programación orientada a aspectos" (PDF) . Actas del 4º taller sobre orientación a objetos y sistemas operativos en la 15ª Conferencia Europea sobre Programación Orientada a Objetos (ECOOP-OOOSW) . Consultado el 27 de enero de 2010 .
- Hilsdale, Erik; Hugunin, Jim (2004). "Advice weaving in AspectJ". Actas de la 3.ª conferencia internacional sobre desarrollo de software orientado a aspectos (PDF) . ACM . pp. 24–35. doi :10.1145/976270.976276. ISBN . 978-1-58113-842-9. S2CID 14674749. 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. S2CID 3025764.
- Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffery; Griswold, William G. (junio de 2001). "Una visión general de AspectJ". ECOOP 2001 — Programación orientada a objetos (PDF) . Apuntes de clase en informática. Vol. 2072. págs. 327–354. doi :10.1007/3-540-45337-7_18. ISBN 978-3-540-42206-8. S2CID 45517610. Archivado desde el original (PDF) el 30 de julio de 2004. Consultado el 4 de enero de 2010 .
{{cite book}}:|journal=ignorado ( ayuda ) - McEachen, Nathan; Alexander, Roger (2005). "Distribución de clases con intereses entrelazados". Actas de la 4.ª conferencia internacional sobre desarrollo de software orientado a aspectos . ACM . pp. 192–200. doi :10.1145/1052898.1052915. ISBN . 978-1-59593-043-9. Número de identificación del sujeto 15728009.
- Popovici, Andrei; Alonso, Gustavo; Gross, Thomas (2003). "Just-in-time aspect". Actas de la 2.ª conferencia internacional sobre desarrollo de software orientado a aspectos . ACM . pp. 100–109. doi :10.1145/643603.643614. ISBN . 978-1-58113-660-9.S2CID1662985 .
- Sato, Yoshiki; Chiba, Shigeru; Tatsubori, Michiaki (septiembre de 2003). "Un tejedor de aspectos selectivo y justo a tiempo" (PDF) . Generative Programming and Component Engineering . Lecture Notes in Computer Science. Vol. 2830. págs. 189–208. doi :10.1007/978-3-540-39815-8_12. ISBN 978-3-540-20102-1Archivado 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++: An Aspect-Oriented Extension to the C++ Programming Language" (PDF) . Actas de la 40.ª 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 y la implementación de AspectC++" (PDF) . Knowledge-Based Systems . 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 generar software más confiable?". IEEE Software . 17 (6): 19–21. doi :10.1109/52.895163.
- Wand, Michael; Kiczales, Gregor; Dutchyn, Christopher (2004). "Una semántica para consejos y puntos de unión dinámicos en programación orientada a aspectos" (PDF) . ACM Transactions on Programming Languages and Systems . 26 (5): 890–910. CiteSeerX 10.1.1.57.6581 . doi :10.1145/1018203.1018208. S2CID 12456097. 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 puntos de corte en AspectJ". 31.ª Conferencia anual internacional sobre software y aplicaciones informáticas - vol. 2 - (COMPSAC 2007) (PDF) . Vol. 2. págs. 5–10. CiteSeerX 10.1.1.547.6577 . doi :10.1109/COMPSAC.2007.196. ISBN 978-0-7695-2870-0. S2CID 18772035. Archivado desde el original (PDF) el 20 de marzo de 2009 . Consultado el 23 de enero de 2010 .
Lectura adicional
- Suzuki, Junichi; Yamamoto, Yoshikazu (junio de 1999). Moreira, AM; Demeyer, Moreira (eds.). "Extending UML with Aspects: Aspect Support in the Design Phase" (PDF) . Actas del Taller sobre 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 .