PROUST

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

У. Льюис Джонсон, Эллиот Солоуэй

PROUST (сокращение от Program Understander for Students-система понимания программ, предназначенная для студентов) — система, позволяющая на основе заложенных в нее знаний обнаруживать несинтаксические ошибки в программах на языке Паскаль у начинающих программистов. После того как программа прокомпилирована, автоматически вызывается система PROUST, которая анализирует программу и сообщает студенту о всех найденных ошибках.

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

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

При разработке системы PROUST пришли к выводу о необходимости самого непосредственного учета широкого разнообразия ошибок, встречающихся у начинающих программистов. Если некая задача по программированию поставлена перед аудиторией в 200 человек, то студенты напишут 200 различных программ (при условии, что они не будут списывать друг у друга). Программы различаются как по своему характеру, так и по допускаемым в них ошибкам. Некоторые ошибки (например, не заданы начальные значения переменных) могут появиться в результате случайных упущений — такие ошибки можно легко найти и исправить. Другие ошибки порождаются тем, что программист не в состоянии учесть взаимодействие различных компонентов программы. По отдельности каждый отрезок программы может выглядеть вполне правильным, однако составленная из них программа не работает. Третий тип ошибок обусловлен неверными программистскими представлениями, которые могли выработаться у составителя программы. В этом случае программа может казаться программисту абсолютно правильной, но не выполняющей то, что ему хотелось, по совершенно непонятным для него причинам. Ошибки, связанные с неверными представлениями, наиболее серьезны, и здесь лучше всего, если студенту кто-то укажет причины его затруднений.

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

Чтобы показать, как понимание намерений программиста может помочь отладке программы, приведем два примера «ошибочных» программ и обсудим, почему в других (отличных от нашего) подходах к автоматической отладке подобные ошибки обнаружить не удается. Затем рассмотрим, как такие программы анализируются системой PROUST. В заключение же приведем статистические данные, показывающие работу системы PROUST на многочисленных примерах выполнения студентами типичного задания, относящегося к начальному курсу программирования. Эта статистика позволит нам обосновать вывод о том, что подход, принятый в системе PROUST, пригоден для коррекции большинства программ, написанных новичками.

Заключение

Система PROUST обеспечивает высококачественный анализ ошибок, допускаемых начинающими программистами.

Она почти доведена до того уровня, когда ее можно будет исключить в курс обучения программированию, что принесет студентам большую пользу. (В настоящей статье мы дали лишь весьма упрощенное описание того, как в системе PROUST происходит обнаружение ошибок.) Следующим шагом, возможно, будет создание на основе этой системы курса автоматического обучения программированию. Такая система могла бы не только исправлять студенческие ошибки, но и предлагать студентам дополнительные задачи, на которых они при необходимости могли бы попрактиковаться.