Аспект ткачиха - Aspect weaver

Аспект ткачиха
Представлены два класса и один аспект. Ткач аспектов анализирует каждый класс и объединяет аспект в код реализации. Результатом являются два класса реализации с кодом аспекта, представленным в соответствующих, но различных местах в каждом классе.
Аспект-ткач берет информацию из сырых классы и аспекты и создает новые классы с аспектом код соответствующим образом вплетены в классы.
Доступно вАспектС ++, AspectJ
ТипАспектно-ориентированное программирование

An аспект ткач это метапрограммирование полезность для аспектно-ориентированные языки разработан для выполнения инструкций, указанных аспекты (отдельные представления важных концепций в программе) и сгенерировать окончательную реализацию код. Ткач интегрирует аспекты в места, указанные программным обеспечением, как предварительныесборник шаг. Путем объединения аспектов и классы (представления структуры сущностей в программе) ткач генерирует тканый класс.

Ткачи Аспекта следуют инструкциям, известным как совет указано с использованием Pointcuts и точки соединения, специальные сегменты кода, которые указывают, что методы должен обрабатываться кодом аспекта. Затем реализация аспекта определяет, код следует добавлять до, после или во всех связанных методах. Делая это, ткачи аспектов улучшают модульность, сохраняя код в одном месте, который иначе был бы рассредоточен по различным, не связанным между собой классам.

Мотивация

Много языки программирования уже широко приняты и поняты. Однако желание создать радикально другие языки программирования для поддержки аспектно-ориентированное программирование парадигма не имеет значения из-за проблем, связанных с бизнесом; есть риски, связанные с внедрением новых технологий.[1] Использование совершенно нового языка зависит от способности компании привлекать новых разработчиков. Кроме того, необходимо отказаться от существующей кодовой базы бизнеса. Наконец, бизнесу потребуется приобрести новый набор инструментов (набор инструментов) для разработки, что часто требует как денег, так и времени.[2] Основные опасения по поводу дорожные карты для внедрения новых технологий, как правило, возникает необходимость обучать новых разработчиков и адаптировать существующие процессы к новым технологиям.[3]

Чтобы решить эти проблемы, связанные с бизнесом, аспект Weaver позволяет использовать широко распространенные языки, такие как Ява с аспектно-ориентированным программированием с помощью незначительных изменений, таких как AspectJ которые работают с существующими инструментами.[4] Вместо того, чтобы разрабатывать совершенно новый язык, ткач аспектов интерпретирует расширения, определенные AspectJ, и строит «сплетенный» код Java, который затем может использоваться любым существующим компилятором Java. Это гарантирует, что любые существующие объектно-ориентированный код по-прежнему будет корректным аспектно-ориентированным кодом, и эта разработка будет казаться естественным расширением объектно-ориентированного языка.[5] В АспектС ++ язык программирования расширяется C ++ за счет использования ткацкого станка, обеспечивающего дополнительную эффективность по сравнению с AspectJ это необходимо для встроенные системы при этом сохраняя преимущества аспектно-ориентированного программирования.[6]

Выполнение

Ткачи Аспекта действуют, следуя инструкциям, указанным аспекты, известный как совет, и распределяя его по различным классы в программе автоматически. Результатом процесса плетения является набор классов с теми же именами, что и исходные классы, но с дополнительным кодом, введенным в классы. функции автоматически. Совет указывает точное местоположение и функциональность внедренного кода.[7]

Благодаря этому процессу плетения аспектные ткачи допускают код, который в противном случае дублировался бы для разных классов. Устраняя это дублирование, ткачи аспектов продвигают модульность из сквозные проблемы.[8] Аспекты определяют код реализации, который иначе был бы дублирован, а затем используют Pointcuts и точки соединения определить совет. Во время плетения аспектный ткач использует точечные разрезы и точки соединения, известные как обозначение pointcut, чтобы определить позиции в классах кандидатов, в которые должна быть внедрена реализация.[9] Затем реализация внедряется в классы в идентифицированных точках, что позволяет выполнять код в нужное время, не полагаясь на ручное дублирование со стороны программист.[10]

аспект Регистратор {    Pointcut метод() : исполнение(* *(..));    перед() : метод() {        Система.из.println("Вход" +             thisJoinPoint.getSignature().нанизывать());    }    после() : метод() {         Система.из.println("Уход " +             thisJoinPoint.getSignature().нанизывать());    }}общественный учебный класс Фу {    общественный пустота бар() {        Система.из.println("Выполнение Foo.bar ()");    }    общественный пустота баз() {        Система.из.println("Выполнение Foo.baz ()");    }}
Образец аспект и учебный класс определено в AspectJ язык программирования
общественный учебный класс Фу {    общественный пустота бар() {        Система.из.println("Вход в Foo.bar ()");        Система.из.println("Выполнение Foo.bar ()");        Система.из.println("Выход из Foo.bar ()");    }    общественный пустота баз() {        Система.из.println("Вход в Foo.baz ()");        Система.из.println("Выполнение Foo.baz ()");        Система.из.println("Выход из Foo.baz ()");    }}
Класс тканого материала, полученный в результате выполнения ткача аспекта на примере выше.

Плетение в AspectJ

в язык программирования AspectJ, pointcuts, точки соединения и модульный код определены в блоке аспектов, аналогичном блоку Ява классы. Классы определены с использованием синтаксиса Java. Процесс переплетения состоит из выполнения рекомендаций по аспектам для создания только набора сгенерированных классов, в которые вплетен код реализации аспекта.[11]

Пример справа показывает потенциальную реализацию аспекта, который регистрирует вход и выход всех методы. Без ткацкого станка эта функция потребовала бы дублирование кода в классе для каждого метода. Вместо этого код входа и выхода определяется исключительно внутри аспекта.[12]

Ткач аспектов анализирует рекомендацию, заданную pointcut в аспекте, и использует эту рекомендацию для распределения кода реализации в определенный класс. Код для каждого метода немного отличается из-за небольших различий в требованиях к методу (поскольку метод идентификатор изменилось). Ткач аспектов определяет соответствующий код для генерации в каждой ситуации, как определено советом по реализации, а затем внедряет его в методы, соответствующие указанному pointcut.[13]

Плетение по байт-коду

Вместо создания набора тканых исходный код, некоторые ткачи AspectJ вместо этого плетут аспекты и классы вместе прямо в байт-код, действуя одновременно как ткач и компилятор.[14][15] Ожидается, что производительность ткачей аспектов, которые также выполняют процесс компиляции, потребует больше времени вычислений из-за задействованного процесса плетения. Однако процесс переплетения байт-кода производит более эффективный код времени выполнения, чем обычно достигается с помощью скомпилированного тканого исходного кода.

Ткачество во время выполнения

Разработки в AspectJ выявили потенциал для включения своевременная компиляция в выполнение аспектно-ориентированного кода для удовлетворения требований к производительности.[16] В время выполнения, ткач аспектов мог бы переводить аспекты более эффективно, чем традиционные подходы статического плетения. Использование AspectJ на Виртуальная машина Java, было показано, что динамическое объединение аспектов во время выполнения улучшает производительность кода на 26%.[17] Хотя некоторые реализации виртуальных машин JIT реализуют эту возможность через новую виртуальную машину, некоторые реализации могут быть разработаны для использования функций, которые уже существуют в текущих виртуальных машинах.[18][19] Требование новой виртуальной машины противоречит одной из первоначальных целей дизайна AspectJ.[5]

Чтобы выполнить ткачество точно в срок, необходимо изменить виртуальная машина который выполняет скомпилированный байт-код необходимо. Предлагаемое решение для AspectJ использует слоистый подход, основанный на существующей виртуальной машине Java, чтобы добавить поддержку управления точками соединения и обратных вызовов для Механизм динамического аспектно-ориентированного программирования.[19] В альтернативной реализации используется механизм ткачества, который использует контрольные точки чтобы остановить выполнение на pointcut, выберите подходящий метод, вставьте его в приложение и продолжите.[20] Было показано, что использование точек останова таким образом снижает производительность из-за очень большого количества переключатели контекста.[17]

Спектакль

Производительность Aspect Weavers, а также производительность кода, который они производят, были предметом анализа. Предпочтительно, чтобы улучшение модульности, обеспечиваемое переплетением аспектов, не влияло на производительность во время выполнения. Ткачи аспектов могут выполнять оптимизацию для конкретных аспектов.[21] Хотя традиционные оптимизации, такие как удаление неиспользуемых специальных переменные из кода аспекта можно сделать в время компиляции, некоторые оптимизации может выполнить только ткач аспектов. Например, AspectJ содержит два похожих, но разных ключевых слова, thisJoinPoint, который содержит информацию об этом конкретном экземпляре тканого кода, и thisJoinPointStaticPart, который содержит информацию, общую для всех экземпляров кода, относящихся к этому набору рекомендаций. Оптимизация замены thisJoinPoint с более эффективным и статический ключевое слово thisJoinPointStaticPart может быть сделано только ткачом аспектов. Выполняя эту замену, тканая программа позволяет избежать создания точки соединения. объект на каждую казнь.[14] Исследования показали, что ненужное создание объектов точки соединения в AspectJ может привести к накладным расходам производительности на 5% во время выполнения, в то время как снижение производительности составляет только приблизительно 1%, когда этот объект не создается.[22]

Производительность во время компиляции, как правило, хуже у аспектов ткачества, чем у их традиционных аналогов компилятора из-за дополнительной работы, необходимой для поиска методов, соответствующих указанным pointcut. Проведенное исследование показало, что компилятор AspectJ ajc примерно на 34% медленнее, чем Sun Microsystems Java 1.3 компилятор и примерно на 62% медленнее, чем Java 1.4 компилятор.[23]

Смотрите также

Рекомендации

  1. ^ Кичалес (октябрь 2001 г.), стр.
  2. ^ Кичалес (октябрь 2001 г.), стр.7
  3. ^ Колайер (2003), стр.6
  4. ^ Кичалес (октябрь 2001 г.), стр.
  5. ^ а б Кичалес (июнь 2001 г.), стр.
  6. ^ Спинчик (2002), стр.1
  7. ^ Жезл (2004), стр.1
  8. ^ Жезл (2004), стр.7
  9. ^ Viega (ноябрь 2000 г.), стр. 2
  10. ^ Spinczyk (октябрь 2007 г.), стр.21.
  11. ^ Ван (июль 2007 г.), стр.
  12. ^ Августинов (2007), стр.2
  13. ^ Хилсдейл (2004), стр. 5–6.
  14. ^ а б Хилсдейл (2004), стр.2
  15. ^ Макихен (2005), стр.1
  16. ^ Поповичи (2003), стр.1
  17. ^ а б Сато (сентябрь 2003 г.), стр.17
  18. ^ Сато (сентябрь 2003 г.), стр. 2
  19. ^ а б Паповичи (2003), стр.3
  20. ^ Сато (сентябрь 2003 г.), стр.11
  21. ^ Гал (2001), стр.3
  22. ^ Колайер (2003), стр.2
  23. ^ Хилсдейл (2004), стр.7

Библиография

  • Августинов, Павел; Гаджиев, Эльнар; Онгкингко, Нил; де Мор, Эге; Серени, Дэмиен; Тиббл, Джулиан; Вербер, Матье (2007). Семантика статических точек в AspectJ. Материалы 34-го ежегодного симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования. ACM. С. 11–23. CiteSeerX  10.1.1.109.1796. Дои:10.1145/1190216.1190221. ISBN  978-1-59593-575-5.
  • Колайер, Адриан; Клемент, Энди; Бодкин, Рон; Хугунин, Джим (2003). Использование AspectJ для интеграции компонентов в промежуточное ПО (PDF). Соучастник 18-й ежегодной конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям. С. 339–344. Дои:10.1145/949344.949440. ISBN  978-1-58113-751-4. Получено 23 января 2009.[постоянная мертвая ссылка ]
  • Галь, Андреас; Шредер-Прейкшат, Вольфганг; Спинчик, Олаф (2001). «Об операционных системах с минимальными накладными расходами и аспектно-ориентированном программировании» (PDF). Материалы 4-го семинара по объектно-ориентированному программированию и операционным системам на 15-й Европейской конференции по объектно-ориентированному программированию (ECOOP-OOOSW). Получено 27 января 2010.
  • Хилсдейл, Эрик; Хугунин, Джим (2004). Советы по плетению в AspectJ (PDF). Материалы 3-й Международной конференции по аспектно-ориентированной разработке программного обеспечения. ACM. С. 24–35. Дои:10.1145/976270.976276. ISBN  978-1-58113-842-9. Архивировано из оригинал (PDF) 27 июля 2011 г.. Получено 23 января 2009.
  • Кичалес, Грегор; Хилсдейл, Эрик; Хугунин, Джим; Керстен, Мик; Палм, Джеффри; Грисволд, Уильям (октябрь 2001 г.). «Начало работы с AspectJ». Коммуникации ACM. 44 (10): 59–65. CiteSeerX  10.1.1.147.2820. Дои:10.1145/383845.383858.
  • Кичалес, Грегор; Хилсдейл, Эрик; Хугунин, Джим; Керстен, Мик; Палм, Джеффри; Грисволд, Уильям Г. (Июнь 2001 г.). Обзор AspectJ (PDF). Труды Европейской конференции по объектно-ориентированному программированию. Конспект лекций по информатике. 2072. С. 327–354. Дои:10.1007/3-540-45337-7_18. ISBN  978-3-540-42206-8. Архивировано из оригинал (PDF) в 2004-07-30. Получено 4 января 2010.
  • Макихен, Натан; Александр, Роджер (2005). Распределение классов с заплетенными проблемами - исследование возможных сценариев неисправности. Материалы 4-й Международной конференции по аспектно-ориентированной разработке программного обеспечения. ACM. С. 192–200. Дои:10.1145/1052898.1052915. ISBN  978-1-59593-043-9.
  • Попович, Андрей; Алонсо, Густаво; Гросс, Томас (2003). Своевременные аспекты: эффективное динамическое переплетение для Java. Материалы 2-й Международной конференции по аспектно-ориентированной разработке программного обеспечения. ACM. С. 100 109. Дои:10.1145/643603.643614. ISBN  978-1-58113-660-9.
  • Сато, Йошики; Тиба, Сигеру; Тацубори, Мичиаки (сентябрь 2003 г.). «Избирательный ткач аспектов точно в срок» (PDF). Труды 2-й Международной конференции по генеративному программированию и компонентной инженерии: 189–208. Архивировано из оригинал (PDF) на 24.09.2010. Получено 4 января 2010.
  • Спинчик, Олаф; Галь, Андреас; Шредер-Прейкшат, Вольфганг (2002). «AspectC ++: аспектно-ориентированное расширение языка программирования C ++» (PDF). Материалы сороковой Международной конференции по инструментам Pacific. 21: 53–60. Архивировано из оригинал (PDF) 13 октября 2009 г.. Получено 4 января 2010.
  • Спинчик, Олаф; Ломанн, Даниэль (октябрь 2007 г.). «Дизайн и реализация AspectC ++» (PDF). Системы, основанные на знаниях. 20 (7): 636–651. CiteSeerX  10.1.1.149.7119. Дои:10.1016 / j.knosys.2007.05.004. Получено 23 января 2010.
  • Вьега, Джон; Воас, Джеффри (ноябрь 2000 г.). «Может ли аспектно-ориентированное программирование привести к созданию более надежного программного обеспечения?». Программное обеспечение IEEE. 17 (6): 19–21. Дои:10.1109/52.895163.
  • Жезл, Майкл; Кичалес, Грегор; Датчин, Кристофер (2004). «Семантика для рекомендаций и динамических точек соединения в аспектно-ориентированном программировании» (PDF). Транзакции ACM по языкам и системам программирования. 26 (5): 890–910. CiteSeerX  10.1.1.57.6581. Дои:10.1145/1018203.1018208. Архивировано из оригинал (PDF) 25 августа 2011 г.. Получено 23 января 2009.
  • Ван, Йи; Чжао, Цзяньцзюнь (июль 2007 г.). Указание Pointcut в AspectJ (PDF). Материалы 21-й ежегодной международной конференции по компьютерному программному обеспечению и приложениям. 2. С. 5–10. CiteSeerX  10.1.1.547.6577. Дои:10.1109 / COMPSAC.2007.196. ISBN  978-0-7695-2870-0. Получено 23 января 2010.

дальнейшее чтение