Научная статья на тему 'НЕКОТОРЫЕ ПРОБЛЕМЫ АВТОМАТИЧЕСКОЙ ПРОВЕРКИ И АНАЛИЗА ИСХОДНЫХ КОДОВ РЕШЕНИЙ ЗАДАЧ ПРИ ИЗУЧЕНИИ ЯЗЫКА ПРОГРАММИРОВАНИЯ PYTHON'

НЕКОТОРЫЕ ПРОБЛЕМЫ АВТОМАТИЧЕСКОЙ ПРОВЕРКИ И АНАЛИЗА ИСХОДНЫХ КОДОВ РЕШЕНИЙ ЗАДАЧ ПРИ ИЗУЧЕНИИ ЯЗЫКА ПРОГРАММИРОВАНИЯ PYTHON Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
168
26
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
РЕШЕНИЕ ЗАДАЧ / АВТОМАТИЧЕСКИЙ АНАЛИЗ ПРОГРАММНОГО КОДА / ЯЗЫК ПРОГРАММИРОВАНИЯ PYTHON / ПЕСОЧНИЦА / СВОЙСТВА АЛГОРИТМА / ЭФФЕКТИВНОСТЬ / КОРРЕКТНОСТЬ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Буянова Ирина Владимировна, Замулин Иван Сергеевич

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

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

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Буянова Ирина Владимировна, Замулин Иван Сергеевич

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

SOME PROBLEMS OF AUTOMATIC VERIFICATION AND ANALYSIS OF SOURCE CODES OF SOLUTIONS TO PROBLEMS IN LEARNING THE PYTHON PROGRAMMING LANGUAGE

The article discusses approaches to organizing automatic verification of solutions to programming problems in Python. A list of requirements that the solution of the problem must satisfy, as well as ways to verify compliance with these requirements, is given, an analysis of possible technical difficulties and ways to overcome them is provided. At the end of the article the requirements for the content of the report on the completed verification of the solution are formulated.

Текст научной работы на тему «НЕКОТОРЫЕ ПРОБЛЕМЫ АВТОМАТИЧЕСКОЙ ПРОВЕРКИ И АНАЛИЗА ИСХОДНЫХ КОДОВ РЕШЕНИЙ ЗАДАЧ ПРИ ИЗУЧЕНИИ ЯЗЫКА ПРОГРАММИРОВАНИЯ PYTHON»

ТЕХНИЧЕСКИЕ НАУКИ

УДК 378.147.88

НЕКОТОРЫЕ ПРОБЛЕМЫ АВТОМАТИЧЕСКОЙ ПРОВЕРКИ

И АНАЛИЗА ИСХОДНЫХ КОДОВ РЕШЕНИЙ ЗАДАЧ ПРИ ИЗУЧЕНИИ ЯЗЫКА ПРОГРАММИРОВАНИЯ PYTHON

Буянова Ирина Владимировна,

студент

Замулин Иван Сергеевич,

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

и автоматизированных систем Хакасский государственный университет им. Н. Ф. Катанова (г. Абакан)

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

Ключевые слова: решение задач, автоматический анализ программного кода, язык программирования Python, песочница, свойства алгоритма, эффективность, корректность.

SOME PROBLEMS OF AUTOMATIC VERIFICATION AND ANALYSIS OF SOURCE CODES OF SOLUTIONS TO PROBLEMS IN LEARNING THE PYTHON PROGRAMMING LANGUAGE

Buyanova Irina Vladimirovna,

graduate student

Zamulin Ivan Sergeevich,

Ph. D. in Physical and Mathematical Sciences, Associate Professor of the Computer Engineering and Automated Systems Software Department

Katanov Khakass State University (Abakan).

The article discusses approaches to organizing automatic verification of solutions to programming problems in Python. A list of requirements that the solution of the problem must satisfy, as well as ways to verify compliance with these requirements, is given, an analysis of possible technical difficulties and ways to overcome them is provided. At the end of the article the requirements for the content of the report on the completed verification of the solution are formulated.

Key words: problem solving, automatic code analysis, Python programming language, sandbox, algorithm properties, efficiency, correctness.

В статье, посвященной формулировке требований к системе онлайн-обучения студентов программированию [1], говорится о необходимости наличия в подобной системе функции автоматической проверки выполненных студентами решений, результаты работы которой должны сопровождаться подробным отчётом. С целью реализации данной функции следует сформулировать требования к качеству решений задач по

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

Поскольку решением задачи по программированию всегда является алгоритм, записанный в виде кода на каком-либо языке программирования, решение задачи должно удовлетворять требованиям, выдвигаемым к алгоритму. Кроме того, решение должно отве-

чать дополнительным требованиям, предъявляемым преподавателем к уровню освоения проходимого материала.

В литературе, посвященной информатике в целом и программированию в частности [2], обычно приводятся следующие требования к алгоритму:

- детерминированность (определенность), т. е. он должен быть точен, общепонятен, исключать возможность произвольного толкования;

- массовость, т. е. его применимость к однотипным задачам;

- результативность, т. е. через определенное число шагов алгоритм должен закончиться;

- дискретность, т. е. возможность деления задачи на шаги, элементарные операции;

- понятность, т. е. ориентация на те команды, которые знает исполнитель;

- эффективность, подразумевающая, что для решения задачи могут быть предложены разные алгоритмы;

- корректность, т. е. способность алгоритма обеспечить получение именно того результата, который требуется.

Чтобы оценить поступившее на проверку решение, необходимо проверить его соответствие данным требованиям и сформировать отчёт для преподавателя. В работе, посвященной формулировке требований к системе он-лайн-обучения студентов программированию [1], был проведён анализ подходов к этой задаче в аналогичных образовательных ресурсах, в ходе которого установлено, что все они выполняют проверку, основываясь на заранее подготовленных тестах. Этот же подход с успехом применяется в промышленной разработке программного обеспечения. Хотя он не гарантирует полного соответствия программного кода всем требованиям, его достаточно, чтобы выявить большую часть возможных проблем.

Рассмотрим реализацию проверки каждого из требований применительно к проверке ре-

шений задач, написанных на языке программирования Python [3].

Проверка требований детерминированности и понятности осуществляется компилятором (интерпретатором) языка программирования Python, поэтому если при запуске программы не возникает синтаксических ошибок, эти требования считаются удовлетворёнными.

Проверка требования массовости может быть осуществлена благодаря использованию серии заранее подготовленных тестовых входных и выходных данных. Система проверки решения должна будет запустить программу по одному разу для каждого из тестов. Если все тесты будут пройдены успешно, программу можно условно считать удовлетворяющей требованию массовости. Образец тестов для задачи «Счастливый билет» [4] приведён в таблице 1. Из условия задачи нетрудно заметить, что для полной проверки массовости потребуется 106 тестов. Однако на практике достаточно составить несколько десятков тестов, равномерно покрывающих возможные исходы, в данном примере по десять случайно выбранных номеров счастливых и несчастливых билетов. Проверить результативность алгоритма невозможно, поскольку, как было доказано А. Тьюрингом [5], проблема статической проверки для машины Тьюринга (следовательно, и для современного цифрового компьютера) неразрешима. Можно попытаться выполнить такую проверку путём тестирования, но в этом случае временные затраты для низкоэффективных алгоритмов могут оказаться неприемлемо большими. По этой причине от выполнения такой проверки следует отказаться, ограничившись проверкой эффективности.

Как и проверка требования массовости, проверка корректности и эффективности может быть выполнена с помощью автоматического тестирования. Непрохождение хотя бы одного из тестов за конечное заранее заданное время означает, что программа неэффективна, а получение неверных результатов означает, что программа

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

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

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

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

Наконец, поскольку Python является интерпретируемым языком, ограничить время выполнения программы можно модификацией интерпретирующего модуля. Описанные способы контроля над выполнением кода, к которому нет доверия, описываются общим термином «песочница» (англ. sandbox). Проблема создания песочниц широко обсуждается в программистском сообществе, например, применительно к языку Python была разработана библиотека PyBox [6].

Кроме тестирования, для оценки эффективности может быть использован статический анализ кода. В качестве примера рассмотрим решение задачи «Цветочки» [7]. Образец исходного кода возможного решения приведён на рисунке 1.

Таблица 1

Пример тестовых данных для задачи «Счастливый билет»

№ Вход Выход

1 385916 Да

20 123456 Нет

Таблица 2

Пример тестовых данных для задачи о поиске п-ого простого числа

_Тип теста__Вход__Выход_

1) корректность__1__2_

2) корректность__21__73_

3) эффективность 1 000 000 15 485 863 ~

Компилятор языка Python позволяет получить по этому исходному коду абстрактное синтаксическое дерево программы, визуализация которого показана на рисунке 2. Анализ этого дерева показывает наличие в программе цикла for, что в данной задаче является излишним усложнением, поскольку она может быть решена без использования циклов. Отчёт о проверке решения должен содержать указание на этот факт, как на причину снижения оценки.

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

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

По результатам статического анализа кода и проведения всех тестов должен быть автоматически сформирован отчёт для препода-

вателя, содержащий ответы на следующие вопросы:

- является ли решение корректным;

- является ли оно эффективным по памяти и производительности;

- использует ли оно языковые конструкции и встроенные функции языка, входящие в изучаемую тему;

- не использует ли оно избыточных языковых конструкций.

Рассмотренные подходы к автоматической проверке решений можно разделить на две основные группы: статический анализ кода и выполнение тестирования. Каждый из подходов имеет свои преимущества и ограничения. Большинство существующих систем, применяемых при оценке решений олимпиадных задач [1], ограничиваются тестированием, которого достаточно для установления победителя. Однако при обучении важно не только отделить правильные решения от ошибочных, но и предложить студенту возможные пути улучшения выполненной им работы по написанию программы. В этом может помочь статический анализ кода. Реализация обоих подходов сопряжена с определёнными техническими сложностями. Так, реализация системы тестирования нуждается в механизме защиты от решений, содержащих вредоносный код. В то время как статический анализ невосприимчив к подобным проблемам, но по его результатам затруднительно судить об эффективности или корректности решения, а потому он пригоден только для выдачи дополнительных рекомендаций. Только сочетание этих подходов в рамках одной системы проверки решений может дать оптимальный результат.

print(lj с, r, sep=1 f)

Рис. 1. Скриншот программного кода решения задачи "Цветочки"

Рис. 2. Абстрактное синтаксическое дерево решения задачи «Цветочки»

Библиографический список

1. Буянова И. В. Требования к системе онлайн-обучения студентов программированию и обзор существующих решений // Инженерные технологии: традиции, инновации, векторы развития: сборник материалов VII Всероссийской научно-практической конференции с международным участием (Абакан, 10-12 ноября 2021 г.) / отв. ред. Д. Ю. Карандеев. Абакан: Издательство ФГБОУ ВО «Хакасский государственный университет им. Н. Ф. Катанова», 2021. С. 109-111.

2. Мирзоев М. С., Матросов В. Л. Теория алгоритмов: учебное пособие. М.: Прометей, 2019. С. 6.

3. Официальный сайт Python. URL: https://www.python.org/ (дата обращения: 14.12.2021).

4. Школа программиста Красноярского краевого Дворца пионеров. Задача «Счастливый билет». URL: https://acmp.ru/index.asp?main=task&id_task=52 (дата обращения: 13.12.2021).

5. Turing A. On Computable Numbers, with an Application to the Entscheidungsproblem (англ.) // Proceedings of the London Mathematical Society - London Mathematical Society, 1937. Vol. s2-42, Iss. 1. P. 230-265.

6. Engelberth М., Gobel J., PyBox - A Python Sandbox / Universitat Mannheim. URL: https://subs.emis.de/LNI/Proceedings/Proceedings195/137.pdf (дата обращения: 10.12.2021).

7. Школа программиста Красноярского краевого Дворца пионеров. Задача "Цветочки". URL: https://acmp.ru/index.asp?main=task&id_task=504 (дата обращения: 13.12.2021).

© Буянова И. В., Замулин И. С., 2021

УДК 004.94+351.853.1(571.513-25)

ПРИМЕНЕНИЕ ТЕХНОЛОГИИ 3D-МОДЕЛИРОВАНИЯ ДЛЯ ВИЗУАЛИЗАЦИИ ПАМЯТНИКОВ КУЛЬТУРНОГО НАСЛЕДИЯ (НА ПРИМЕРЕ АЛЛЕИ ГЕРОЕВ ГОРОДА АБАКАН)

Замулин Иван Сергеевич,

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

и автоматизированных систем

Закарян Сусанна Андраниковна,

ассистент кафедры истории

Михайлов Иван Игоревич,

студент

Хакасский государственный университет им. Н. Ф. Катанова (г. Абакан)

Статья посвящена использованию технологии 3D-моделирования для визуализации памятников культурного наследия. В ней авторы описывают работу по созданию на базе графического редактора Blender и игрового движка Godot трёхмерной модели Аллеи Героев Советского Союза (г. Абакан, Республика Хакасия). Применение современных технологий при визуализации исторических данных позволяет расширить спектр возможностей использования информации.

Ключевые слова: компьютеризация, 3D-моделирование, визуализация, свободно распространяемое программное обеспечение, Blender, Godot, культурное наследие, региональная история.

APPLICATION OF 3D-MODELING TECHNOLOGY FOR VISUALIZATION OF CULTURAL HERITAGE MONUMENTS (ON THE EXAMPLE OF THE ALLEY OF HEROES OF ABAKAN CITY)

Zamulin Ivan Sergeevich,

PhD in Physics and Mathematics, Associate Professor, Head of Computer Technology Software and Automated Systems Department

Zakaryan Susanna Andranikovna,

assistant of the History Department

Mikhailov Ivan Igorevich,

student

Katanov Khakass State University (Abakan)

The article is devoted to the use of 3D modeling technology for visualization of cultural heritage monuments. The authors describe the work on creating a three-dimensional model of the Alley of Heroes of the Soviet Union (Abakan,

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