Реферат по теме выпускной работы
Содержание
Введение
Современные программные системы становятся всё более сложными, а стоимость ошибок в программном коде — всё выше. Несмотря на развитие технологий тестирования и отладки, значительное количество багов остаются невыявленными до стадии эксплуатации, что приводит к существенным временным и финансовым затратам. В этой связи растёт интерес к интеллектуальным методам автоматизации поиска и исправления ошибок, в частности — к применению нейросетевых моделей, которые способны анализировать программный код, выявлять дефекты и предлагать корректировки.
Разработка таких моделей особенно актуальна в условиях стремительного роста кода с открытым исходным текстом и многообразия языков программирования [1]. Интеграция нейронных сетей в процессы разработки программного обеспечения может существенно повысить производительность труда программистов и надёжность создаваемых продуктов [2].
Целью исследования является разработка и исследование модели на основе нейронных сетей, способной автоматически находить и исправлять ошибки в программном коде на популярных языках программирования. В рамках поставленной задачи предполагается, что на вход модели подаётся фрагмент исходного кода, содержащий потенциальную ошибку, а на выходе формируется исправленная версия кода, соответствующая синтаксису и логике исходного языка [1-3].
Основные задачи исследования включают анализ существующих методов автоматического обнаружения и исправления ошибок в программном коде, изучение подходов к применению нейронных сетей в области программного анализа, разработку архитектуры модели нейронной сети, адаптированной для задачи исправления ошибок, реализацию прототипа модели и оценку её точности и эффективности .
Объектом исследования выступают процессы автоматического анализа и исправления ошибок в программном коде, а предметом исследования — методы и модели машинного обучения, в частности нейронные сети, применяемые для поиска и устранения ошибок в исходном коде [4-5].
Научная новизна работы заключается в разработке универсальной модели нейронной сети, способной автоматически находить и исправлять ошибки в программном коде, написанном на различных языках. В отличие от существующих решений, модель ориентирована не только на синтаксические ошибки, но и на логические дефекты, что расширяет сферу её применения.
Практическая значимость исследования состоит в том, что разработанная модель может быть интегрирована в системы автоматизированного тестирования и анализа программного кода, значительно снижая трудозатраты на отладку, повышая надёжность программ и ускоряя их вывод на рынок. Модель может быть использована в средах разработки (IDE) и платформах с открытым исходным кодом для автоматической проверки и корректировки внесённых изменений.
1 Анализ современных подходов к автоматическому обнаружению и исправлению ошибок в программном коде
1.1 Понятие ошибок в программном коде и их классификация
Разработка программного обеспечения представляет собой сложный и многоэтапный процесс, включающий проектирование, реализацию, тестирование и сопровождение. На каждом из этих этапов могут возникать ошибки, приводящие к отклонению поведения программы от ожидаемого. Такие отклонения принято называть ошибками или багами.
Ошибки в коде являются одной из главных причин сбоев, уязвимостей и нестабильности программных систем. Согласно статистике, устранение ошибок после развертывания системы обходится в десятки раз дороже, чем их устранение на ранних стадиях разработки. Более того, в критичных областях (авионика, медицина, финансовые системы) наличие даже одной ошибки может привести к катастрофическим последствиям.
Под ошибкой в программировании понимается любое действие разработчика, результат которого приводит к тому, что программа не выполняет требуемую функцию, выполняет её ненадлежащим образом, выполняет ненадлежащие действия, не предусмотренные спецификацией, или прекращает выполнение [10]. Ошибки могут быть как очевидными, так и скрытыми, проявляющимися только при определённой комбинации входных данных.
В рамках исследования принята классификация ошибок на синтаксические, семантические, логические и ошибки времени выполнения[12-15]. Синтаксические ошибки связаны с нарушением правил грамматики языка программирования и обычно выявляются на этапе компиляции. Семантические ошибки возникают, когда синтаксис программы корректен, но логика её выполнения не соответствует ожидаемому поведению. Логические ошибки являются наиболее опасной категорией багов, поскольку программа может выполняться без сбоев, но результат её работы будет неправильным. Ошибки времени выполнения проявляются только в процессе выполнения программы.
1.2 Обзор существующих подходов к поиску и исправлению ошибок
Для автоматизации поиска и устранения ошибок в программном коде разработано множество инструментов и методов, которые можно условно разделить на четыре основные категории: статический анализ, динамический анализ, символьное исполнение и тестирование с генерацией входных данных (fuzzing) [7, 8, 12].
Статический анализ представляет собой метод анализа исходного кода без его выполнения. Он проводится на уровне исходного текста программы или промежуточного представления и позволяет выявить широкий спектр ошибок на раннем этапе разработки. К числу наиболее распространённых статических анализаторов относятся SonarQube, FindBugs, Pylint и ESLint. Статический анализ эффективен при обнаружении синтаксических и семантических ошибок, нарушений соглашений о стиле, дублирования кода и потенциальных уязвимостей.
Динамический анализ проводится в процессе выполнения программы. Он позволяет наблюдать поведение приложения при различных входных данных, отслеживать ресурсы, выявлять ошибки времени выполнения и проблемы, связанные с использованием памяти. Типичные инструменты динамического анализа включают Valgrind, Purify и AddressSanitizer. Динамический анализ особенно полезен для обнаружения багов, связанных с памятью, параллельным выполнением, утечками ресурсов.
Символьное исполнение представляет собой метод анализа кода, при котором вместо конкретных значений переменных используется символическое представление. Программа анализируется как множество логических выражений, описывающих возможные пути её выполнения при различных входных данных. Одним из наиболее известных инструментов, реализующих этот подход, является KLEE. Символьное исполнение позволяет выявлять ошибки, которые возникают только при определённых комбинациях входных данных или условиях ветвлений.
Fuzzing — это техника автоматического тестирования, при которой программа многократно запускается с различными, часто случайно или полурандомно сгенерированными входными данными, с целью выявления сбоев, зависаний или нарушений безопасности. Примеры инструментов включают AFL, libFuzzer и Honggfuzz. Преимущество fuzzing-подхода заключается в его простоте и эффективности при поиске неочевидных уязвимостей.
Все описанные методы активно используются в промышленности и научных исследованиях, однако у них есть одно общее ограничение — они в основном ориентированы на диагностику ошибок, но не на их исправление. При выявлении дефекта требуется вмешательство человека, который анализирует отчёт и вручную вносит изменения в код.
1.3 Роль и возможности нейросетевых моделей в задачах поиска и исправления ошибок
С развитием методов машинного обучения и особенно глубоких нейросетевых архитектур появилась возможность рассматривать программный код не просто как формальный текст, а как сложную структуру, поддающуюся семантическому анализу. Современные модели способны не только анализировать код на предмет ошибок, но и предлагать исправления, подражая логике действий опытного программиста.
Одним из ключевых преимуществ применения нейросетей к анализу кода является способность учитывать контекст. Традиционные методы анализа ориентированы на жёсткие правила и шаблоны, в то время как нейронные сети способны выявлять закономерности в структурах кода, обучаясь на больших выборках. Такой подход особенно эффективен для обнаружения логических и семантических ошибок, которые слабо поддаются формализации.
Для обработки программного кода применяются архитектуры, изначально разработанные для обработки естественного языка[12-14]. К наиболее распространённым относятся рекуррентные нейронные сети (RNN), двунаправленные модели (BiRNN) и особенно трансформерные архитектуры, такие как BERT, GPT, T5 и их адаптации к исходному коду: CodeBERT, CodeT5, GraphCodeBERT, PolyCoder, AlphaCode и другие.
Примером раннего успешного применения нейросетей стала модель DeepFix, предложенная исследователями из Индийского технологического института в 2016 году. Она использовала рекуррентную нейронную сеть для исправления синтаксических ошибок в коде на языке C. Модель принимала некорректный фрагмент программы на вход и генерировала исправленную версию, минимизируя расстояние Левенштейна до эталонного кода.
Дальнейшие исследования сфокусировались на более сложных задачах, таких как обнаружение багов и предложение патчей для исправления. Так, модель CoCoNut использует контекстное представление кода и специализированные слои внимания, что позволяет ей эффективно находить и исправлять ошибки в коде на Java. Модель CodeBERT, разработанная Microsoft Research, представляет собой адаптацию архитектуры BERT для двуязычных пар: программный код и естественный язык.
Особую категорию представляют графовые модели, такие как GraphCodeBERT, в которых дополнительно учитываются структурные связи между элементами кода — например, узлы и рёбра в дереве разбора (AST)[13-17]. Это позволяет модели лучше понимать структуру программы, что критично для выявления сложных логических ошибок.В рамках предварительного исследования [14] также была подтверждена эффективность нейросетевых подходов для анализа контекстных зависимостей в коде.
Нейросетевые подходы находят применение не только в академических исследованиях, но и в промышленности. Так, в редакторах Visual Studio Code, PyCharm, IntelliJ IDEA уже интегрированы механизмы интеллектуального автодополнения и исправления ошибок, частично основанные на машинном обучении. Примером может служить GitHub Copilot, работающий на базе модели OpenAI Codex, который способен предсказывать целые фрагменты кода и выявлять потенциальные дефекты ещё до компиляции.
1.4 Преимущества и ограничения нейросетевых подходов
Применение нейросетевых моделей для анализа и исправления ошибок в программном коде предоставляет широкие возможности, ранее недоступные при использовании традиционных методов. Одним из главных преимуществ нейросетевых моделей, особенно архитектур на основе трансформеров, является их способность анализировать код не построчно, а в широком контексте. Это означает, что модель может учитывать информацию о переменных, функциях и структурах, определённых в других частях программы, и на этой основе делать более точные выводы.
Другим важным преимуществом является универсальность и масштабируемость нейросетевых моделей. Они могут быть обучены на коде, написанном на разных языках программирования. Современные модели, такие как CodeT5 или PolyCoder, показывают хорошие результаты на Java, Python, C++, JavaScript и других языках. Более того, обучение на мульти-языковых корпусах делает возможным перенос моделей с одного языка на другой, что расширяет спектр их применения.
В отличие от большинства статических и динамических анализаторов, которые только указывают на наличие ошибки, нейросети способны генерировать конкретные предложения по исправлению. Это может быть как точечное исправление, так и переписывание целого фрагмента кода, включая изменение структуры условий, циклов и вызовов функций.
Однако нейросетевые подходы не лишены ограничений. Основная проблема — необходимость в больших и качественно размеченных корпусах данных. Многие открытые наборы данных, такие как Defects4J, Bugs2Fix, ManySStuBs4J, содержат ограниченное количество примеров и не всегда охватывают широкий спектр языков и типов ошибок. Кроме того, обучение крупных трансформеров требует значительных вычислительных ресурсов, что ограничивает доступность таких моделей [20].
Также вызывает озабоченность вопрос интерпретируемости — большинство нейросетевых моделей функционируют как «чёрный ящик», и сложно объяснить, почему была предложена та или иная модификация кода. Это особенно критично в системах с повышенными требованиями к безопасности и надёжности. Иногда нейросеть генерирует код, который синтаксически корректен, но логически неверен, что может ввести в заблуждение менее опытных разработчиков.
1.5 Вывод по главе
В первой главе был проведён всесторонний анализ современного состояния в области автоматического обнаружения и исправления ошибок в программном коде. Были рассмотрены основные типы ошибок, включая синтаксические, семантические, логические и ошибки времени выполнения. Понимание их природы и классификации является необходимым условием для построения эффективных автоматизированных систем анализа и коррекции кода.
На основании обзора традиционных методов было показано, что статический и динамический анализ, символьное исполнение, а также методы fuzzing позволяют эффективно выявлять широкий спектр дефектов. Однако основным их ограничением является неспособность к автоматической генерации исправлений и низкая эффективность при обработке логических и сложных семантических ошибок.
В то же время нейросетевые подходы, основанные на моделях глубокого обучения, продемонстрировали высокую перспективность в решении задач автоматической коррекции кода. Они обладают способностью учитывать широкий контекст, работать с несколькими языками программирования, предлагать исправления и масштабироваться под различные задачи. Особенно эффективными являются модели на базе трансформерных архитектур — таких как CodeBERT, CodeT5, GraphCodeBERT, которые уже показали свою применимость в реальных системах.
2 Проектирование нейросетевой модели для обнаружения и исправления ошибок в программном коде
2.1 Постановка задачи и выбор архитектуры модели
Разработка программного обеспечения сопряжена с высокой вероятностью появления ошибок, возникающих как на этапе проектирования, так и в процессе реализации. Эти ошибки могут быть синтаксическими, логическими, семантическими или касаться выполнения программы во времени. Несмотря на наличие современных систем статического и динамического анализа, значительное количество багов остаётся незамеченным до поздних этапов разработки или внедрения программного продукта.
Целью данной работы является разработка и обучение модели, способной автоматически обнаруживать и исправлять ошибки в программном коде на популярных языках программирования. В рамках поставленной задачи предполагается, что на вход модели подаётся фрагмент исходного кода, содержащий потенциальную ошибку, а на выходе формируется исправленная версия кода, соответствующая синтаксису и логике исходного языка. Модель должна уметь учитывать контекст кода и предлагать наиболее вероятное исправление.
Сформулированная задача относится к классу sequence-to-sequence (seq2seq) проблем, где вход и выход представляют собой последовательности переменных длин. Подобные задачи характерны для машинного перевода, генерации текста, автодополнения и, в рассматриваемом случае, трансформации кода.
На основании анализа современных научных работ было установлено, что наилучшие результаты в задачах автоматического исправления кода демонстрируют трансформерные архитектуры. Они позволяют эффективно обрабатывать длинные последовательности, учитывать дальние зависимостей между токенами и легко масштабируются под задачи многозадачного и многокодовного обучения.
В качестве базовой архитектуры для решения поставленной задачи была выбрана модель CodeT5 — модификация модели T5 (Text-to-Text Transfer Transformer), адаптированная для работы с программным кодом. CodeT5 разработана командой Salesforce Research и обучена на большом количестве исходного кода из GitHub с применением специальных предобучающих задач: маскирование кода, восстановление документации, автодополнение, исправление кода и другие.
Основные преимущества CodeT5 включают поддержку популярных языков программирования (Python, Java, JavaScript, C++, Ruby и др.), encoder-decoder архитектуру, идеально подходящую для seq2seq задач, возможность дообучения на пользовательских корпусах и наличие реализации в библиотеке HuggingFace Transformers. Также рассматривались альтернативные варианты: CodeBERT, GraphCodeBERT и PLBART, однако именно CodeT5 продемонстрировала лучшую переносимость между задачами и возможность дообучения без полной переинициализации модели.
2.2 Подготовка данных для обучения и тестирования
Качество работы любой нейросетевой модели напрямую зависит от полноты, достоверности и репрезентативности обучающего корпуса. Для задач автоматического исправления кода необходимо сформировать обучающую выборку, содержащую пары «ошибочный код — исправленный код». Такие данные должны охватывать различные типы ошибок: синтаксические, семантические, логические и ошибки форматирования, встречающиеся в реальных программных проектах.
В рамках данной работы для обучения и тестирования модели были использованы следующие общедоступные корпуса: Bugs2Fix — корпус, содержащий реальные баги из проектов на языке Java, собранные с помощью анализа истории коммитов; ManySStuBs4J — включает типовые короткие исправления, извлечённые из коммитов на GitHub; QuixBugs — набор компактных программ с типичными алгоритмическими ошибками; Pythia или CodeXGLUE — дополнительно использовались для дообучения на Python-коде.
Данные предварительно были приведены к единому формату, подходящему для обучения модели CodeT5. Каждая пара представлена в виде двух строк: input (фрагмент ошибочного кода) и target (соответствующее исправление). Важно, чтобы фрагменты были синтаксически валидны или частично валидны, но не пусты. Кроме того, были удалены комментарии, временные переменные и артефакты, не влияющие на анализ кода.
Перед подачей на вход модели все фрагменты были подвергнуты ряду предобработок: удаление лишних пробелов, отступов, символов табуляции; унификация стиля; замена переменных и имён функций на обобщённые; удаление повторяющихся и почти идентичных пар. Для синтаксической проверки и валидации применялись встроенные инструменты языков программирования: компиляторы и парсеры AST.
После очистки данные были токенизированы с помощью встроенного токенизатора SentencePiece, входящего в состав CodeT5. Токенизация основана на модели BPE (byte-pair encoding), позволяющей эффективно разбивать код на подсловные единицы, сохраняя синтаксические конструкции и ключевые слова. Обучающая выборка была разбина на три части: обучающая выборка (80%), валидационная (10%), тестовая (10%).
Особое внимание уделялось равномерному распределению типов ошибок. Если в выборке преобладают только синтаксические баги, модель склонна запоминать шаблоны и хуже справляется с логическими отклонениями. Поэтому вручную или полуавтоматически были выделены подгруппы по категориям: ошибки пропущенных символов, замены операторов, лишние или неверные конструкции, ошибки в логике условий или циклов.
2.3 Концепция функционирования модели
Представленная в данной работе модель исправления ошибок в программном коде основана на принципах encoder-decoder архитектуры и реализует процесс трансформации входного (ошибочного) кода в корректный с точки зрения синтаксиса и логики фрагмент. В рамках функционирования системы можно выделить следующие ключевые стадии: получение входных данных, предобработка и токенизация, формирование скрытого представления, генерация исправленного кода, декодирование и постобработка.
На стадии получения входных данных пользователь или внешний инструмент предоставляет на вход системы фрагмент кода, в котором потенциально содержатся ошибки. Это может быть как завершённая функция, так и неполный конструктив. Затем входной код проходит предварительную очистку и нормализацию, выполняется токенизация с помощью алгоритма SentencePiece, адаптированного под работу с кодом.
На этапе формирования скрытого представления полученные токены преобразуются в эмбеддинги и поступают в энкодер трансформера. Здесь формируется контекстное представление каждого элемента кода на основе всего окружения, что позволяет учитывать зависимости между переменными, структурами управления и логикой вызова функций. Скрытое представление передаётся в декодер, который пошагово генерирует исправленную последовательность токенов с использованием механизма перекрёстного внимания.
На заключительном этапе сгенерированная последовательность токенов преобразуется в текстовый код, форматируется и при необходимости проходит синтаксическую проверку. На выходе пользователь получает исправленный фрагмент, который может быть встроен обратно в проект.
Проектируемая система может функционировать как в автономном режиме, так и в составе других инструментов: IDE-плагин для визуального отображения ошибок и предложений по исправлению в редакторе кода; CI/CD пайплайн для автоматической проверки кода перед коммитом; система онлайн-проверки заданий для автопроверки студенческого кода; API-интерфейс для взаимодействия с внешними сервисами через REST-запросы.
В отличие от классических систем, где фокус сделан на синтаксике, нейросетевой подход позволяет работать с более широким спектром багов, включая пропущенные или избыточные символы, логические ошибки, нарушения стиля, влияющие на читаемость, неправильные вызовы методов и передача аргументов. Поскольку модель обучается на реальных парах «ошибка — исправление», она способна предлагать осмысленные корректировки, подражая действиям опытного разработчика.
2.4 Вывод по главе
Во второй главе была спроектирована нейросетевая модель, предназначенная для автоматического обнаружения и исправления ошибок в программном коде. На основе анализа современных исследований и сравнения существующих решений была обоснована актуальность применения трансформерных архитектур, в частности модели CodeT5. Эта модель адаптирована для работы с исходным кодом и позволяет решать задачу исправления кода как задачу преобразования последовательности (sequence-to-sequence), что делает её особенно подходящей для целей данного исследования.
Была сформулирована задача и определён формат входных и выходных данных. В качестве основы для обучения предложено использовать пары «ошибочный код — исправленный код», собранные из открытых датасетов, таких как Bugs2Fix, ManySStuBs4J и QuixBugs. Также была рассмотрена структура и характеристики этих наборов данных, предложены подходы к очистке, нормализации, токенизации и балансировке выборки по типам ошибок. Это обеспечивает равномерное представление различных видов багов и повышает устойчивость модели к разнообразным стилям программирования [22].
Сформулированная концепция функционирования модели описывает полный пайплайн её работы: от подачи исходного кода и его предобработки, до генерации исправлений, обратной токенизации и вывода результата пользователю. Каждая стадия подробно описана и логически обоснована. Принцип работы построен на последовательной трансформации входного кода с использованием encoder-decoder архитектуры с attention-механизмами, обеспечивающими качественное контекстуальное понимание и точность исправлений.
Проектируемая система обладает гибкой структурой, что позволяет её интегрировать в различные среды — от образовательных платформ до промышленных систем контроля качества кода[2, 3, 11]. Благодаря модульности её можно дообучать на пользовательских корпусах, адаптировать под новые языки программирования и использовать в составе IDE, CI/CD или облачных сервисов. Также предусмотрены метрики для последующей оценки качества предсказаний: точность, редакционное расстояние, BLEU и другие.
Заключение
В ходе учебной практики была выполнена теоретическая проработка темы магистерской диссертации, связанной с применением нейросетевых моделей для автоматического исправления программного кода. Были изучены существующие архитектуры, такие как CodeT5, CodeBERT, GraphCodeBERT, проанализированы их преимущества и ограничения.
В качестве основной была выбрана модель CodeT5, адаптированная под задачи seq2seq-трансформации кода. Подготовлены обучающие данные на основе открытых датасетов Bugs2Fix, ManySStuBs4J, QuixBugs. Разработана структура пайплайна функционирования модели, включающая предобработку, токенизацию, генерацию исправлений и оценку результатов.
Полученные знания и структура модели позволят в дальнейшем приступить к её реализации и дообучению, а также сформируют основу для последующих глав магистерской диссертации. Учебная практика выполнена в полном объёме и заложила прочный фундамент для научного исследования.
Список литературы
8. «Применение методов искусственного интеллекта в автоматизированном тестировании ПО» [Электронный ресурс] // Habr.com, 2024.– URL: https://habr.com/ru/articles/869020/.
9. «ИИ в программной инженерии: обзор практик, инструментов и проблем» [Электронный ресурс] // Habr.com, 2025. – URL: https://habr.com/ru/companies/tbank/articles/966368/.
10. Бауэр Р. В. Применение технологий машинного обучения и искусственного интеллекта для оценки трудоёмкости работ в проектах по разработке программного обеспечения: выпускная квалификационная работа магистра [Текст] // eLibrary.ru (СПбПУ). – 2021.
14. Синяева Э.В., Боднар А.В. Исследование использования нейронных сетей для автоматического определения и исправления ошибок в программном коде // Донбасс будущего глазами молодых ученых: сб. материалов науч.-техн. конф. – Донецк: ДонНТУ, 2024. – С. 275-279. – EDN FLGATE.
15. Раджабова Ф.М. Алгоритмы обнаружения и исправления ошибок в программном коде // Актуальные вопросы современной экономики. – 2025. – № 4. – С. 791-793. – EDN VOBVTY.
16. Arutyunov G.A., Avdoshin S.M. GraphTyper: Neural types inference from code represented as graph // Proceedings of the Institute for System Programming of the RAS. – 2024. – Vol. 36, No. 4. – P. 69-80. – EDN JZVJLH.
17. Пат. № 2848290 C1 РФ, МПК G06N 3/08. Вычислительная система для выполнения программного кода с помощью нейронных сетей / В.А. Дубейко. – Заявл. 03.12.2024; опубл. 17.10.2025. – Бюл. № . – EDN HMAFMZ.
19. «Нейросети в разработке: мощный инструмент или слепая вера?» [Электронный ресурс] // Habr.com, 2025.– URL: https://habr.com/ru/articles/888670/.
20. Никулин Д.С. Анализ языков программирования для разработки нейронных сетей // Информационные ресурсы и системы в экономике, науке и образовании: сб. статей XIV Междунар. науч.-практ. конф. – Пенза: Приволжский Дом знаний, 2024. – С. 112-118. – EDN CFAKBJ.
21. Лукин Д.Г. Обучение модели нейронной сети через язык программирования Python // Проблемы развития современного общества: сб. науч. статей 10-й Всерос. нац. науч.-практ. конф. – Курск: ЗАО «Университетская книга», 2025. – С. 303-305. – EDN VELFES.
22. Сеитбулаев С.Ш. Обзор библиотек языка программирования Python для создания нейронных сетей // Информационно-компьютерные технологии в экономике, образовании и социальной сфере. – 2021. – № 4(34). – С. 74-79. – EDN YSETEP.
23. Куляпина М.С. Анализ библиотек и инструментов для реализации нейронной сети по подбору катализатора на языке программирования Java // Инновации. Наука. Образование. – 2022. – № 57. – С. 171-180. – EDN ESSIYO.