Язык Форт и его реализации

Средства отладки форт-программ


Программы на языке Форт — определения слов — кодируются и вводятся в ЭВМ методом «снизу вверх», т.е. начиная с элементарных, использующих только стандартные слова форт-системы, и кончая определением главного слова, использующего уже введенные. Такой порядок естественным образом предполагает немедленную отладку вводимых определений, поскольку определение готово к исполнению сразу же после ввода. Отладка облегчается тем, что механизм взаимодействия модулей упрощен до предела: через стек данных, который программист может сам заполнить значениями параметров перед вызовом отлаживаемого слова.

Для распечатки текущего состояния стека данных и стека возвратов многие реализации имеют слова S. и R. . В сочетании со словом DUMP, которое распечатывает область памяти, и словом ?

: ? ( А ---> ) @ . ;

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

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

Например, по специальному слову ON-NEXT (ПРИ-СЛЕД) строится список слов (в виде списка адресов компиляции), подлежащих отслеживанию. В частности, его можно задать, как все слова, определения которых расположены в словаре выше некоторого адреса. Для всех этих слов указываются отладочные действия, состоящие, как правило, из распечатки имени слова и стека данных в момент перехода к его исполнению.
В некоторых случаях можно проводить анализ стека возвратов и отслеживать возврат из определений, распечатывая результаты из стека данных на момент возврата. Специальные слова TRACE-ON (СЛЕЖ-ВКЛ) и TRACE-OFF (СЛЕЖ-ВЫКЛ) включают и выключают механизм отладочного слежения, подменяя или восстанавливая точку NEXT адресного интерпретатора.

С помощью этого же механизма можно ввести защиту от зацикливания, например подсчитывая в точке NEXT число исполненных слов и возобновляя диалог при достижении некоторого заданного значения этого счетчика. Если данная ЭВМ имеет встроенный таймер и операционная система позволяет обрабатывать асинхронные выходы по истечении заданного интервала времени, то этот механизм можно также использовать для предохранения от зацикливания. В процедуре обработки выхода по исчерпанию временного интервала нужно подменить точку NEXT на такую, которая выполнит возврат к диалогу с программистом. При этом программист может получить исчерпывающую информацию о месте такого «прерывания от таймера».

Другой полезный механизм отладочного слежения позволяет переключаться на диалог с программистом в момент исполнения заданного слова и реализуется через подмену поля кода в заданной словарной статье. Для выполнения такой подмены нужно определить специальное слово, например, STOP (стойте!), которое выбирает имя слова из входного потока и засылает в поле кода его словарной статьи адрес специального кода. Прежнее значение поля кода сохраняется в специально резервируемой для этого ячейке словаря. Новый код для подмененного таким образом слова состоит в переключении на текстовую интерпретацию входного потока, так что все необходимые отладочные распечатки и установки значений программист задает непосредственно в диалоге. Слово GO (идите!) завершает диалог и продолжает исполнение программы, при этом отлаживаемое слово, вызвавшее останов, исполняется в прежнем виде (для этого используется сохраненное «настоящее» значение из его поля кода). Можно предусмотреть специальное слово для продолжения работы без исполнения рассматриваемого слова.



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

Удобным вспомогательным средством, позволяющим быстро находить место останова в терминах входного текста на языке Форт, является символьная распечатка шитого кода. Поскольку скомпилированная ссылка представляет собой адрес поля кода словарной статьи, то по ней через слово >NAME можно вычислить адрес поля имени и напечатать это имя словом ID.:

: ID. ( NFA ---> ) COUNT 31 AND TYPE SPACE ;

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

В программе распечатки последовательности ссылок надо предусмотреть специальную обработку некоторых адресов, вслед за которыми скомпилирована не ссылка на очередную статью, а некоторое другое значение. Такими «особыми» ссылками в стандарте языка являются слова для выполнения переходов BRANCH и ?BRANCH, для реализации циклов (DO), (LOOP) и (+LOOP), для исполнения литералов LIT и 2LIT и некоторые другие.


Содержание раздела