В настоящее время существует большое множество паттернов (design patterns) и методов для облегчения работы программиста. Шаблоны проектирования представляют собой общее архитектурное решение какой - то часто возникающей проблемы в рамках одного проекта [24].
Помимо полезных паттернов, действительно помогающих при написании программ, также существуют и антипаттерны (anti - patterns) - шаблоны, применение которых на первый взгляд может показаться полезным. На практике их использование приводит к появлению большого количества ошибок в коде, код становится малопонятным и нечитабельным. Антипаттерны, в отличие от шаблонов проектирования, представляют собой неправильное решение проблемы [20].
По классификации Уильяма Брауна с дополнениями Нейла и Лапланте, антипаттерны делятся на 4 типа [14, 15, 16]:
- антипаттерны разработки (development anti - patterns) - технические проблемы и решения, с которыми связаны программисты;
- архитектурные антипаттерны (architectural anti - patterns) - проблемы, связанные со структурой системы;
- организационные антипаттерны (managerial anti - patterns) - проблемы, за решение которых отвечают менеджеры или группы менеджеров;
- антипаттерны среды (environmental antipatterns) - проблемы, возникшие по вине доминирующей в организации структуры и социальной моделью, являющейся результатом действующей в организации общественной политики [14].
Один из методологических антипаттернов, относящийся к антипаттернам разработки, является программирование методом копирования-вставки. Программирование методом копирования и модификации существующих фрагментов кода приводит к тому, что на этапе тестирования возникают ошибки, которые трудно отыскать во множестве схожих участков кода. В итоге программисту требуется дополнительное время на отыскание и устранение ошибок, приведение кода в более понятный вид. Более подробно проблемы связанные с применением данного подхода, описаны в разделе 1.3.
Вместо того чтобы реализовать общее решение для схожих по структуре проблем, программисты довольно часто применяют copy-paste подход, который порождает большое количество схожих по структуре и функционалу фрагментов кода. Такие фрагменты принято называть клонами программного кода. По степени схожести фрагментов кода можно выделить три основных типа клонов (полные определения даны в разделе 1.1):
1. Клоны кода первого типа - это точная копия исходного кода без каких - либо изменений.
2. Клоны второго типа - это синтаксическая копия исходного кода с внесением изменений в имена или типы переменной, или идентификаторы функции.
3. Клоны кода третьего типа - в скопированном фрагменте кода вносятся изменения в команды, также программист может добавлять или удалять некоторые команды.
Первые два типа клонов можно отыскать с помощью методов лексического или синтаксического анализа. Клоны кода третьего типа могут отличаться своей реализацией, но иметь одинаковый смысл, поэтому для их поиска необходимо применять семантический анализ. Одним из методов,основанных на семантике, является векторная модель семантики (vector space model, VSM). Данная модель используется в информационном поиске для представления коллекции документов векторами из одного общего для всей коллекции векторного пространства. Векторная модель является основой для решения многих задач информационного поиска, таких как: поиск документа по запросу, классификация документов, кластеризация документов [21]. Применение данного метода для поиска семантически схожих участков кода позволит отыскать клоны кода всех трех типов.
Для создания качественного программного продукта необходимо проводить его анализ на наличие ошибок, в том числе, порождаемых при применении подхода copy-paste programming. Анализируя код на присутствие в нем клонов, можно не только сократить время на исправление ошибок исходного кода во фрагментах - клонах, но и улучшить внутреннюю структуру программы с помощью вынесения схожих по смыслу фрагментов.
Целью данной работы является разработка приложения, основанного на векторной модели семантики и способного отыскать клоны трехадресного кода всех трех типов, возникающих при применении подхода копирования- вставки и модификации исходного кода.
Для достижения данной цели были поставлены и реализованы следующие задачи:
1. Провести обзор существующих инструментальных средств, изучить алгоритмы их работы, выявить положительные и отрицательные качества продукта.
2. Изучить и разработать алгоритм, основанный на векторной модели семантики, проверить его эффективность и применимость для поиска клонов в трехадресном коде.
3. Реализовать приложение на основе предложенного алгоритма, проверить правильность и эффективность его работы.
В ходе проведения научного исследования была выявлена возможность построения анализатора кода, позволяющего находить клоны кода в трехадресном коде. В работе были рассмотрены типы клонов, алгоритмы их поиска, предложено и реализовано решение для отыскания клонов в трехадресном коде.
Применение векторной модели семантики для поиска схожих фрагментов подразумевает построение матрицы, на основе которой высчитывается мера схожести фрагментов. Стандартные матрицы VSM не позволяют достаточно полно описать структуру трехадресного кода для дальнейшего анализа. В связи с этим была разработана новая модель матрицы, в которой учитывается специфика трехадресного кода.
Также на основе VSM было предложено решение для предобработки трехадресного кода - разделение исходного графа программы на слабосвязные подграфы. В данном случае векторная модель семантики применялась для отыскания потенциальных клонов, что позволяет более точно найти клоны, затратив на поиск меньше времени.
По завершении достижения поставленных задач, была реализована цель магистерской работы - разработано приложение, основанное на векторной модели семантики, которое способного отыскать клоны трехадресного кода всех трех типов, возникающих при применении подхода копирования-вставки и модификации исходного кода.
1. Аллен, Э. Типичные ошибки проектирования [Текст] / Эрик Аллен; перевод А. Леонтьев. — Издательский дом «Питер», 2003. — 224 с. — ISBN 5-887827-304-6.
2. Ахо, А. Компиляторы. Принципы, технологии и инструментарий [Текст] / Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман; перевод Игорь Красиков. — Вильямс, 2016. — 1184 с. — ISBN 978-5-8459-1932-8.
3. Бабкина, А.А. Клоны кода, как следствие использования методологического антипаттерна «Copy-paste-programming» [Текст] / А.А. Бабкина, А.С. Кузнецов, В.В. Кукарцев, г. Красноярск // Компьютерные технологии и телекоммуникации - 2016: сб. тр. / Мин. обр. и науки РФ, Грозненский гос. нефтяной технич. ун. им. акад. М.Д. Миллионщикова, Фак. автоматизации и пр. информ. - Грозный, 2016. - С. 67-70.
4. Зельцер, Н.Г. Поиск повторяющихся фрагментов исходного кода при автоматическом рефакторинге [Текст] / Н.Г. Зельцер // Труды Института системного программирования РАН. - 2013. - №25. - С. 39 - 50.
5. Кристофидес, Н Теория графов. Алгоритмический подход [Текст] / Н. Кристофидес. - Мир, 1978. - 432 с.
6. Саргсян, С. Масштабируемый инструмент поиска клонов кода на основе семантического анализа программ [ТЕКСТ] /С. Саргсян, Ш. Курмангалеев, А. Белеванцев, А. Асланян, А. Балоян// Труды Института системного программирования РАН.- 2015. - Т. 27. - № 1. - С. 39-50.
7. Baker, B. A program for identifying duplicated code [Текст] / B. Baker // Computing Science and Statistics: 24th Symposium on the Interface. - 1992. - Т. 24. - С. 49-57.
8. Baker, B. On finding duplication and near-duplication in large software systems [Текст] / B. Baker // 2nd Working Conference on Reverse Engineering (WCRE). - 1995. - С. 86-95.
9. Baker, B. Parameterized pattern matching: Algorithms and applications [Текст] / B. Baker // Journal Computer System Science. - 1996. - Т. 52. - № 1. - С. 28-42.
10. Christopher, D. An Introduction to Information Retrieval [Текст] /Christopher D. Manning, Prabhakar Raghavan, Hinrich Schutze Draft // Cambridge University Press. - 2009. - С. 544 .
11. Jurafsky, D. Speech and Language Processing. An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition [Текст] / Daniel Jurafsky, James H. Martin // Second Edition. Pearson Education International. - 2009. - C. 1024 pp.
12. Ducasse, S. A language independent approach for detecting duplicated code [Текст] / S. Ducasse, M. Rieger, S. Demeyer. // 15th International Conference on Software Maintenance (ICSM). - 1999. - С. 109-119.
13. Li, Z.O. A metric space based software clone detection approach [Текст] / Z.O. Li, J. Sun // 2nd International Conference on Software Engineering and Data Mining. - 2010. - С. 111-116.
14. Maeda, K. Syntax sensitive and language independent detection of code clones [Текст] / K. Maeda // World Academy of Science, Engineering and Technology 60. - 2009. - С. 350-354.
15. Neill Antipatterns in Systems Engineering: An Opening Trio [Текст] / Neill, J. Colin // INCOSE International Symposium. - 2012. - Vol. 22, no. 1. - C.
1233-1245. - ISSN 2334-5837.
16. Pantel, P. Discovering word senses from text. In Proceedings of the Eighth [Текст] / P. Pantel, D. Lin // ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. - 2002. - C. 613-619.
17. Roy, C.K. An empirical study of function clones in open source software systems [Текст] / C.K. Roy, J.R. Cordy // 15th Working Conference on Reverse Engineering (WCRE). - 2008. - С. 81-90.
18. Wettel, R. Archeology of code duplication: Recovering duplication chains from small duplication fragments [Текст] / R. Wettel, R. Marinescu / 7th
International Symposium on Symbolic and Numeric Algorithms for Scientific Computing. - 2005.
19. Brown, William J. AntiPatterns and Patterns in Software Configuration Management. [Текст] / William J. Brown, W. Hays McCormick, W. Scott Thomas. // Wiley. - 1999. - ISBN 978-0-471-32929-9.
20. Антипаттерн, URL: https://ru.wikipedia.org/wiki/Антипаттерн
21. Векторная модель,
URL: https://ru.wikipedia.org/wiki/Векторная_модель
22. Документация по Visual Studio 2017,
URL: https://msdn.microsoft.com/ru-ru/library/hh205279.aspx
23. Программирование методом копирования-вставки,
URL: https://ru.wikipedia.org/wiki/Программирование_методом_копирования- вставки
24. Шаблон проектирования,
URL: https://ru.wikipedia.org/wiki/Шаблон_проектирования
25. CloneDr, URL: http://www.semdesigns.com/products/clone/
26. PMD, URL: https://pmd.github.io/