![]() Аспектный ткачик берет информацию из необработанных классов и аспектов и создает новые классы с кодом аспекта, соответствующим образом вплетенным в классы. | |
Доступно в | AspectC++ , AspectJ |
---|---|
Тип | Аспектно-ориентированное программирование |
Аспектный ткач — это метапрограммная утилита для аспектно-ориентированных языков, разработанная для того, чтобы брать инструкции, указанные аспектами (изолированные представления значимых концепций в программе), и генерировать окончательный код реализации . Ткач интегрирует аспекты в места, указанные программным обеспечением, в качестве шага предварительной компиляции . Объединяя аспекты и классы (представления структуры сущностей в программе), ткач генерирует сплетенный класс.
Аспектные ткачи принимают инструкции, известные как советы , указанные с помощью pointcuts и join points , специальных сегментов кода, которые указывают, какие методы должны обрабатываться аспектным кодом. Реализация аспекта затем определяет, следует ли добавлять связанный код до, после или на протяжении связанных методов. Делая это, аспектные ткачи улучшают модульность , сохраняя код в одном месте, который в противном случае был бы разбросан по различным, не связанным классам.
Многие языки программирования уже широко приняты и понятны. Однако нет значительного желания создавать радикально иные языки программирования для поддержки парадигмы аспектно-ориентированного программирования из-за бизнес-рисков, связанных с принятием новых технологий. [1] Использование совершенно нового языка зависит от способности бизнеса привлекать новых разработчиков. Кроме того, существующая кодовая база бизнеса должна быть отброшена. Наконец, бизнесу необходимо будет приобрести новый набор инструментов (набор инструментов) для разработки, что часто является дорогостоящим как по деньгам, так и по времени. [2] Основные опасения относительно дорожных карт для принятия новых технологий включают необходимость обучения новых разработчиков и адаптации существующих процессов к новой технологии. [3]
Для решения этих бизнес-задач аспектный ткачик позволяет использовать широко распространенные языки, такие как Java, с аспектно-ориентированным программированием посредством небольших адаптаций, таких как AspectJ , которые работают с существующими инструментами. [4] Вместо разработки совершенно нового языка аспектный ткачик интерпретирует расширения, определенные AspectJ, и создает «сплетенный» код Java, который затем может использоваться любым существующим компилятором Java. Это гарантирует, что любой существующий объектно-ориентированный код по-прежнему будет допустимым аспектно-ориентированным кодом, и что разработка будет ощущаться как естественное расширение объектно-ориентированного языка. [5] Язык программирования AspectC++ расширяет C++ посредством использования аспектного ткачика, предлагая дополнительную эффективность по сравнению с AspectJ , которая необходима для встраиваемых систем , при этом сохраняя преимущества аспектно-ориентированного программирования. [6]
Аспектные ткачи работают, принимая инструкции, указанные аспектами , известные как советы , и автоматически распределяя их по различным классам в программе. Результатом процесса ткачества является набор классов с теми же именами, что и исходные классы, но с дополнительным кодом, автоматически внедренным в функции классов . Совет определяет точное местоположение и функциональность внедренного кода. [7]
Благодаря этому процессу плетения ткачи аспектов допускают код, который в противном случае был бы продублирован между классами. Устраняя это дублирование, ткачи аспектов способствуют модульности сквозных проблем . [8] Аспекты определяют код реализации, который в противном случае был бы продублирован, а затем используют точки среза и точки соединения для определения совета. Во время плетения ткачи аспектов используют точки среза и точки соединения, известные как указатель точки среза , для определения позиций в классах-кандидатах, в которые должна быть внедрена реализация. [9] Затем реализация внедряется в классы в определенных точках, что позволяет выполнять код в подходящее время, не полагаясь на ручное дублирование программистом . [ 10]
аспект Logger { pointcut method () : execution ( * * (.. ) ); before ( ) : method () { System.out.println ( " Вход " + thisJoinPoint.getSignature (). toString ()); } after ( ) : method ( ) { System.out.println ( " Выход " + thisJoinPoint.getSignature (). toString ()); } } public class Foo { public void bar ( ) { System.out.println ( " Выполнение Foo.bar ( ) " ) ; } public void baz ( ) { System.out.println ( " Выполнение Foo.baz ( ) " ) ; } } |
Пример аспекта и класса, определенных на языке программирования AspectJ |
public class Foo { public void bar () { System.out.println ( " Вход в Foo.bar()" ) ; System.out.println ( " Выполнение Foo.bar()" ) ; System.out.println ( "Выход из Foo.bar()" ) ; } public void baz ( ) { System.out.println ( " Вход в Foo.baz()" ) ; System.out.println ( " Выполнение Foo.baz ( ) " ); System.out.println ( " Выход из Foo.baz ( ) " ) ; } } |
Сплетенный класс, который получается в результате выполнения аспектного ткача на примере выше |
В языке программирования AspectJ , pointcuts, join points и moduleized code определяются в блоке аспекта, аналогичном блоку классов Java . Классы определяются с использованием синтаксиса Java. Процесс плетения состоит из выполнения рекомендаций аспекта для создания только набора сгенерированных классов, в которые вплетен код реализации аспекта. [11]
Пример справа показывает потенциальную реализацию аспекта, который регистрирует вход и выход всех методов . Без ткача аспектов эта функция потребовала бы дублирования кода в классе для каждого метода. Вместо этого код входа и выхода определяется исключительно внутри аспекта. [12]
Аспектный ткач анализирует совет, указанный pointcut в аспекте, и использует этот совет для распределения кода реализации в определенный класс. Код немного отличается в каждом методе из-за небольших различий в требованиях к методу (так как идентификатор метода изменился). Аспектный ткач определяет соответствующий код для генерации в каждой ситуации, как определено в совете по реализации, а затем внедряет его в методы, соответствующие указанному pointcut. [13]
Вместо того, чтобы генерировать набор исходного кода плетения , некоторые ткачи AspectJ вместо этого плетут аспекты и классы вместе непосредственно в байт-код , выступая одновременно в качестве ткача аспектов и компилятора . [14] [15] Ожидается, что производительность ткачей аспектов, которые также выполняют процесс компиляции, потребует больше времени вычислений из-за задействованного процесса плетения. Однако процесс плетения байт-кода производит более эффективный код времени выполнения, чем обычно достигается с помощью скомпилированного исходного кода плетения.
Разработки в AspectJ выявили потенциал для включения компиляции just-in-time в выполнение аспектно-ориентированного кода для удовлетворения требований производительности. [16] Во время выполнения , аспектный ткач может транслировать аспекты более эффективным образом, чем традиционные подходы статического плетения. При использовании AspectJ на виртуальной машине Java , динамическое плетение аспектов во время выполнения, как было показано, улучшает производительность кода на 26%. [17] В то время как некоторые реализации виртуальных машин just-in-time реализуют эту возможность через новую виртуальную машину, некоторые реализации могут быть спроектированы для использования функций, которые уже существуют в текущих виртуальных машинах. [18] [19] Требование новой виртуальной машины противоречит одной из первоначальных целей проектирования AspectJ. [5]
Для выполнения стыковки just-in-time необходимо изменение виртуальной машины , которая выполняет скомпилированный байт-код . Предлагаемое решение для AspectJ использует многоуровневый подход, который строится на существующей виртуальной машине Java для добавления поддержки управления точками соединения и обратных вызовов в динамический аспектно-ориентированный программный движок . [19] Альтернативная реализация использует движок стыковки, который использует точки останова для остановки выполнения в точке среза, выбора подходящего метода, встраивания его в приложение и продолжения. [20] Было показано, что использование точек останова таким образом снижает производительность из-за очень большого количества переключений контекста . [17]
Производительность аспектных ткачей, а также производительность кода, который они производят, были предметом анализа. Предпочтительно, чтобы улучшение модульности, предоставляемое аспектным ткачеством, не влияло на производительность во время выполнения. Аспектные ткачи могут выполнять оптимизацию, специфичную для аспектов. [21] В то время как традиционные оптимизации, такие как исключение неиспользуемых специальных переменных из аспектного кода, могут быть выполнены во время компиляции , некоторые оптимизации могут быть выполнены только аспектным ткачем. Например, AspectJ содержит два похожих, но различных ключевых слова, thisJoinPoint
, которое содержит информацию об этом конкретном экземпляре сплетенного кода, и thisJoinPointStaticPart
, которое содержит информацию, общую для всех экземпляров кода, относящихся к этому набору рекомендаций. Оптимизация замены thisJoinPoint
на более эффективное и статическое ключевое слово thisJoinPointStaticPart
может быть выполнена только аспектным ткачем. Выполняя эту замену, сплетенная программа избегает создания объекта точки соединения при каждом выполнении. [14] Исследования показали, что ненужное создание объектов точек соединения в AspectJ может привести к снижению производительности на 5% во время выполнения, в то время как снижение производительности составляет всего около 1%, когда этот объект не создается. [22]
Производительность времени компиляции в аспектных ткачах обычно хуже, чем у их традиционных аналогов-компиляторов из-за дополнительной работы, необходимой для поиска методов, соответствующих указанным pointcuts. Одно исследование показало, что компилятор AspectJ ajc примерно на 34% медленнее компилятора Sun Microsystems Java 1.3 и примерно на 62% медленнее компилятора Java 1.4 . [23]
{{cite book}}
: |journal=
проигнорировано ( помощь )