РЕЦЕНЗИЯ на выпускную квалификационную работу студента 4 курса кафедры системного программирования СПбГУ Азимова Рустама Шухратулловича, обучающегося по направлению 010500 (02.03.03)(математическое обеспечение и администрирование информационных систем) Тема выпускной квалификационной работы: Диагностика синтаксических ошибок в динамически формируемом коде В выпускной квалификационной работе рассматривается задача обнаружения ошибок при синтаксическом разборе множества строк, задаваемых конечным автоматом. Важность данной задачи вытекает из необходимости анализа динамически исполняемых запросов, которые неизвестны на момент компиляции, и формируются из строковых литералов во время работы программы. Данная задача является алгоритмически неразрешимой, поэтому целью работы было разработать приближенный алгоритм для её решения. В рамках работы студентом был изучен алгоритм LR-анализа и его расширения (обобщенный LR- и абстрактный обобщенный LR-анализ). Задача реализовывалась в рамках проекта YaccConstructor, разрабатываемого на языке F#, что также потребовало изучения как инструмента, так и языка разработки. В результате работы получены следующие результаты. 1. Формализовано понятие синтаксических ошибок в регулярном множестве строк. 2. Описан ранее реализованный алгоритм, проводящий разбор таких множеств, и предложена его модификация, позволяющая находить некоторые синтаксические ошибки, и ограничивать множество тех, которые обнаружить не удалось. 3. Доказана корректность его работы. 4. Полученный алгоритм реализован в проекте YaccConstructor, было проведено тестирование его корректности и производительности. Однако необходимо отметить, что хотя результаты согласуются с поставленной задачей, работа содержит ряд серьезных недостатков. 1. С точки зрения пользователя множество возможных ошибок (probErrors) должно быть как можно меньше, поскольку о корректности рёбер в нём ничего не известно. И для оценки целесообразности применения алгоритма желательно оценить размеры этого множества. Однако в случае, когда в графе присутствуют циклы, у пользователя нет возможности узнать, какие рёбра попадут в probErrors. 2. Предложенная структура префиксов является избыточной, поскольку не предоставляет новых возможностей по сравнению с GSS, которые использовались при поиске ошибочных ребер. Таким образом, значительная часть работы была проделана впустую. 3. Основным недостатком работы является то, что предложенный алгоритм представляет собой малую теоретическую ценность. Способ поиска ошибок в нем можно охарактеризовать как один из простейших, и с большой вероятностью покрывающий лишь небольшую часть случаев, представляющих теоретический интерес. Также, как было сказано, не ясно, что из себя представляет множество возможных ошибок, что приводит к тому, что и ограничения на область его применимости совершенно не ясны. Также в работе присутствуют следующие незначительные недочёты. 1. Не была отмечена неразрешимость общей задачи, в результате чего изучающему работу может быть не ясно, почему ищется лишь приближенный алгоритм ее решения. 2. Построение структуры префиксов можно было вынести в отдельный проход, уже после построения GSS, что привело бы к разделению и, как следствие, упрощению кода. 3. К возможным недостаткам также стоит отнести текст диплома. Ключевые детали алгоритма представлены в виде кода, без полноценного словесного описания или примеров работы. Также местами текст перегружен новыми терминами, причем иногда они обозначают уже определенные сущности, а иногда их определение допускает неоднозначное толкование. В совокупности эти факторы приводят к тому, что текст становится очень тяжёлым для понимания. Из достоинств данной работы можно выделить следующие. 1. Тщательное доказательство корректности алгоритма. 2. Существуют ситуации, в которых предложенный алгоритм выдаст полную информацию об ошибках. Важным частным случаем являются ациклические входные графы, в случае которых алгоритм с большой вероятностью будет работать намного эффективнее, чем анализ всех строк по отдельности. 3. Решение в виде возможных ошибок позволяет пользователю выбирать, какая степень надежности ему нужна. В случае, если ошибки являются недопустимыми, каждую возможную ошибку можно рассматривать как полноценную. И напротив, если ложные срабатывания на корректных входах нежелательны (что может иметь место при подсветке ошибок в IDE), то все возможные ошибки можно игнорировать. 4. Необходимо отметить, что, несмотря на множество недостатков, предложенный алгоритм является важным дополнением к ранее существовавшему механизму построения леса разбора, поскольку ранее в нём отсутствовал какой-либо способ определения ошибок. Также не исключено, что при дальнейшем анализе или практическом применении алгоритма станут ясны его ограничения. Проверка ВКР на предмет наличия неправомерных заимствований показала, что работа неправомерных заимствований не содержит. На основании вышеизложенного можно заключить, что выпускная квалификационная работа соответствует основным требованиям, предъявляемым к выпускной квалификационной работе бакалавра, однако содержит существенные недоработки и потому заслуживает оценку «удовлетворительно».