Компиляция и компоновка РефалАБ-программ может производиться на ПК под управлением следующих операционных систем:
Для исполнения РефалАБ-программ не требуется ни MinGW-w64, ни clang.
РефалАБ-система представляет собой совокупность следующих файлов:
В комплект поставки исходников РефалАБ-системы входят:
Чтобы собрать РефалАБ-систему в Windows из исходников РефалАБ-системы, требуется Mingw-w64 (UCRT Runtime Clang 18.1.8 или позже (with POSIX threads)).
32-битная версия Mingw-w64 Win32 - i686 позволяет собрать 32-битную РефалАБ-систему.
64-битная версия Mingw-w64 Win64 - x86_64 позволяет собрать 64-битную РефалАБ-систему.
В процессе сборки РефалАБ-системы необходимо, чтобы папка {MinGW-w64}\bin ({MinGW-w64} - путь к папке, где находится MinGW-w64) была в переменной окружения PATH.
Распакуйте исходники РефалАБ-системы в любую директорию X. Перейдите в папку refalab:
cd X\refalab
Запустите процесс сборки одним из двух способов:
Переименуйте сборочный файл для Windows Makefile.Windows в Makefile. Выполните
mingw32-make
Выполните
mingw32-make –file=Makefile.Windows
Результатом сборки будут:
Для проверки правильности сборки РефалАБ-системы необхоимо запустить тестовые примеры. Запустите, находясь в X\refalab, скрипт refalabclg.bat:
refalabclg tests\{name}
где
{name} := hello | fact | test0..test5
Для работы примера “fact” (факториал n) вы должны ввести целое число n.
Введите 0 или пустую строку для выхода.
Обратите внимание на то, что завершающие сообщения “Recognition impossible” для примеров test1, test4 и test5 являются правильными, поскольку в этих тестах имеются фрагменты на проверку неотождествления.
По необходимости, можно запустить тестовые примеры, используя refalabclg_dbg.bat для запуска в режиме отладки, refalabdclg.bat для запуска отладчика, refalabdclg_dbg.bat для запуска отладчика в режиме отладки.
Чтобы собрать РефалАБ-систему в POSIX-совместимой ОС из исходников РефалАБ-системы, требуется clang 18.1.8 или позже.
32-битная версия clang позволяет собрать 32-битную РефалАБ-систему.
64-битная версия clang позволяет собрать 64-битную РефалАБ-систему.
Распакуйте исходники РефалАБ-системы в любую директорию X. Перейдите в папку refalab:
cd X/refalab
Запустите процесс сборки одним из двух способов:
Переименуйте сборочный файл для Windows Makefile.POSIX в Makefile. Выполните
make
Выполните
make –file=Makefile.POSIX
Результатом сборки будут:
Для проверки правильности сборки РефалАБ-системы необхоимо запустить тестовые примеры. Запустите, находясь в X/refalab, скрипт refalabclg:
./refalabclg tests/{name}
где
{name} := hello | fact | test0..test5
Для работы примера “fact” (факториал n) вы должны ввести целое число n.
Введите 0 или пустую строку для выхода.
Обратите внимание на то, что завершающие сообщения “Recognition impossible” для примеров test1, test4 и test5 являются правильными, поскольку в этих тестах имеются фрагменты на проверку неотождествления.
По необходимости, можно запустить тестовые примеры, используя refalabclg_dbg для запуска в режиме отладки, refalabdclg для запуска отладчика, refalabdclg_dbg для запуска отладчика в режиме отладки.
На ПК с Windows РефалАБ-система хранится в следующих файлах:
Для компиляции и компоновки РефалАБ-программ необходимо, чтобы папка {MinGW-w64}\bin ({MinGW-w64} - путь к папке, где находится MinGW-w64) была в переменной окружения PATH.
32-битная РефалАБ-система создает 32-битные исполняемые файлы РефалАБ-программ с расширением exe и требует 32-битной версии Mingw-w64 Win32 - i686.
64-битная РефалАБ-система создает 64-битные исполняемые файлы РефалАБ-программ с расширением exe и требует 64-битной версии Mingw-w64 Win64 - x86_64.
Находясь в refalab, запустив скрипт refalabc.bat, можно скомпилировать РефалАБ-программу в объектный файл. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
refalabc имя_файла
Находясь в refalab, запустив скрипт refalabclg.bat, можно скомпилировать, скомпоновать и запустить РефалАБ-программу в обычном режиме. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
refalabclg имя_файла
Находясь в refalab, запустив скрипт refalabclg_dbg.bat, можно скомпилировать, скомпоновать и запустить РефалАБ-программу в режиме отладки. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
refalabclg_dbg имя_файла
Находясь в refalab, запустив скрипт refalabdclg.bat, можно скомпилировать, скомпоновать и запустить отладчик РефалАБ-программы. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
refalabdclg имя_файла
Находясь в refalab, запустив скрипт refalabdclg_dbg.bat, можно скомпилировать, скомпоновать и запустить отладчик РефалАБ-программы в режиме отладки. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
refalabdclg_dbg имя_файла
Необходимые изменения (например, если требуется задать другой список опций или компоновать программу из нескольких РефалАБ-модулей) можно внести в эти скрипты при помощи любого текстового редактора.
Можно запустить и проверить работу тестовых примеров. Запустите, находясь в refalab, скрипт refalabclg.bat:
refalabclg tests\{name}
где
{name} := hello | fact | test0..test5
Для работы примера “fact” (факториал n) вы должны ввести целое число n.
Введите 0 или пустую строку для выхода.
Обратите внимание на то, что завершающие сообщения “Recognition impossible” для примеров test1, test4 и test5 являются правильными, поскольку в этих тестах имеются фрагменты на проверку неотождествления.
По необходимости, можно запустить тестовые примеры, используя refalabclg_dbg.bat для запуска в режиме отладки, refalabdclg.bat для запуска отладчика, refalabdclg_dbg.bat для запуска отладчика в режиме отладки.
Можно установить переменные окружения РефалАБ для облегчения компиляции и компоновки РефалАБ-программ.
Для этого, находясь в refalab, запустите скрипт set_env.bat.
После этого будут созданны следующие переменные окружения ({refalab} - путь к папке refalab):
По необходимости, можно добавить папку {refalab}\bin в переменную окружения PATH.
На ПК с POSIX-совместимой ОС РефалАБ-система хранится в следующих файлах:
32-битная РефалАБ-система создает 32-битные исполняемые файлы РефалАБ-программ и требует 32-битной версии clang.
64-битная РефалАБ-система создает 64-битные исполняемые файлы РефалАБ-программ и требует 64-битной версии clang.
Находясь в refalab, запустив скрипт refalabc, можно скомпилировать РефалАБ-программу в объектный файл. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
./refalabc имя_файла
Находясь в refalab, запустив скрипт refalabclg, можно скомпилировать, скомпоновать и запустить РефалАБ-программу в обычном режиме. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
./refalabclg имя_файла
Находясь в refalab, запустив скрипт refalabclg_dbg, можно скомпилировать, скомпоновать и запустить РефалАБ-программу в режиме отладки. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
./refalabclg_dbg имя_файла
Находясь в refalab, запустив скрипт refalabdclg, можно скомпилировать, скомпоновать и запустить отладчик РефалАБ-программы. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
./refalabdclg имя_файла
Находясь в refalab, запустив скрипт refalabdclg_dbg, можно скомпилировать, скомпоновать и запустить отладчик РефалАБ-программы в режиме отладки. Имя файла, содержащего РефалАБ-программу с одним модулем (без указания расширения “.ref”), является параметром при вызове этого командного файла:
./refalabdclg_dbg имя_файла
Необходимые изменения (например, если требуется задать другой список опций или компоновать программу из нескольких РефалАБ-модулей) можно внести в эти скрипты при помощи любого текстового редактора.
Можно запустить и проверить работу тестовых примеров. Запустите, находясь в refalab, скрипт refalabclg:
./refalabclg tests/{name}
где
{name} := hello | fact | test0..test5
Для работы примера “fact” (факториал n) вы должны ввести целое число n.
Введите 0 или пустую строку для выхода.
Обратите внимание на то, что завершающие сообщения “Recognition impossible” для примеров test1, test4 и test5 являются правильными, поскольку в этих тестах имеются фрагменты на проверку неотождествления.
По необходимости, можно запустить тестовые примеры, используя refalabclg_dbg для запуска в режиме отладки, refalabdclg для запуска отладчика, refalabdclg_dbg для запуска отладчика в режиме отладки.
Можно установить переменные окружения РефалАБ для облегчения компиляции и компоновки РефалАБ-программ.
Для этого, находясь в refalab, запустите скрипт set_env.
source ./set_env
После этого будут созданны следующие переменные окружения ({refalab} - путь к папке refalab):
Эти переменные можно использовать в текущей оболочке и во всех процессах, запускаемых из текущей оболочки.
Чтобы сделать их постоянными, необходимо добавить в файл .bashrc директории $HOME строки:
export REFALABBIN={refalab}/bin
export REFALABLIB={refalab}/lib
export REFALABINCLUDE={refalab}/include
export REFALABCFLAGS="-pipe -Wall -O2"
По необходимости, можно добавить папку {refalab}/bin в переменную окружения PATH.
Любая РефалАБ-программа состоит хотя бы из одного РефалАБ-модуля, в котором определена функция GO, которая должна быть объявлена входной точкой данного модуля с помощью директивы ENTRY. В РефалАБ-программе могут быть еще РефалАБ-модули.
Исходные тексты РефалАБ-программ можно подготавливать с помощью любого редактора текстов. Тип файла (расширение у имени файла) должен быть ref.
РефалАБ-программа состоит из одного или нескольких таких файлов.
В каждом таком файле есть один РефалАБ-модуль.
Пример. Сохранить текст в файл hello.ref:
HELLO +
START
ENTRY Go
EXTRN Print
IMPL
Go = <Print 'Hello World!'>
END
Компиляция РефалАБ-модулей производится РефалАБ-компилятором и происходит в объектные файлы, используя ассемблер GNU Assembler as.
За один запуск РефалАБ-компилятора обрабатывается один файл. Для компиляции необходимо выдать следующую команду:
Windows
%REFALABBIN%\refalabc имя_файла список_опцийPOSIX
$REFALABBIN/refalabc имя_файла список_опцийВозможна компиляция в режиме отладки с помощью команды:
Windows
%REFALABBIN%\refalabc_dbg имя_файла список_опцийPOSIX
$REFALABBIN/refalabc_dbg имя_файла список_опцийИмя_файла (возможно с указанием пути) без указания расширения “.ref”.
Список_опций либо пуст, либо имеет следующий вид:
опция_1 опция_2 ... опция_k
где опция_i - имя опции, представляющее собой цепочку литер, не содержащую пробелов. Имена опций отделяются друг от друга пробелами.
Список_опций служит для установки режимов работы компилятора. Допускаются следующие имена опций:
Вначале РефалАБ-компилятор генерирует ассемблерный файл в коде GNU Assembler с именем имя_файла.s. Потом компилятор запускает GNU Assembler as для компиляции ассемблерного файла в объектный файл:
as [options] имя_файла.s
Пример 1 (Windows)
%REFALABBIN%\refalabc test1 -a,"-o test1.o"
Компилируется модуль из файла test1.ref. Исходный текст модуля с диагностикой выдается в файл test1.lst. Результат работы компилятора - файл test1.o.
Пример 2 (Windows)
%REFALABBIN%\refalabc test2 -ns
Компилируется модуль из файла test2.ref. Листинг не выводится. Результат работы компилятора - файл a.out.
Пример 3 (Windows)
%REFALABBIN%\refalabc test3 -as
Компилируется модуль из файла test3.ref. Исходный текст модуля с диагностикой выдается в файл test3.lst. Результат работы компилятора - файл test3.s.
На терминал выводится протокол работы компилятора, который содержит имя компилируемого модуля, его длину, длину файла-результата или сообщения об ошибках, если таковые обнаруживаются в процессе компиляции, время компиляции.
Кроме вышеупомянутых, во время работы РефалАБ-компилятора создаются еще два временных файла в рабочей директории: sysut1.rf и sysut2.rf. В конце работы компилятора эти файлы уничтожаются. При нехватке места на диске в процессе компиляции могут появится диагностические сообщения об ошибках в работе с этими файлами.
РефалАБ-программа может использовать не только библиотечные первичные функции, но и собственные. Такие функции находятся в модулях первичных функций. Они написаны на языке Си, поэтому имеют расширение “.c”.
В начале модуля находится директива
#include "refalab.h"
“refalab.h” - это файл заголовков для разработчиков из папки include, который содержит объявления структур, макросов, переменных и функций, необходимых для написания собственных первичных функций и программ на Си.
Потом идут описания собственных первичных функций.
Для компиляции модуля первичных функций в объектный модуль необходимо выполнить команду:
Windows
clang %REFALABCFLAGS% -I%REFALABINCLUDE% -c имя_файла.c -o имя_файла.o
POSIX
clang $REFALABCFLAGS -DPOSIX -I$REFALABINCLUDE -c имя_файла.c -o имя_файла.o
Создание исполняемого файла РефалАБ-программы производится компоновкой объектных модулей, полученных компиляцией РефалАБ-модулей и модулей первичных функций, с помощью редактора связей (компоновщика) через запуск компилятора языка Си clang.
Для создания исполняемого файла РефалАБ-программы, который запускает РефалАБ-программу, необходимо скомпоновать необходимые объектные модули с объектным файлом mainrf.o и библиотекой librefalab.a, скомпилированными из программы и модулей на Си и РефалАБ-модулей, причем РефалАБ-программа вызывается из mainrf.o по имени GO. Данная компоновка производится следующей командой:
Windows
clang -o имя_файла.exe имя_файла1.o ... имя_файлаn.o %REFALABLIB%\obj\mainrf.o -L%REFALABLIB% -lrefalab
POSIX
clang -o имя_файла имя_файла1.o ... имя_файлаn.o $REFALABLIB/obj/mainrf.o -L$REFALABLIB -lrefalab
где имя_файла1 … имя_файлаn - имена объектных модулей, полученных компиляцией РефалАБ-модулей и модулей первичных функций.
Если вызвать исполняемый файл имя_файла, то начнет работать программа mainrf, которая формирует начальное поле зрения вида <GO> и запускает РефалАБ-машину.
Допустим, что требуется запустить РефалАБ-машину, начиная с функции JOB. Тогда в РефалАБ-программе должно быть предложение вида
GO = <JOB>
Если РефалАБ-машина останавливается не по причине нормального останова, то перед завершением работы выводится сообщение о причине останова, количество шагов, поле зрения, копилка, время работы интерпретатора языка сборки.
Команды компиляции, компоновки и запуска можно собрать вместе:
Windows
%REFALABBIN%\refalabc имя_файла1 -a,"-o имя_файла1.o"
.
.
.
clang %REFALABCFLAGS% -I%REFALABINCLUDE% -c имя_файлаn.c -o имя_файлаn.o
clang -o имя_файла.exe имя_файла1.o ... имя_файлаn.o %REFALABLIB%\obj\mainrf.o -L%REFALABLIB% -lrefalab
имя_файла
POSIX
$REFALABBIN/refalabc имя_файла1 -a,"-o имя_файла1.o"
.
.
.
clang $REFALABCFLAGS -DPOSIX -I$REFALABINCLUDE -c имя_файлаn.c -o имя_файлаn.o
clang -o имя_файла имя_файла1.o ... имя_файлаn.o $REFALABLIB/obj/mainrf.o -L$REFALABLIB -lrefalab
./имя_файла
Для создания исполняемого файла РефалАБ-программы, который запускает РефалАБ-программу в режиме отладки, необходимо при компоновке заменить библиотеку librefalab.a на библиотеку librefalab_dbg.a:
Windows
clang -o имя_файла.exe имя_файла1.o ... имя_файлаn.o %REFALABLIB%\obj\mainrf.o -L%REFALABLIB% -lrefalab_dbg
POSIX
clang -o имя_файла имя_файла1.o ... имя_файлаn.o $REFALABLIB/obj/mainrf.o -L$REFALABLIB -lrefalab_dbg
где имя_файла1 … имя_файлаn - имена объектных модулей, полученных компиляцией РефалАБ-модулей и модулей первичных функций.
Отличие режима отладки от обычного режима в том, что в режиме отладки выводится отладочная информация. И, если РефалАБ-машина останавливается по причине нормального останова, то перед завершением работы выводится сообщение “Concretization is executed”, количество шагов, поле зрения, копилка, время работы интерпретатора языка сборки.
Для отладки РефалАБ-программы используется отладчик РефалАБ-программы.
Для создания исполняемого файла отладчика РефалАБ-программы, который запускает отладчик РефалАБ-программы, необходимо скомпоновать необходимые объектные модули с объектным файлом rfdbg.o и библиотекой librefalab.a, скомпилированными из программы и модулей на Си и РефалАБ-модулей, причем отладчик вызывается из rfdbg.o, а отладчик вызывает РефалАБ-программу по имени GO. Данная компоновка производится следующей командой:
Windows
clang -o имя_файла.exe имя_файла1.o ... имя_файлаn.o %REFALABLIB%\obj\rfdbg.o -L%REFALABLIB% -lrefalab
POSIX
clang -o имя_файла имя_файла1.o ... имя_файлаn.o $REFALABLIB/obj/rfdbg.o -L$REFALABLIB -lrefalab
где имя_файла1 … имя_файлаn - имена объектных модулей, полученных компиляцией РефалАБ-модулей и модулей первичных функций.
Для создания исполняемого файла отладчика РефалАБ-программы, который запускает отладчик РефалАБ-программы в режиме отладки, необходимо при компоновке заменить библиотеку librefalab.a на библиотеку librefalab_dbg.a:
Windows
clang -o имя_файла.exe имя_файла1.o ... имя_файлаn.o %REFALABLIB%\obj\rfdbg.o -L%REFALABLIB% -lrefalab_dbg
POSIX
clang -o имя_файла имя_файла1.o ... имя_файлаn.o $REFALABLIB/obj/rfdbg.o -L$REFALABLIB -lrefalab_dbg
где имя_файла1 … имя_файлаn - имена объектных модулей, полученных компиляцией РефалАБ-модулей и модулей первичных функций.
Отличие режима отладки от обычного режима в том, что в режиме отладки выводится отладочная информация.
После вызова исполняемого файла начинает работать программа rfdbg. Она выдает приглашения, в ответ на которые пользователь должен задать управляющую информацию. Затем rfdbg анализирует полученную информацию. Если при этом обнаруживаются ошибки, работа rfdbg заканчивается. Если же ошибок нет, начинается исполнение РефалАБ-программы.
Выдается 11 приглашений:
> (function list):
>= (function list):
= (function list):
!= (function list):
< (function list):
<= (function list):
TRAP (function list):
STOP (step number):
FROM (step number):
TO (step number):
E._= (y/n):
Управляющая информация, задаваемая в ответ на эти приглашения, делится на две группы:
Вся она имеет один из двух форматов:
Обратите внимание, что список имен функций задается через пробел, а не через запятую.
В отладчике РефалАБ-программы имеются средства управления остановом двух типов: STOP-условия, которые позволяют задавать останов по номеру шага, и TRAP-условия, которые позволяют задавать останов по имени функции.
Если в ответ на приглашение:
STOP (step number):
ввести целое число N, то работа РефалАБ-программы прекратится, как только будет выполнено N шагов. Например, если задано
STOP (step number): 30000
то РефалАБ-программа остановится перед началом выполнения шага 30001. Эта возможность полезна в тех случаях, когда отлаживаемая программа зацикливается.
Если STOP не задан, то STOP = 2147483647.
Если в ответ на приглашение
TRAP (function list):
ввести список имен функций
F1 F2 ... Fn
то это будет означать, что когда ведущим станет функциональный терм вида <F1 Ee> или <F2 Ee> и т.д., РефалАБ-программа остановится, не приступая к выполнению очередного шага (здесь F1, F2 … Fn - функции, объявленные ловушками, а Ee - объектное выражение).
Эта возможность полезна в тех случаях, когда требуется выдать состояние поля зрения, копилки и ящиков в момент обращения к одной из функций-ловушек.
Если TRAP-условие задано вместе со STOP-условием, останов произойдет как только будет удовлетворено хотя бы одно из условий.
Выдача протокола о ходе выполнения РефалАБ-программы (прокрутка) дает возможность получать информацию о выполнении отдельных шагов РефалАБ-машины, а также об обращениях к указанным функциям и о результатах этих обращений.
При выдаче информации об отдельном шаге указываются:
При выдаче информации об обращениях к заданным функциям указывается:
Задание на прокрутку может быть двух видов:
Диапазон прокрутки задается с помощью приглашений
FROM (step number):
TO (step number):
в ответ на которые нужно ввести целые числа Nf и Nt.
Задание диапазона означает, что следует выдавать информацию только о тех шагах, номера которых лежат в интервале от Nf до Nt. Выдача информации о тех шагах, номера которых меньше Nf или больше Nt - запрещена. В частности, если Nf>Nt, то никакая информация выдаваться не будет.
Если Nf не задавать, но задать Nt, или хотя бы одно условие прокрутки, то считается, что Nf=1.
Если же задание “TO” не установлено, но определено задание “FROM” или хотя бы одно условие прокрутки, то считается, что Nt=2147483647, т.е. практически “бесконечность”.
Таким образом, если диапазон прокрутки не задан, но задано хотя бы одно условие прокрутки, то Nf=1 и Nt=2147483647.
Если диапазон прокрутки не пуст, и не задано ни одного условия прокрутки, то считается, что следует выдавать информацию обо всех шагах, лежащих в этом диапазоне.
Приведем примеры заданий на прокрутку, состоящих только из указания диапазона.
Пример 1
FROM (step number): 1
Печатается информация обо всех шагах.
Пример 2
FROM (step number): 1000
Печатается информация обо всех шагах, начиная с шага 1000.
Пример 3
TO (step number): 5000
Печатается информация обо всех шагах, начиная с шага 1 до шага 5000 включительно.
Пример 4
FROM (step number): 500
TO (step number): 600
Печатается информация обо всех шагах, начиная с шага 500 до шага 600 включительно.
Теперь рассмотрим, как задаются условия прокрутки.
В то время как диапазон прокрутки накладывает ограничения на номера шагов, для которых должна выдаваться информация, условия прокрутки указывают, какую именно информацию и о каких функциях следует выдавать.
Условия прокрутки задаются в ответ на приглашения:
> (function list):
>= (function list):
= (function list):
!= (function list):
< (function list):
<= (function list):
в виде списка функций F1 F2 … Fn.
Список функций, в частности, может быть пустым. Под именем функции подразумевается то имя, которое она имеет внутри того модуля, в котором она описана, имена функций в списке функций разделяются пробелом.
Смысл управляющей информации:
Каждое условие может задаваться независимо от всех других, но при этом надо учитывать ситуации, которые возникают из-за перекрестного обращения функций друг к другу.
Например:
> (function list): FUNC1 FUNC2
>= (function list): FUNC
= (function list): PSI FI
!= (function list): FI EPS
< (function list): XXX
<= (function list): YYY
Если в приведенном примере FUNC1 вызывает XXX и YYY, то будет выдаваться информация о работе FUNC1 и обо всех вызываемых ею функцций, исключая XXX и YYY, причем об XXX информации не будет никакой, а для YYY будет выдан шаг обращения к ней и сформированное ею поле зрения.
В общем случае условия прокрутки следующим образом истолковываются в процессе исполнения РефалАБ-программы.
Управление прокруткой может находиться в одном из трех состояний: S1, S2 или S3. Оно может переходить из состояния S1 в состояние S2 и обратно, а также из состояния S2 в состояние S3 и обратно. Непосредственный переход из S1 в S3 или из S3 в S1 - невозможен.
Переходами между состояниями S1 и S2 управляют условия “>” и “>=”. Переходами между состояниями S2 и S3 управляют условия “<” и “<=”. Условия “=” и “!=” управляют выдачей информации в состоянии S2. Таким образом, получается следующая схема переходов:
=,!=
------ >,>= ------ <,<= ------
| | ------> | | ------> | |
| S1 | | S2 | | S3 |
| | <------ | | <------ | |
------ ------ ------
В начале работы прокрутка находится в состоянии S1.
Находясь в состоянии S1, прокрутка выполняет РефалАБ-программу до тех пор, пока не встретится обращение к функции, для которой было задано одно из условий “>” или “>=”. Тогда прокрутка переходит в состояние S2, причем, если задано “>=”, но не задано “>”, то выдается обращение к этой функции.
Возврат в состояние S1 происходит только после того, как полностью закончится вычисление обращения к функции, по которому произошел переход из S1 в S2. При этом, если для этой функции было задано “>=”, но не задано “>”, то при возврате в S1 выдается окончательный результат замены, т.е. то выражение, которое возникло в результате полного вычисления обращения к функции.
Находясь в состоянии S2, прокрутка выполняет РефалАБ-программу до тех пор, пока не встретится обращение к функции, для которой было задано условие “<” или “<=”. Тогда прокрутка переходит в состояние S3, причем, если задано “<=”, то выдается обращение к этой функции.
Возврат в состояние S2 из состояния S3 происходит только после того, как полностью закончится вычисление обращения к функции, по которому произошел переход в S3 из S2. При этом, если для этой функции было задано “<=”, но не задано “<”, то при возврате в S2 выдается окончательный результат замены, т.е. то выражение, которое возникло в результате полного вычисления обращения к функции.
Если прокрутка находится в состоянии S2, и для текущей функции не задано ни “<”, ни “<=”, то прокрутка выполняет один шаг и остается в состоянии S2. При этом, если для текущей функции задано условие “=”, то выдается обращение к функции и результат непосредственной замены (результат выполнения шага).
Например, если заданы условия
>= X
= Y1 Y2 Y3
<= Z1 Z2
то выдача будет начинаться при каждом обращении к функции X. Будет выдаваться обращение к X и результат ее полного вычисления. В процессе вычисления X будут выдаваться обращения к Y1, Y2, Y3 и непосредственно результаты замены, а также обращения к Z1 и Z2 и результат полного вычисления этих обращений.
Иногда требуется, чтобы выдавались только обращения к указанным функциям и окончательные результаты замены. Этого можно добиться, задав для них условия “=” и “<=”.
Если задать только условие “<=”, то будет выдаваться информация о всей программе, а о заданных функциях - только обращение к ним и результат их работы.
И, наконец, в тех случаях, когда требуется запустить прокрутку по всем функциям, с первого шага до последнего, можно задать условие “!=” для несуществующей функции.
Легкость отладки РефалАБ-программ в значительной степени обусловлена тем, что различные нарушения в структуре обрабатываемых объектов, как правило, довольно быстро приводят к авосту “Отождествление невозможно”. Однако это приятное свойство утрачивается, если какие-либо функции, написанные на Си, не проверяют правильность аргумента. Поэтому при отладке функций, написанных на Си, необходимо тщательно тестировать как те случаи, когда обращение к функции имеет допустимый вид, так и те случаи, когда аргумент функции задан неверно. Всегда, когда аргумент не принадлежит к области определения функции, эта функция должна вырабатывать авост “Отождествление невозможно”.
Таким образом, всякий тест, предназначенный для проверки функций, написанных на Си, должен включать как правильные, так и заведомо неправильные обращения к этим функциям.
Для прогона таких тестов предусмотрен особый режим “E._=”. Если РефалАБ-программа исполняется в этом режиме, то при возникновении состояния “Отождествление невозможно” выполнение РефалАБ-программы не прекращается. Вместо этого выдается номер текущего шага, предупреждающее сообщение и ведущий функциональный терм. Затем ведущий терм заменяется на пустое выражение, и работа РефалАБ-программы продолжается.
Таким образом, РефалАБ-программа исполняется так, словно в конце каждой функции добавлено предложение
E._ =
Этому обстоятельству режим “E._=” и обязан своим названием.
Для того, чтобы РефалАБ-программа исполнялась в режиме “E._=”, необходимо в ответ на приглашение
E._= (y/n):
ответить “y”.