научная статья по теме ПОДХОД К РЕАЛИЗАЦИИ АСПЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ ДЛЯ ЯЗЫКА СИ Математика

Текст научной статьи на тему «ПОДХОД К РЕАЛИЗАЦИИ АСПЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ ДЛЯ ЯЗЫКА СИ»

ПРОГРАММИРОВАНИЕ, 2013, No 4, с. 47 65

ЯЗЫКИ И СИСТЕМЫ ПРОГРАММИРОВАНИЯ

У л :

ПОДХОД К РЕАЛИЗАЦИИ АСИЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

ДЛЯ ЯЗЫКА Си *

© 2013 г. Е.М. Новиков

Институт системного программирования РАН 109004 Москва, ул. А. Солженицына, 25 E-mail: novikov@ispras.ru Поступила в редакцию 12.12.2012

Данная статья описывает подход к реализации аспектно-орнентированного программирования (АОП) для языка программирования Си. Излагаются традиционные средства АОП для различных языков программирования, и показывается, как особенности языка Си и процесса сборки программ на данном языке влияют на реализацию АОП. Далее рассматриваются дополнительные требования, которые накладывает практическое применение реализации АОП для программ на языке Си. Приводится описание существующих решений и анализируется возможность их использования. В статье описывается инструмент, реализующий предложенный подход, и демонстрируются возможности его применения.

1. ВВЕДЕНИЕ

Аспектно-ориентированное программирование (АОП) возникло как ответ на вопрос о том, как "правильно" декомпозировать большую программу на модули. Одной из самых оригинальных и, вместе с тем, мощных идей о критериях декомпозиции была идея Д.Л. Парнаса выделять в отдельный модуль каждое проектное решение, особенно, если речь идет о сложных решениях, которые в будущем будут с высокой вероятностью пересматриваться [1]. Парнас показал, что традиционных средств обеспечения модульности часто достаточно, но иногда их явно не хватает - нужны дополнительные возможности. Среди отечественных специалистов примерно в то же время, в 70-х годах, этой же проблемой занимался А.Л. Фуксман, который говорил о необходимости ввести в практику программирования специальные конструкции для

* Работа поддержана ФЦП "Исследования и разработки по приоритетным направлениям развития научно-технологического комплекса России на 2007-2013 годы" (контракт № 07.514.11.4104).

"сосредоточенного описания рассредоточенных действий" [2]1.

Распространенные в настоящее время языки программирования, как правило, не поддерживают такие конструкции. Например, те виды модулей, которые имеются в процедурных или в объектно-ориентированных языках, помогают декомпозировать программную систему по принципу группировки функционально связанных компонентов и/или данных. Но есть и другие способы декомпозиции, которые могут в большей степени зависеть не от структуры реализации основной функциональности, а от архитектурных решений, направленных, например, на выполнение технологических задач. Соответствующая подобным задачам "дополнительная" функциональность получила название сквоз-

1 Заметим, что задача декомпозиции встает не только на фазе проектирования программы. В ходе жизненного цикла возникает потребность в "оснастке" проекта разработки некоторыми программными модулями, которые используются для целей отладки, мониторинга, оптимизации, анализа безопасности и т.д. Такие "модули", с одной стороны, не являются неотъемлемой частью программы, с другой стороны, общее решение задачи декомпозиции, должно включать в рассмотрение и эти модули тоже.

ной функциональности2 (англ. cross-cutting concerns).

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

В 90-е годы была предложена концепция аспектно-ориентированного программирования, которая предоставила специальный механизм для пополнения традиционных средств поддержки модульности в плане основной функциональности средствами поддержки модульности в плане сквозной функциональности. АОП расширяет возможности существующих языков программирования, органично дополняя их. Изначально АОП разрабатывалось для объектно-ориентированных языков программирования, в первую очередь, Java; однако, поддержка АОП может быть добавлена и для процедурных языков, таких как, например, Си.

Проект, в рамках которого выполнялась данная работа, посвящен разработке системы верификации драйверов операционной системы Linux LDV [10-13]. Возможности АОП рассматриваются в этом проекте, как основное средство для автоматического инструментирования программного кода драйверов перед выполнением собственно верификации. Драйверы операционных систем обычно пишутся на языке Си, при этом используется практически весь арсенал языковых возможностей. По этой причине было решено разрабатывать не узкоспециализированное средство инструментирования, а полноценную реализацию АОП, которая впоследствии может

2Более точно семантику данного понятия передает термин "пронизывающий", поскольку описание данной функциональности рассредоточивается по модулям программы, пронизывая их реализацию. Однако, в русскоязычной литературе достаточно устойчивым является термин "сквозная".

иметь и самостоятельную ценность. В связи с этим предлагаемые в данной статье возможности реализации АОП полезны для разнообразных Си-программ, но часть возможностей адресуется к специфике инструментирования кода компонентов ядра операционной системы Linux и драйверов этой системы, в частности. Соответственно, часть статьи посвящена АОП в целом и особенностям реализации АОП для языка Си, а другая часть посвящена деталям, обусловленным потребностями проекта LDV.

В разделе 2 данной статьи рассматриваются основные понятия аспектно-ориентированного программирования и приводятся поясняющие их примеры. Раздел 3 посвящен традиционным способам описания аспектов. В разделе 4 обсуждается влияние особенностей языка программирования Си на реализацию АОП. В разделе 5 рассматриваются требования к реализации АОП для языка Си, которые предъявляются проектом LDV. Раздел 6 описывает существующие реализации АОП для Си. Инструмент, который реализует предложенный подход к реализации АОП для языка программирования Си, представлен в разделе 7. Раздел 8 оценивает возможности практического применения разработанного инструмента и существующих реализаций АОП для Си. В разделе 9 подводятся итоги и рассматриваются направления дальнейшего развития.

2. ОСНОВНЫЕ ПОНЯТИЯ АОП

Одним из основных понятий аспектно-ориентированного программирования является точка соединения (англ. join point). Существуют различные определения данного понятия [3, 4, 8, 9, 14-16]. В данной статье под точкой соединения будет пониматься программная конструкция, которая может быть связана с описанием некоторой части сквозной функциональности программы. Типичными примерами точек соединения служат вызов функции и определение структуры.

Срез (англ. pointcut) - это описание набора точек соединения, логически объединенных по некоторому условию. Например, с помощью среза можно описать все вызовы функций выделения памяти (таких как malloc, calloc и т.д.).

Рис. 1. Пример аспекта АвресЬЛ, с помощью которого для графической системы выделена сквозная

функциональность ведения журнала.

// Аспект состоит из именованного среза и рекомендации. aspect Logging {

// Именованный срез задает соответствие точкам // соединения программы, вызовам методов. pointcut move():

call(void FigureElement.setXY(int,int)) || call(void Point.setX(int)) ||

call(void Point.setY(int)); // Рекомендация печатает сообщение на экран до // выполнения соответствующей данному именованному // срезу точки соединения программы. before(): move() {

System.out.println("about to move");

}

}

Еще одним понятием АОП является рекомендация (англ. advice). Посредством рекомендации задается набор действий, которые должны быть выполнены для точек соединения, описанных срезом3. Например, для такой точки соединения, как вызов функции, в рекомендации могут быть записаны инструкции по выводу в журнал сообщения, содержащего значение, которое возвращает данная функция.

Посредством срезов и рекомендаций АОП позволяет выделить описание части сквозной функциональности программы в отдельные модули, так называемые аспекты4 (англ. aspect). Далее в данном разделе будет приведен пример аспекта и рассмотрено, каким образом можно задавать срезы и рекомендации.

Помимо возможности описания части сквозной функциональности в виде аспектов АОП предполагает средства для автоматического связывания аспектов с целевой программой. По сути, данный процесс заключается в том, что для некоторого представления кода5 программы

3Точнее говоря, некоторым образом должно быть выполнено обрамление или "декорирование" соответствующих точек соединения соответствующим кодом, который может содержать как инструкции, так и некоторые описания, декларации.

4 Здесь термин "аспект" имеет узкотехническое значение, которое используется только в литературе по АОП.

5Забегая вперед отметим, что различные виды обра-

идет поиск соответствия потенциальных точек соединения заданным в аспекте срезам. При обнаружении такого соответствия и наличии рекомендации для данного среза происходит обрамление точки соединения тем кодом, который задан в рекомендации. Поскольку процесс связывания аспектов с целевой программой имеет определенное сходство со стандартной компоновкой (англ. linkage) программ мы будем называть данный процесс аспектной компоновкой6.

Чтобы реализовать аспектно-ориентированный подход программирования для некоторого языка программирования необходимо определить способы описания аспектов и разработать аспектный компоновщик. В настоящее время существует достаточно большое количество реализаций АОП для различных языков программирования: AspectJ [4] для Java, AspectC++ [8] для Си++, Aspect.NET [9] для Microsoft.NET, АСС [14, 151, Inter Aspect [16] и SLIC [18] для Си и т.д. В качестве примера рассмотрим AspectJ, одну из самых передовых и известных реализаций А

Для дальнейшего прочтения статьи необходимо приобрести полный текст. Статьи высылаются в формате PDF на указанную при оплате почту. Время доставки составляет менее 10 минут. Стоимость одной статьи — 150 рублей.

Показать целиком