Научная статья на тему 'Алгебраические модели иерархий типов для проектирования и рефакторинга'

Алгебраические модели иерархий типов для проектирования и рефакторинга Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
194
86
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ИЕРАРХИЯ ТИПОВ / TYPE HIERARCHY / АЛГЕБРАИЧЕСКАЯ СИСТЕМА / ALGEBRAIC SYSTEM / ПРОЕКТИРОВАНИЕ / DESIGN / РЕФАКТОРИНГ / REFACTORING

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Махортов С. Д., Шурлин М. Д.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

ALGEBRAIC MODELS OF TYPES HIERARCHY FOR DESIGN AND REFACTORING

Algebraic methods are useful while designing and refactoring object-oriented information systems. Such methods could be used li.e a basis for source code verification and optimization processes. This paper considers.ind of lattice-based algebraic structures that describe object-oriented programming type hierarchy. The article deals with the following properties of these structures: closure, transformation equivalency, existence of logical reduction. Described methodology aims at type hierarchy verification and refactoring. One of the refactoring main goals is the automatic reducing of source code redundancy.

Текст научной работы на тему «Алгебраические модели иерархий типов для проектирования и рефакторинга»

УДК 004

АЛГЕБРАИЧЕСКИЕ МОДЕЛИ ИЕРАРХИЙ ТИПОВ ДЛЯ ПРОЕКТИРОВАНИЯ И РЕФАКТОРИНГА

С.Д. Махортов1, М.Д. Шурлин2

Воронежский государственный университет

1з1@ехре11.угп.ги

2тзЬиг1ш @£>таИ. сот

Аннотация

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

Ключевые слова: иерархия типов, алгебраическая система, проектирование, рефакторинг.

Введение

Алгебраические системы предоставляют основу формальных исследований компьютерных программ в различных парадигмах [1-2]. Это относится и к логическому программированию, включая широко распространенные на практике системы продукционного типа [3]. В ряде работ (см. [4] и библиографию в ней) была предложена методология алгебраизации продукционно-логических систем на основе бинарных отношений и решеток. Получены теоретические результаты для обоснования эквивалентных преобразований, верификации и оптимизации таких систем. Решетка с заданным на ней дополнительным продукционным отношением названа LP-структурой (lattice production structure).

Исследования показали применимость данной методологии в различных областях теории программирования. В работе [5] впервые установлено, что отношения обобщения и агрегации типов обладают свойствами продукционно-логического вывода. В результате построен класс LP-структур для моделирования иерархий типов в целях рефакторинга - модернизации кода. В этой модели в LP-структуре из решеточных операций в качестве основной использовалась лишь операция объединения. Данное обстоятельство ограничило возможности теории формализацией единственного метода рефакторинга - поднятия общих атрибутов (общий обзор известных методов содержится в [6, 7]). Статья [8] развивает теорию LP-структур для иерархий типов. В результате «инвертирования» модели [5] получен новый метод рефакторинга. Суть данного метода, не упоминающегося в классическом перечне рефакторингов [6], состоит в замене нескольких атрибутов класса их общим потомком (совмещение атрибутов).

Настоящая работа посвящена алгебраической модели, объединяющей функциональность моделей [5] и [8]. Для нового вида LP-структур рассматривается стандартный круг вопросов: логическое замыкание, его архитектура, эквивалентные преобразования, логическая редукция и способ ее построения. Представленные результаты расширяют возможности исследования и модернизации иерархий типов.

Решение родственных задач алгебраическими методами анализа формальных понятий (FCA) представлены в [9], где элементам определенного множества классов предлагается в некотором смысле оптимально назначить наборы атрибутов - элементов другого независимого множества. В соответствии с выбранными назначениями формируется иерархия классов. В постановке, которая рассматривается авторами настоящей работы, в отличие от [9], атрибуты сами относятся к исследуемой иерархии классов (типов), что усложняет задачу и не оставляет возможности непосредственного применения методов FCA.

В разделе 1 работы приводятся необходимые базовые сведения из теории бинарных отношений и математических решеток. Основная часть раздела содержит предварительное обсуждение рассматриваемых задач на конкретных примерах, а также их приложений. Данное обсуждение служит иллюстрацией и отправной точкой для определения LP-cтpyктypы в разделе 2, где формулируются основные теоретические результаты. Их доказательства планируются к опубликованию в математическом издании. Тем не менее, ввиду двойственности построенной модели по отношению к рассмотренной в работе [5], общее представление о методике доказательств может быть получено в [5].

В разделе 3 обсуждаются вопросы компьютерной реализации LP-cтpyктyp на решетках типов, включая оценки вычислительной сложности решаемых задач.

1 Обозначения и решаемые задачи

Необходимые для чтения статьи сведения о решетках содержатся в [10]. Решеткой называется частично упорядоченное множество ¥, в котором наряду с отношением < («не больше», «содержится») определены также две двуместные операции л («пересечение») и V («объединение»), вычисляющие соответственно точную нижнюю и верхнюю грани любой пары а, Ь £ ¥. Решетка называется ограниченной, если она содержит общие верхнюю и нижнюю грани - такие два элемента О, I, что О < а < I для любого а £ ¥.

Рассмотрим иерархию типов ¥ в объектно-ориентированной программной системе. Между парами типов могут существовать как минимум два вида связей - наследование и агрегация [6].

Отношение наследования порождает на ¥ частичный порядок: если тип Ь - потомок а (соответственно а - предок Ь), то Ь < а. Требуется, чтобы для любых а, Ь е ¥ были определены две «решеточные» операции: пересечение а л Ь - наибольший общий потомок; объединение а V Ь - наименьший общий предок а, Ь.

На решетке ¥ рассмотрим второе, соответствующее агрегации, отношение Я: если экземпляр типа а в качестве атрибута содержится в определении типа Ь, то (Ь, а)еЯ. Оба отношения (< и Я) имеют общую семантику: в каждом случае, Ь < а или(Ь, а)еЯ, тип Ь получает возможности типа а в виде доступа к его атрибутам. Ясно, что это общее отношение «обладания набором возможностей» (обозначим его — ) обязано быть рефлексивным и транзитивным. Обсудим другие свойства введенных отношений.

Пусть для элементов а, Ьи Ь2 £ ¥ справедливо Ь1 < а, Ь2< а. Тогда по определению решетки [9] имеем Ь]Ь2< а. Это естественное для отношения < свойство (согласно [4]) называется v-диcтpибyтивнocтью. Посмотрим, что будет означать обладание этим же свойством

Я г Я г Я 11

для отношения <-. Пусть Ь\ <-а и Ь2<-а, то есть каждому типу Ь\ и Ь2 доступны

возможности типа а. Тогда в силу предполагаемой v-диcтpибyтивнocти имеем Ь\Ь2— а. Последнее означает, что тип Ь]Ь2 также обладает возможностями типа а. С точки зрения проектирования типов это не обязательно. Однако, если более одного типа-наследника (в данном случае - Ь1 и Ь2) содержат одинаковые атрибуты, то, согласно принципу рефакторинга [6], целесообразно «поднять» общие атрибуты, то есть поместить один такой атрибут в об-

щий тип-предок Ь1Ь2, после чего каждый Ь1 и Ь2 получит возможности а в порядке наследования. В рассмотренной ситуации v-диcтpибyтивнocть отношения — содержит решение актуальной задачи - устранение дублирования кода.

Указанное свойство исследовано в работе [5]. В частности, показано, что отношение

—, обладая свойством транзитивности вне зависимости от контекста, не может во всех ситуациях удовлетворять свойству v-диcтpибyтивнocти, иначе это приведет к некорректным результатам. Продемонстрируем отмеченное обстоятельство на примерах.

I. К К

Пример 1. Для иллюстрации рассмотрим пример: Ь <-а и а <-а. При

v-диcтpибyтивнocти — выполнялось бы Ьа— а. Согласно принципам объектно-ориентированного программирования, тип Ьыа не имеет права что-либо знать о своих наследниках. По этой причине в данной ситуации Ь^а, являясь общим предком типов а и Ь, может обладать возможностями типа а лишь в случае, если он совпадает с а (то есть Ь < а). В остальных вариантах соотношение Ьа<-а окажется некорректным.

Пример 2. Существуют ситуации, когда выполнение v-диcтpибyтивнocти отношения — теоретически возможно, однако нецелесообразно с точки зрения качества кода. Пусть при Ь1 — а, Ь2— а элементы Ь1Ь2 и а имеют непустое пресечение: (Ь1Ь2)а=Сф0, причем С< Ь1Ь2 и сС<а. Если в данном случае допустить (Ь1Ь2, а)е — то окажется, что тип С обладает возможностями типа а одновременно по двум линиям, а именно - как его потомок и как потомок типа Ь1Ь2, также имеющего возможности а. Недостаток такого кода состоит в его избыточности -разрыв связи С< а (при а Ф I) не приведет к потере функциональности системы типов.

Пример 3. Другая подобная ситуация - наличие конфликта. Пусть имеет место (Ь1,а),(Ь^,а),(Ь3,а)^Я, причем элементы Ь1, Ь2, Ьз, ЬЬ2, Ь2Ьз попарно различны и (Ь1Ь2)(Ь^Ь3)=Ь2. Тогда пары (Ь1уа),(Ь2,а) «конфликтуют» с парами (Ь2,а),(Ь3,а): если в обоих случаях «поднять» атрибуты, то тип Ь2 унаследует атрибут типа а одновременно от двух различных предков - Ь1Ь2 и Ь2Ь3, что также ухудшит код.

В работе [5] формально описаны ситуации подобных коллизий и построена ЬР-структура с ограниченным свойством v-диcтpибyтивнocти. Данное свойство сохраняется лишь для v-диcтpибyтивныx и так называемых неконфликтных в К троек (Ь1; Ь2, а) элементов решетки. Принятая стратегия предполагает отказ от «поднятия» общих атрибутов при наличии описанных ситуаций (невыполнение v-диcтpибyтивнocти).

Как известно, в основанных на решетках алгебраических системах операции объединения и пересечения порождают двойственные свойства (например, законы де Моргана). Подобная закономерность имеет место и в стандартных ЬР-структурах [4], где наряду с v-диcтpибyтивнocтью бинарных отношений рассмотрено симметричное свойство - л-дистрибутивность. Выясним, что означает свойство л-дистрибутивности применительно к отношению — .

Предположим, что для элементов а1,а^,Ь&Р выполнено Ь < а1г Ь < а2. Тогда по определению решетки справедливо Ь < а1а2. Такое свойство частичного порядка < на решетке называется л-дистрибутивностью [4]. Распространим его на отношение ^-— . Пусть Ь^к— а1 и Ь — а2, то есть тип Ь обладает возможностями типов а1 и а2. В силу предполагаемой л-дистрибутивности получим Ь — а1а2. Таким образом, тип Ь также обладает возможностями типа а1а2. Как и выше, с точки зрения проектирования типов последнее соотношение обязательным не является. Его семантика такова: если тип имеет два или более различных атрибута, то эти атрибуты можно заменить единственным атрибутом, относящимся к ближайшему общему потомку типов исходных атрибутов. Нетрудно увидеть, что такая реорганизация делает определение типа-контейнера более компактным с сохранением его функциональности.

Данный метод рефакторннга был назван «совмещением атрибутов» [8]. Он применим лишь для иерархий типов с множественным наследованием, однако его актуальность оправдана популярностью языка С++.

Выясним далее вопрос о том, насколько в данной алгебраической модели типов свойство л-дистрибутивности отношения — универсально, и не окажутся ли его ограничения двойственными по отношению к описанным выше ограничениям v-диcтpибyтивнocти.

Пример 4. Для иллюстрации рассмотрим случай двойственности по отношению к примеру

1: Ь <-а и Ь Ь. При л-дистрибутивности отношения <- должно быть выполнено

Ь — Ьа. Аналогично исходному примеру 1, тип Ь не имеет права что-либо знать о своем типе-наследнике Ьла. По этой причине тип Ь, являясь предком типа Ьла, может обладать его возможностями лишь в случае Ь < а, иначе соотношение Ь— Ьа окажется некорректным.

Пример 5. Пусть при Ь— а;, Ь— а2 элементы Ь и а;а2 имеют объединение Ь(а1а2)=Сф1, причем Ь<С и а;а2<ог. Если в данном случае допустить (Ь, а;а2)^Я, то окажется, что тип Ь обладает возможностями другого типа С одновременно по двум линиям, а именно -и как его потомок, и как контейнер типа а;а2, также имеющего возможности С в порядке наследования. Недостатки такого кода (подобно примеру 2) заключаются в его избыточности -разрыв связи а;а2<Сне приведет к потере функциональности системы типов.

Пример 6. Рассмотрим конфликтную ситуацию, двойственную по отношению к примеру 3. Пусть (Ь, а;), (Ь, а2), (Ь, а3)^Я, причем элементы а;, а2, а3, а;а2, а2а3 попарно различны и (а;а2)(а2а3)=а2. Тогда пары (Ь, а;), (Ь, а2) «конфликтуют» с парами (Ь, а2), (Ь, а3). Этот факт означает, что если в обоих случаях совместить атрибуты (применив свойство л-дистрибутивности), то тип Ь получит возможности типа а2 одновременно посредством двух атрибутов - аа2 и а2а3, что также ухудшит код.

В работе [8] формально описаны ситуации, в которых отношение — не сохраняет свойство л-дистрибутивности, и построена ЬР-структура с его ограничением. Данное свойство выполняется только для л-дистрибутивных и так называемых неконфликтных в Я троек (Ь, аа2) элементов решетки. Принятая стратегия предполагает отказ от «совмещения» общих атрибутов при наличии описанных ситуаций (невыполнение л-дистрибутивности). Теоретически возможны и другие подходы, более тонко учитывающие особенности конкретных систем.

Анализируя примеры 4-6 в сравнении с соответствующими примерами 1-3, нетрудно прийти к выводу о двойственном характере ограничений свойств л-дистрибутивности и v-диcтpибyтивнocти отношения —, которые необходимы для адекватного моделирования иерархий типов. Отмеченный факт служит подтверждением естественности разрабатываемых алгебраических моделей, и, в частности, вводимых ограничений дистрибутивности.

Заметим, что с помощью ЬР-структур рассматривается некоторая обобщенная постановка задач «распределения возможностей» между типами. Варианты, когда типы по каким-либо практическим соображениям содержат в виде атрибутов представителей одних и тех же типов с различными идентификаторами, в расчет не принимаются. На практике тип может содержать много атрибутов, но не все они одинаково существенны при построении иерархии. Кроме того, алгебраические модели в большей степени предназначены для автоматизированного рефакторинга, чем автоматического, то есть окончательное решение о конкретных преобразованиях типов остается за программистом.

2 Основные результаты

На основе представленных выше соображений в данном разделе определяется понятие логического бинарного отношения на ограниченной решетке. Оно отражает свойство «обладания набором возможностей» в иерархии типов.

Логическое замыкание произвольного бинарного отношения на решетке предоставляет все такие пары (Ь, а), что в типе Ь доступны возможности типа а. Решив задачу построения логического замыкания, можно автоматизировать верификацию системы типов. К таким задачам, в частности, относится исследование ЬР-структуры на наличие циклов. Исходя из предметной области, можно также формулировать правила, которым должна удовлетворять система типов, и контролировать их выполнение. Например, возможна проверка системы на наличие необходимых или отсутствие запрещенных логических связей.

Логическая редукция строит иерархию с минимальным эквивалентным набором связей. В моделируемой системе типов данное преобразование соответствует автоматическому применению упомянутых выше двух методов рефакторинга.

Определение 1. Бинарное отношение на решетке называется ограниченно дистрибутивным, если оно ограниченно v-диcтpибyтивнo [5] и ограниченно л-дистрибутивно [8].

Определение 2. Отношение называется логическим, если оно содержит <, транзитивно и ограниченно дистрибутивно. Логическим замыканием Я называется наименьшее логическое отношение, содержащее Я.

Два отношения Я; и Я2, определенные на общей решетке, называются эквивалентными, если их логические замыкания совпадают. Логической редукцией отношения Я называется минимальное эквивалентное ему отношение Я0. При этом не требуется вложения Я0 ^ Я. Можно говорить о некотором отношении Я0 как логической редукции вообще, не относя этот факт к какому-либо другому отношению Я. Это означает, что при изъятии любой пары «меньшее» отношение не будет эквивалентно Я0.

Теорема 1. Для произвольного бинарного отношения Я на решетке логическое замыкание существует.

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

добавление пары (Ь;Ь2, а), если тройка (Ь;,Ь2, а) v-диcтpибyтивнa и неконфликтна в Я; добавление пары (Ь, аа), если тройка (Ь, а1,а2) л-дистрибутивна и неконфликтна в Я; добавление или исключение пары (Ь,а) при наличии пар (Ь, с),(с, а) е (Я^<), где а,Ь,с попарно различны.

В [4] и других работах для стандартных структур показано, что логическое замыкание отношения Я совпадает с транзитивным замыканием другого отношения К з Я, построенного в виде некоторого многообразия над Я. Этот факт позволяет свести ряд вопросов, касающихся логических отношений, к соответствующим проблемам транзитивных отношений. В частности, построение логического замыкания или редукции можно осуществить с помощью быстрых алгоритмов (типа Уоршолла) [11]. В рамках модели, основанной на ограниченной дистрибутивности, также удается разделить процесс построения логического замыкания на этапы дистрибутивного и транзитивного замыканий.

Для отношения Я на решетке рассмотрим отношение К, построенное последовательным выполнением следующих шагов:

для каждой неконфликтной v-диcтpибyтивнoй тройки (Ь;, Ь2, а)(Ь;фЬ2) добавить к исходному отношению пару (Ь1Ь2, а);

для каждой неконфликтной л-дистрибутивной тройки (Ь, а2)(а;фа2) добавить к исходному отношению пару(Ь, а;а2);

к полученному отношению добавить отношение <.

Заметим, что по теореме 2 отношение Я эквивалентно Я.

Теорема 3. Логическое замыкание отношения Я совпадает с транзитивным замыканием К * соответствующего отношения Я.

Изучен вопрос о существовании и построении логической редукции ЬР-структур на решетках типов. Справедлива следующая теорема.

Теорема 4. Пусть для отношения Я построено соответствующее отношение Я. Тогда, если для Я существует транзитивная редукция Я0, то отношение Я0, полученное исключением из Я0 всех пар вида Ь < а, представляет собой логическую редукцию исходного отношения Я.

3 Вопросы реализации

Кратко обсудим некоторые вопросы практической реализации рассмотренных выше ЬР-структур и, соответственно, вычислительной сложности построения их логического замыкания и редукции. Настоящая работа в основном посвящена теоретическим результатам обоснования решения этих задач. Создание готовых к реализации оптимальных алгоритмов может служить предметом отдельной статьи. Однако краткое обсуждение алгоритмических вопросов поможет составить общее представление о практической применимости теории ЬР-структур на решетках типов.

Заметим, что разработка алгоритмов на абстрактных решетках и получение оценок их сложности в общем случае не приносят оптимистичных результатов. Например, популярный вид решетки булеан при количестве атомов п состоит из 2п различных элементов, со всеми вытекающими «алгоритмическими последствиями».

Для общих решеток разработаны методы их представления деревьями и битовыми векторами [12]. В частности, булеан может быть представлен множеством битовых векторов размерности п. Каждому атому решетки соответствует вектор с одной единицей в соответствующей позиции и остальными нулями. Вычисление решеточных операций сводится к вычислению побитовых логических операций сложения и умножения над компонентами векторов. Нельзя сказать, что операция над двумя векторами будет выполняться за константное время, поскольку разрядность компьютера (например, 32 или 64) может оказаться недостаточной для представления битового вектора единственным словом памяти. Тем не менее, сложность операции п / 32 или п / 64 приемлема при общем количестве элементов решетки 2п.

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

Теорема 5. Задачи нахождения логического замыкания и логической редукции ЬР-структуры на решетке типов решаются за полиномиальное время, не превышающее С^Л6), где N - общее число элементов решетки.

Заключение

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

Список источников

[1] Подловченко Р.И. Иерархия моделей программ // Программирование. 1981. № 2. - С. 3-14.

[2] Замулии A.B. Алгебраическая семантика императивного языка программирования // Программирование. 2003. № 6. - С. 51-64.

[3] Davis R., King J. An overview of production systems // Machine Intelligence. - Chichester : Ellis Horwood Limited, 1977. Vol. 8. - P. 300-332.

[4] Махортов С.Д., Подвальный С.Л. Алгебраический подход к исследованию и оптимизации баз знаний продукционного типа // Информационные технологии. 2008. № 8. - C. 55-60.

[5] Махортов С. Д. LP-структуры на решетках типов и некоторые задачи рефакторинга // Программирование.

2009. Т. 35. № 4. - С. 5-14.

[6] Фаулер М. Рефакторинг: улучшение существующего кода : пер. с англ. - СПб. : Символ-Плюс, 2004.

[7] Mens T., Tourw'e T. A Survey of Software Refactoring // IEEE Trans. on Software Engineering. 2004. Feb. Vol. 30(2). - P. 126-139.

[8] Махортов С. Д. LP-структуры для обоснования и автоматизации рефакторинга // Программная инженерия.

2010. № 2. - С. 13-25.

[9] Godin R., Valtchev P. Formal Concept Analysis-Based Class Hierarchy Design in Object-Oriented Software Development // Formal Concept Analysis/ Eds. B. Ganter, G. Stumme, R. Wille // LNCS. V. 3626. - BerlinHeidelberg: Springer-Verlag, 2005. - P. 304-323.

[10] Биркгоф Г. Теория решеток : Пер. с англ. - М.: Наука, 1984.

[11] Aho A.V., Garey M.R., Ulman J.D. The transitive reduction of a directed graph // SIAM J. Computing. 1972 1 : 2. - P. 131-137.

[12] Halib M., Nourine L. Bit-vector encoding for partially ordered sets // LCNS. V. 831. - Berlin-Heidelberg: SpringerVerlag, 1994. - P. 1-12.

Сведения об авторах

Махортов Сергей Дмитриевич, 1958 г. рождения. Окончил Воронежский государственный университет (1980), д. ф.-м. н. (2010, МГУ). Заведующий кафедрой Математического Обеспечения ЭВМ Воронежского государственного университета. Член редколлегий журналов «Программная инженерия», «Вестник ВГУ. Серия системный анализ и информационные технологии», включенных в перечень ВАК, член диссертационного совета Д 212.038.24, председатель Воронежского регионального отделения Российской ассоциации искусственного интеллекта, рецензент IEEE "Transactions on Knowledge and Data Engineering". Sergey D. Makhortov(b. 1958) graduated from the Voronezh State University (1980), D. of Phys.-Math. Sc. (2010, MSU). Head of Department of Applied and System Software at Voronezh State University. Reviewer for IEEE Transactions on Knowledge and Data Engineering, member of editorial boards of the journals "Software Engineering" and "Proceedings of Voronezh State University. Ser. Systems analysis and information technologies", head of Voronezh Regional Division of the Russian Association for Artificial Intelligence, member of the Dissertation Council D 212.038.24.

Шурлин Максим Дмитриевич, 1987 г. рождения. Окончил Воронежский государственный университет (2009). Преподаватель кафедры Математического обеспечения ЭВМ Воронежского государственного университета, ведущий разработчик компании Murano Software.

Maxim D. Shurlin (b. 1987) graduated from the Voronezh State University (2009). Holding a part-time position of lecturer at Applied and System Software department at Voronezh State University. Senior .NET developer at Murano Software, Inc.

i Надоели баннеры? Вы всегда можете отключить рекламу.