После запуска ИС HUGS 98 на экране появляется диалоговое окно среды разработчика, автоматически загружается специальный файл предопределений типов и определений стандартных функций на языке Haskell (Prelude.hs) и выводится стандартное приглашение к работе.
Диалоговое окно среды разработчика состоит из главного меню, набора кнопок для быстрого доступа к наиболее часто используемым командам и консоли, где происходит работа с интерпретатором. Необходимо особо отметить, что ИС не позволяет создавать и редактировать файлы с кодами программ, для этого требуется использование любого текстового редактора, поддерживающего обычный стандарт TXT (этим редактором, например, может быть стандартный блокнот Windows).
Рис. 1.
Главное окно ИС HUGS 98
Главное окно HUGS 98 (рис. 1) обеспечивает доступ ко всем командам ИС, используемым для интерпретации и отладки программ. Кроме того, ИС позволяет вызвать на редактирование открытые модули в стандартном окне Notepad, встроенном в операционную систему Windows любой версии.
На панели инструментов, находящейся слева на главном диалоговом окне, предоставлены кнопки, при помощи которых можно вызвать наиболее часто используемые в процессе разработки команды (конечно, с точки зрения разработчиков ИС HUGS 98, а не с точки зрения конечного пользователя). Ниже представлены краткие описания всех четырнадцати кнопок, которые можно найти на панели инструментов.
Загрузка модулей из внешних файлов. Позволяет выбрать и открыть файл, из которого загружаются все модули, обнаруживаемые интерпретатором в этом файле. |
|
Вызов менеджера модулей. Менеджер модулей позволяет добавлять, удалять и редактировать загруженные в память ИС программные модули. |
|
Вырезать выделенный текст. Стандартная функция редактирования текстов. Удаляет из редактора выделенный текст и помещает его в буфер обмена операционной системы. |
|
Скопировать выделенный текст в буфер обмена. Стандартная функция редактирования текстов. Копирует выделенный текст в буфер обмена операционной системы. |
|
Вставить текст из буфера обмена. Стандартная функция редактирования текстов. Вставляет в редактируемый тест содержимое буфера обмена операционной системы. |
|
Очистить выбранный текст. Стандартная функция редактирования текстов. Удаляет из редактора выделенный текст, не помещая его в буфер обмена операционной системы. |
|
Запустить внешний редактор текста. Запускает внешний тектовый редактор, зарегистрированный в операционной системе. Для семейства Windows при нажатии на эту кнопку запускается стандартная программа Notepad. |
|
Запуск на выполнение выражения «main». Исполняет функцию main в загруженных модулях (конечно, если такая функция обнаружена в модулях). Если функция main не обнаружена ни в одном из загруженных мдулей, то выдаётся ошибка: ERROR — Undefined variable "main". |
|
Остановка исполнения программы. Остановка выполнения любой запущенной функции. Используется, например, для прекращения вычисления бесконечного списка. |
|
Перезагрузка всех файлов текущего проекта. Осуществляет перезагрузку всех файлов с целью загрузить в память интерпретатора все сделанные изменения в коде проекта. |
|
Установка параметров интерпретатора. Вывод на экран диалогового окна установки набора параметров интерпретатора языка Haskell. О параметрах интерпретатора подробно описано в приложении В. |
|
Вывод на экран иерархии классов. На экране появляется иерархия классов текущего проекта, показанная в виде множества прямоугольников с названиями (классы) и связей между ними (отношения наследования). |
|
Вызов справки. Вызывает на экран стандартное диалоговое окно справочной информации. Предполагается, что все справочные файлы присутствуют в каталоге, где установлено ИС (эти файлы не входят в стандартную поставку HUGS 98). |
|
Выход из программы. Осуществляет выход из ИС HUGS 98 в операционную систему. |
Консоль ИС HUGS 98 предоставляет небольшой набор служебных конструкций, позволяющих управлять работой ИС. Многие из этих команд дублируют действия кнопок на панели инструментов и некоторые пункты главного меню приложения. Однако в любом случае эти команды могут позволить профессиональным пользователям значительно ускорить процесс разработки.
Каждая команда начинается с символа «двоеточие» — «:». Это сделано для того, чтобы отличить встроенные команды от написанных разработчиками функций. Кроме того, ИС позволяет сокращать каждую команду вплоть до одной буквы, набрав только символ «двоеточие» и собственно первую букву команды.
Всего существует девятнадцать команд, ниже представлено подробное описание каждой из них.
:load [<filenames>]
Загружает программные модули из заданных файлов (имена файлов можно разделить пробелом). Дублирует кнопку загрузки модулей на панели инструментов. Если имена файлов отсутствуют, то происходит выгрузка всех модулей, кроме стандартного (Prelude.hs). При повторном использовании команды все ранее загруженные модули выгружаются из памяти интерпретатора.
:also <filenames>
Подгружает дополнительные модули в текущий проект. Имена файлов должны быть разделены пробелами (если указывается более чем один файл).
:reload
Повторяет последнюю выполненную команду загрузки (:load). Позволяет быстро выполнить перезагрузку модуля в случае, если он редактируется во внешнем текстовом редакторе.
:project <filename>
Загружает и использует файл проекта. Загрузить можно только один файл. Файлы проекта используются для объединения разрозненных файлов с кодом. При повторном использовании команды происходит выгрузка всех файлов (как проектных, так и обычных) из памяти интерпретатора.
:edit [<filename>]
Вызывает внешний текстовый редактор для исправления указанного файла. Если имя файла не указано, то на редактирование вызывается последний файл (загруженный или редактированный). Данная команда дублирует кнопку вызова внешнего текстового редактора на панели инструментов.
:module <module>
Устанавливает заданный модуль в качестве текущего для выполнения функций. Эта команда предназначена, в первую, очередь для разрешения коллизий имён.
<expr>
Запуск заданного выражения на выполнение. Например, команда main запустит на выполнение соответствующую функцию — main, что произведёт дублирование кнопки с панели инструментов.
:type <expr>
Выводит на экран тип заданного выражения. Эта команда используется, главным образом, в отладочных целях для быстрого получения типа создаваемого выражения (переменной, функции, сложного объекта).
:?
Выводит на экран список команд с кратким описанием.
:set [<options>]
Позволяет задать параметры ИС с командной строки. Дублирует действие диалогового окна настройки HUGS 98 (описание которого приведено в приложении В). Все возможные параметры этой команды (<options>) выводятся на экран при выполнении этой команды без каких-либо параметров.
:names [pat]
Выводит на экран список всех имён объектов, которые находятся в текущем (если не задано иное) пространстве имён.
:info <names>
Выводит на экран описание заданных имён объектов. Например, для функций выводит их тип вместе с именем заданной функции.
:browse <modules>
Выводит на экран список всех объектов (функций, переменных, типов), определённых в заданных модулях. Имена модулей должны быть разделены пробелом (в случае, если указано более одного имени модуля).
:find <name>
Вызывает на редактирование модуль, содержащий заданное имя. Если заданного имени нет ни в одном из текущих модулей, то выдаётся собщение об ошибке: ERROR — No current definition for name "<name>".
:!<command>
Выходит в операционную систему и выполняет заданную команду. Необходимо особо отметить, что между символом «восклицательный знак» и именем команды операционной системы должен отсутствовать пробел.
:cd <directory>
Изменяет текущий каталог, с которым работает HUGS 98.
:gc
Принудительно запускает на выполнение процесс сборки мусора. После этого выводит на экран статистику о собранных и восстановленных ячейках памяти.
:version
Выводит на экран информацию о версии установленного интерпретатора языка Haskell и ИС HUGS 98.
:quit
Осуществляет выход в операционную систему. Дублирует кнопку на панели инструментов.
ИС HUGS 98 предоставляет разработчику несколько дополнительных возможностей для отладки программ, которые во многих случаях облегчают разработку и позволяют более обширно «оглядеть» созданное приложение. К таким дополнительным возможностям относятся просмотр классов, просмотр зарегистрированных имён объектов, просмотр конструкторов типов и просмотр иерархии классов.
Далее подробно рассматривается каждая из этих дополнительных возможностей, однако перед этим необходимо разъяснить значения обозначений, применяемых во всех инструментах по просмотру. Итак, к таким обозначениям относятся разноцветные пиктограммы прямоугольного формата с определённой буквой внутри. Всего таких пиктограмм девять:
· Синий прямоугольник с буквой C — обозначение класса (от английского class).
· Красный прямоугольник с буквой I — обозначение экземпляра класса (от английского instance).
· Розовый прямоугольник с буквой M — обозначение функции-члена класса (от английского member).
· Синий прямоугольник с буквой N — обозначение имени функции (от английского name).
· Красный прямоугольник с буквой P — обозначение примитива (от английского primitive). Примитив отличается от обычной функции тем, что его определения нет в файле, а встроено в интерпретатор. Примитивы присутствуют только в файле Prelude.hs.
· Зелёный прямоугольник с буквой C — обозначение конструктора типа (от английского constructor).
· Синий прямоугольник с буквой D — обозначение типа данных (от английского data).
· Красный прямоугольник с буквой S — обозначение встроенного типа.
· Розовый прямоугольник с буквой N — обозначение описания нового типа (от английского new type).
При помощи инструмента для просмотра классов разработчик может изучить список созданных классов, список функций-членов каждого класса (если они есть) и список экземпляров каждого класса (также, если они есть). Внешний вид этого инструмента можно видеть на рис. 2.
Рис. 2. Диалоговое окно просмотра классов
В левом столбце представлен список созданных классов. При выделении какого-то определённого класса в правом поле появляется список функций-членов класса, а в нижнем поле — список экземпляров класса. В поле «Superclasses» появляются базовые классы для выделенного класса (если они есть).
Это диалоговое окно предоставляет возможность автоматического перехода на описание выделенного класса или выделенного экземпляра класса для их редактирования (при использовании кнопок «Edit class» и «Edit instance» соответственно). Кроме того, можно перейти к просмотру иерархии классов (при помощи нажатия на кнопку «Hierarchy»).
При помощи инструмента для просмотра зарегистрированных имён объектов программист может изучить список всех имён, встречающихся во всех загруженных модулях. К именам относятся имена функций, имена примитивов (тех функций, реализация которых зашита внутри интерпретатора), имена конструкторов данных и имена функций-членов классов. Внешний вид этого инструмента представлен на рис. 3.
Рис. 3. Диалоговое окно просмотра имён
В верхнем поле представлен список всех имён с соответствующей пиктограммой, обозначающей природу имени. При помощи строки поиска можно осуществить инкрементный поиск по всему списку — при вводе очередной буквы курсор в списке перемещается на первое имя, которое начинается на введённую последовательность символов. В двух нижних полях предоставляется дополнительная информация о выделенном имени — его тип и комментарии (если они присутствуют в описании).
Это диалоговое окно предоставляет разработчику возможность быстро перейти к редактированию выделенного имени при помощи нажатия на кнопку «Edit name».
Рис. 4. Диалоговое окно просмотра конструкторов типов
При помощи инструмента для просмотра конструкторов типов
разработчик может изучить список всех конструкторов, которые встречаются во
всех загруженных модулях. К конструкторам относятся конструкторы данных
(служебное слово data),
описания встроенных типов (служебное слово type) и конструкторы новых типов (служебное слово newtype). Внешний вид этого
инструмента представлен на рис. 4.
В верхнем поле представлен список всех имён конструкторов типов с соответствующей пиктограммой, обозначающей природу конструктора. При помощи строки поиска можно осуществить инкрементный поиск по всему списку — при вводе очередной буквы курсор в списке перемещается на первое имя, которое начинается на введённую последовательность символов. В поле «Type» приводится определение соответствующего типа. В двух нижних полях предоставляется информация о конструкторах и селекторах выделенного типа, а также об экземплярах типа (если они есть).
При помощи этого диалогового окна разработчик может быстро перейти к редактированию выделенного конструктора (при нажатии на кнопку «Edit type») или к редактированию выделенного экземпляра типа (при помощи нажатия на кнопку «Edit instance»).
Просматривая иерархию классов, программист может увидеть отношения наследования между созданными классами. Необходимо отметить, что алгоритм прорисовки классов и отношений в HUGS 98 несколько неадекватен, поэтому для более полного понимания от программиста требуется либо чутьё, либо способность быстро разбросать все классы по диалоговому окну, создав планарный граф.
Это диалоговое окно можно вызвать не только из главного меню приложения, но и из диалогового окна для просмотра списка классов.
На рис. 5 показана иерархия классов из файла Prelude.hs. Как видно из рисунка в этом файле определены классы эквивалентности (все, которые наследуют свойства класса Eq) и классы-монады (Monad, Functor, Read и Bounded).
Рис. 5. Иерархия классов из файла Prelude.hs