Основы работы с HUGS 98

После запуска ИС HUGS 98 на экране появляется диалоговое ок­но среды разработчика, автоматически загружается спе­ци­аль­ный файл предопределений типов и определений стандартных функ­ций на языке Haskell (Prelude.hs) и выводится стандартное при­глашение к работе.

Диалоговое окно среды разработчика состоит из главного ме­ню, набора кнопок для быстрого доступа к наиболее часто ис­поль­зуемым командам и консоли, где происходит работа с ин­тер­претатором. Необходимо особо отметить, что ИС не поз­во­ля­ет создавать и редактировать файлы с кодами программ, для это­го требуется использование любого текстового редактора, под­дер­живающего обычный стандарт TXT (этим редактором, нап­ри­мер, может быть стандартный блокнот Windows).

Рис. 1. Главное окно ИС HUGS 98

Главное окно HUGS 98 (рис. 1) обеспечивает доступ ко всем ко­мандам ИС, используемым для интерпретации и отладки прог­рамм. Кроме того, ИС позволяет вызвать на редактирование от­крытые модули в стандартном окне Notepad, встроенном в опе­рационную систему Windows любой версии.

2.1. Панель инструментов HUGS 98

На панели инструментов, находящейся слева на главном ди­а­ло­говом окне, предоставлены кнопки, при помощи которых мож­но вызвать наиболее часто используемые в процессе раз­ра­бот­ки команды (конечно, с точки зрения разработчиков ИС HUGS 98, а не с точки зрения конечного пользователя). Ниже пред­ставлены краткие описания всех четырнадцати кнопок, ко­то­рые можно найти на панели инструментов.

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

Вызов менеджера модулей. Менеджер модулей поз­во­ля­ет добавлять, удалять и редактировать загруженные в па­мять ИС программные модули.

Вырезать выделенный текст. Стандартная функция ре­дак­тирования текстов. Удаляет из редактора выделенный текст и помещает его в буфер обмена операционной сис­те­мы.

Скопировать выделенный текст в буфер обмена. Стан­дартная функция редактирования текстов. Копирует вы­деленный текст в буфер обмена операционной сис­те­мы.

Вставить текст из буфера обмена. Стандартная функ­ция редактирования текстов. Вставляет в редактируемый тест содержимое буфера обмена операционной системы.

Очистить выбранный текст. Стандартная функция ре­дак­тирования текстов. Удаляет из редактора выделенный текст, не помещая его в буфер обмена операционной сис­темы.

Запустить внешний редактор текста. Запускает внеш­ний тектовый редактор, зарегистрированный в опе­ра­ци­он­ной системе. Для семейства Windows при нажатии на эту кнопку запускается стандартная программа Notepad.

Запуск на выполнение выражения «main». Исполняет функ­цию main в загруженных модулях (конечно, если та­кая функция обнаружена в модулях). Если функция main не обнаружена ни в одном из загруженных мдулей, то выдаётся ошибка: ERROR — Undefined variable "main".

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

Перезагрузка всех файлов текущего проекта. Осу­щес­т­вляет перезагрузку всех файлов с целью загрузить в па­мять интерпретатора все сделанные изменения в коде про­екта.

Установка параметров интерпретатора. Вывод на эк­ран диалогового окна установки набора параметров ин­тер­претатора языка Haskell. О параметрах ин­тер­пре­та­то­ра подробно описано в приложении В.

Вывод на экран иерархии классов. На экране по­яв­ля­ет­ся иерархия классов текущего проекта, показанная в ви­де множества прямоугольников с названиями (классы) и связей между ними (отношения наследования).

Вызов справки. Вызывает на экран стандартное ди­а­ло­го­вое окно справочной информации. Предполагается, что все справочные файлы присутствуют в каталоге, где ус­тановлено ИС (эти файлы не входят в стандартную пос­тавку HUGS 98).

Выход из программы. Осуществляет выход из ИС HUGS 98 в операционную систему.

2.2. Команды консоли 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 de­fi­ni­ti­on for name "<name>".

:!<command>

Выходит в операционную систему и выполняет заданную ко­ман­ду. Необходимо особо отметить, что между символом «вос­кли­цательный знак» и именем команды операционной системы дол­жен отсутствовать пробел.

:cd <directory>

Изменяет текущий каталог, с которым работает HUGS 98.

:gc

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

:version

Выводит на экран информацию о версии установленного ин­тер­претатора языка Haskell и ИС HUGS 98.

:quit

Осуществляет выход в операционную систему. Дублирует кноп­ку на панели инструментов.

2.3. Дополнительные возможности для отладки

ИС HUGS 98 предоставляет разработчику несколько до­пол­ни­тельных возможностей для отладки программ, которые во мно­гих случаях облегчают разработку и позволяют более об­шир­но «оглядеть» созданное приложение. К таким до­пол­ни­тель­ным возможностям относятся просмотр классов, просмотр за­ре­гис­трированных имён объектов, просмотр конструкторов типов и просмотр иерархии классов.

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

·        Синий прямоугольник с буквой C — обозначение класса (от английского class).

·        Красный прямоугольник с буквой I — обозначение эк­зем­пля­ра класса (от английского instance).

·        Розовый прямоугольник с буквой M — обозначение функ­ции-члена класса (от английского member).

·        Синий прямоугольник с буквой N — обозначение имени функ­ции (от английского name).

·        Красный прямоугольник с буквой P — обозначение при­ми­тива (от английского primitive). Примитив отличается от обыч­ной функции тем, что его определения нет в файле, а встро­ено в интерпретатор. Примитивы присутствуют только в файле Prelude.hs.

·        Зелёный прямоугольник с буквой C — обозначение кон­с­т­рук­тора типа (от английского constructor).

·        Синий прямоугольник с буквой D — обозначение типа дан­ных (от английского data).

·        Красный прямоугольник с буквой S — обозначение встро­ен­ного типа.

·        Розовый прямоугольник с буквой N — обозначение опи­са­ния нового типа (от английского new type).

2.3.1. Просмотр классов

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

Рис. 2. Диалоговое окно просмотра классов

В левом столбце представлен список созданных классов. При вы­делении какого-то определённого класса в правом поле по­яв­ля­ется список функций-членов класса, а в нижнем поле — спи­сок экземпляров класса. В поле «Superclasses» появляются ба­зо­вые классы для выделенного класса (если они есть).

Это диалоговое окно предоставляет возможность ав­то­ма­ти­чес­кого перехода на описание выделенного класса или вы­де­лен­но­го экземпляра класса для их редактирования (при ис­поль­зо­ва­нии кнопок «Edit class» и «Edit instance» соответственно). Кроме то­го, можно перейти к просмотру иерархии классов (при по­мо­щи нажатия на кнопку «Hierarchy»).

2.3.2. Просмотр зарегистрированных имён объектов

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

Рис. 3. Диалоговое окно просмотра имён

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

Это диалоговое окно предоставляет разработчику воз­мож­ность быстро перейти к редактированию выделенного имени при помощи нажатия на кнопку «Edit name».

Рис. 4. Диалоговое окно просмотра конструкторов типов

2.3.3. Просмотр конструкторов типов

При помощи инструмента для просмотра конструкторов ти­пов разработчик может изучить список всех конструкторов, ко­то­рые встречаются во всех загруженных модулях. К кон­с­т­рук­то­рам относятся конструкторы данных (служебное слово data), опи­сания встроенных типов (служебное слово type) и кон­с­т­рук­то­ры новых типов (служебное слово newtype). Внешний вид это­го инструмента представлен на рис. 4.

В верхнем поле представлен список всех имён конструкторов ти­пов с соответствующей пиктограммой, обозначающей при­ро­ду конструктора. При помощи строки поиска можно осу­щес­т­вить инкрементный поиск по всему списку — при вводе оче­ред­ной буквы курсор в списке перемещается на первое имя, которое на­чинается на введённую последовательность символов. В поле «Type» приводится определение соответствующего типа. В двух ниж­них полях предоставляется информация о конструкторах и се­лекторах выделенного типа, а также об экземплярах типа (ес­ли они есть).

При помощи этого диалогового окна разработчик может быс­т­ро перейти к редактированию выделенного конструктора  (при на­жатии на кнопку «Edit type») или к редактированию вы­де­лен­но­го экземпляра типа (при помощи нажатия на кнопку «Edit instance»).

2.3.4. Просмотр иерархии классов

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

Это диалоговое окно можно вызвать не только из главного ме­ню приложения, но и из диалогового окна для просмотра спис­ка классов.

На рис. 5 показана иерархия классов из файла Prelude.hs. Как вид­но из рисунка в этом файле определены классы эк­ви­ва­лен­т­нос­ти (все, которые наследуют свойства класса Eq) и классы-мо­на­ды (Monad, Functor, Read и Bounded).

Рис. 5. Иерархия классов из файла Prelude.hs