Оглавление

Благодарности
Структура проекта
  Файлы и каталоги входящие в поставку
  Файлы скачиваемые отдельно
  Файлы и каталоги создаваемые в процессе работы
Использование build-скрипта
  Определенные цели
Автоматическое обращение шагов типа step
Использование SaveLoadDialog
Использование SmartTokenizer
Автоматическая проверка автоматов
Использование переменных
JavaBeans
  Соглашение о формате конфигурации
  Конфигурация бина
Отладка визуализатора
  Отладка визуализируемой программы
  Отладка системы автоматов
Важные замечания

Об ошибках сообщайте по адресу kgeorgiy@rain.ifmo.ru

Благодарности

Выражаю благодарность всем, кто помог мне в осущуствлении проекта Vizi. В частности:
Сергею Ефимовичу Столяру За предложение разрабатывать данную область.
Анатолию Абрамовичу Шалыто За идею использовать автоматы при программировании логики визуализаторов.
Матвею Казакову За опробывание идеи использования автоматов при программировании логики визуализаторов.
Андрею Станкевичу За предложение названия "Vizi".
Владимиру Котову За исходную версию AboutDialog, выявление ошибки в реализации обращения while и другую помощь.

Структура проекта

Файлы и каталоги входящие в поставку

docs/ Документация по Vizi
  readme.html Этот файл
  WhatsNew.html Что уже сделано
  ToDo.txt Что еще нужно сделать
meta/ Файлы необходимые для работы Vizi
  scripts Содержит build файл и xsl скрипты
  vizi-<version>.jar Билд текущей версии Vizi
projects/ Проекты, входящие в поставку
  FindMaximum/ Визуализатор алгоритма нахождения максимума (пример)
  vizi/ Исходные коды Vizi
ant.bat Запускает build-скрипт
build.properties Конфигурация build-скрипта в строчке project= укажите путь к свойствам проекта (исходно — к проекту FindMaximum).

Файлы скачиваемые отдельно

meta/bin/ Apache Ant (http://ant.apache.org).
Если Ant находится в другом месте, должна быть установлена переменная окружения ANT_HOME.
meta/classes-1.1.8.jar Java-классы от JDK v.1.1.8 используются для проверки визуализатора на совместимость.

Файлы и каталоги создаваемые в процессе работы

build/ Создается при построении проекта. Содержит автоматически сгенерированные файлы.
  jars/ Содержит откомпилированные классы и сконвертированные .property файлы.
  properties/ Содержит автоматически создаваемые .property файлы.
  temp/ Содержит временные файлы.
deploy/ Содержит автоматически сгенерированные HTML и cmd файлы для проектов на русском и английском языка и jar файлы для Vizi и визуализатора.
  vizi-<version>.jar Запакованный Vizi.
  <имя визуализатора>.jar Запакованный визуализатор.
  <имя визуализатора>_*.html HTML с визуализатором на соответсвующем языке.
  <имя визуализатора>_*.cmd Скрипт запуска визуализатора из командной строки.

Использование build-скрипта

Для запуска build-скрипта используется файл ant.bat с параметром, определяющим что требуется сделать. По умолчанию используется цель all.

Определенные цели

Компиляция визуализатора
all Генерирует исходники автомата, файлы сообщения, компилирует проект, создает .jar и .html файлы.
См. описания целей jars, cmds, htmls.
jars Компилирует проект и создает jar-файлы с визуализатором.
Если в каталоге проекта находится файл classes-1.1.8.jar, то при компиляции осущетсвляется проверка на использование только методов и классов определенных в jdk 1.1.8.
cmds Создает командные файлы для запуска визуализатора как самостоятельного приложения.
htmls Создает html-файлы для запуска визуализатора.
Компиляция документации к визуализатору
docs Создает документацию к визуализатору (см. цели docs-config, docs-stats и docs-javadoc).
docs-config Создает документацию по конфигурации визуализатора.
docs-stats Подсчитывает статистику по визуализатору.
docs-javadoc Создает JavaDoc по исходному коду визуализатора.
Отладка визуализатора
debug-check Создает командный файл для автоматической проверки правильности генирирования обратных автоматов.
debug-source Создает plain-java исходник по описанию алгоритма.
Компиляция Vizi
vizi Компилирует библиотеку Vizi.
vizi-javadoc Компилирует JavaDoc файлы для Vizi.
Прочее
clean Удаляет автоматически созданные каталоги.
help Выдает краткое описание целей на английском языке.

Автоматическое обращение шагов типа step

Для автоматического обращения шагов типа <step>. Треуется записать их с использование тега <action> вместо тэга <direct>.

Все присваивания переменным модели, записываются в обратимом виде:
  @<имя переменной> @= <выражение>
либо
  @<имя переменной>[<индекс>] @= <выражение>

Например:
  @max @= @a[@i];
  @i @= @i + 1; // Вместо @i++;
  @a[@i] @= @i;
  @a.b[@z[i][j]] @= @q[i][j];

Для присваиваний, осуществленных в теге <action> будет сгенирирован код их обращающий.

ПРИМЕЧАНИЕ: Присваивания не переменным модели нельзя записывать указанным образом.

ПРИМЕЧАНИЕ: В одном шаге нельзя одновременно использовать <action> и <direct> или <action> и <reverse>.

Использование SaveLoadDialog

SaveLoadDialog позволяет унифицировать окна сохраниения/восстановления состояния визуализатора. При этом он определяет возможность работы с файлами и буфером обмена и отражает соответствующие элементы интерфейса.

Для использования SaveLoadDialog вы создаете класс унаследованный от него и определяющий метод load. Метод load может возвращать логическое значение или бросать исключение. Если метод вернул "true", то SaveLoadDialog закрывается. Если метод бросил исключение, то сообщения этого исключения отображается в строке комментария, что позволяет генерировать сообщение в месте обнаружения ошибки.

Для SaveLoadDialog определены следующие свойства:
comment - комментарий отображаемый в строке комментария.
content - текущее содержимое.
initialContent - исходной содержимое (используется при нажатии на кнопку "вернуть".

При конфигурации доступны следующие параметры:
SaveLoadDialog  
  -CommentPane-lines Высота области комментария в строках
  -columns Исходное количество столбцов в области ввода
  -rows Исходное количество строк в области ввода

Использование SmartTokenizer

SmartTokenizer позволяет в удобном виде разбирать данные полученые от SaveLoadDialog. Он позволяет легко читать числа (целые и вещественные) и строчки. При этом, выводятся локализованные сообщения об ошибках. Так же возможна проверка на окончение ввода. При разборе игнорируются комментарии (как /* */ так и //). При заключении строки в кавычки она считывается как одно слово.

SmartTokenizer удобно использовать непосредственно в методе load SaveLoadDialog, так как при этом практически не придется делать обработку ошибок.

Автоматическая проверка автоматов

В Vizi входит автоматический проверяльщик автоматов на правильность обращения.

Для использования проверяльщика запустивть build-скрипт с параметром check. При этом, в каталоге deploy будет создан файл вида Check<имя визуализатора>.cmd. Этот при запуске получившегося файла указыватся размер (уровень) шага проверки. Проверяльщик прогоняет визуализатор до всех шагов указанного уровня и проверяет правильность обращения.

Для использования проверяльщика в вашу модель данных должны быть включены значения переменных по умолчанию, задающих пример на котором производится проверка.

Если при проверке вы получаете NullPointerException, то скорее всего это означает, что переменная апплета используется не только для рисования, что не правильно.

Использование переменных

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

Глобальные переменные определяются в описании алгоритма (<algorithm>), а не в модели данных (<data>) как раньше. Глобальные переменные доступны во всех автоматах, если в них не объявлена локальная переменная с тем же именем.

Локальные переменные определяются в описании автомате (<auto>), и доступны внутри только этого автомата.

Для обращения к переменным используется синтаксис
  @<имя переменной>
На пример:
  @max @= @a[@i];
при этом осуществляется обратимое присваивание переменной max значения i-го элемента массива a. Имя переменной, хранящей модель данных не используется в явном виде, а подставляется автоматически.

Для обращения к локальным переменным автоматов в процедуре toString введен синтаксис
  @<имя автомата>@<имя переменной>
На пример:
  buffer.append(@Main@i);
при этом осуществляется добавление к буфферу значения локальной переменной i автомата Main.

Для доступа к переменным модели из кода визуализатора используется синтаксис
  <модель>.<имя переменной>
для глобальных переменных и
  <модель>.<имя автомата>_<имя переменной>
для локальных переменных. На пример:
  data.max = 0;
  System.out.println(data.Main_i);

JavaBeans

Начиная с Vizi версии 0.4 идет миграция в сторону использования JavaBeans. Все стандартные компоненты из пакетов ru.ifmo.vizi.base.ui и ru.ifmo.vizi.base.widgets со временем будут превращены в бины. Всвязи с этим будут переименованы некоторые методы и переработаны некоторые классы.

Соглашение о формате конфигурации

С версии 0.4 вступает в силу новое соглашение о наименовании конфигурационных параметров, согласованное с JavaBeans.

Полное имя параметра (например delay-incrementButton-hint) состоит из имен отдельных праметров, разделяемых дефисами (в данном примере delay, incrementButton и hint). Во всех остальных случаях дефисы не используются. Имя параметра является правльным Java-идентификатором и конструируется как имя переменной: каждое слово, кроме первого начинается с большой буквы, слова ни чем не разделяются, сокращения пишутся как есть (например delay, incrementButton, myURL).

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

Конфигурация бина

У каждого JavaBeanа есть набор свойств. Для каждого свойства определены getter и/или setter. Getter имеет имя get<имя свойства>, а setterset<имя свойства>. Например для свойства font они называются getFont и setFont соответственно.

Свойства бывают простыми и составными, в зависимости от типа. Простые свойства это все простые типы и типы Color и String (значения эти типов можно записать одной строкой). Составные свойства, это все остальные совйства, например типов Button и Font.

Конфигурация бина является набором значений его свойств. Указанные значения устанавливаются с помощью setterов. Соответсвенно смысл свойства можно узнать, прочитав описание соотвествующего setterа. Просмотрев все setterы можно узнать все конфигурируемые свойства бина.

Отладка визуализатора

Отладка XML-описания визуализатора состоит из двух этапов:

  1. отладка визуализируемой программы;
  2. отладка сгенерированной системы автоматов.
На первом этапе осуществляется поиск ошибок переноса визуализируемой программы в XML-описание, а на втором этапе — отладка автоматически построенной программы визуализации.

Отладка визуализируемой программы

Для упрощения отладки визуализируемой программы предназначена цель debug-source, определенная в build-сценарии, которая строит реализацию визуализируемой программы, без использования конечных автоматов.

Для каждого автомата (тег <auto>) создается процедура с именем соответсвующим идентификатору автомата. Элементы if и while преобразуются в соответствующий операторы, а step и call-auto в части кода и вызовы процедур соответственно.

В полученном исходный код переносятся комментарии из XML-описания. Сгенерированный код помещается в файл с именем указанным в XML-описании с добавленным суффиксом Debug. Полученный исходный код может отлаживаться с использованием любого программного инструмента.

Отладка системы автоматов

Отладка сгенерированной системы автоматов производится при помощи валидатора. Для его использования служит цель debug-check, определенная в build-сценарии. Она создает командный файл служащий для запуска валидатора и помещает его в каталок файлов визулизатора.

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

При запуске валидатор выводит номер текущего шага и комментарий к нему в стандартный поток вывода. При обнаружении ошибки в стандартный поток вывода выдается отладочная информация:

При этом валидатор завершается кодом возврата 1, в отличие от нормального завершения, когда код возврата равен 0.

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

При запуске валидатора ему можно передать до двух параметров. Первый из них означает шаги с каким уровнем проверять (по умолчанию -1), а второй — с какого шага начинать проверку (по умолчанию 0). Таким образом проверка может осуществляется следующим образом: сначала быстрая проверка на больших шагах, затем, при обнаружении ошибка локализуется с использованием маленьких шагов.

Важные замечания

  1. Обращение к экземпляру апплета должно происходить только из кода рисования (тега <draw>).
  2. Все стили фигур (ShapeStyle) нужно получать из конфигурации, а не пытаться создать в визуализаторе.
  3. Присваивания не переменным модели нельзя записывать в обратимом виде (см. Автоматическое обращение шагов типа step).
  4. В одном шаге нельзя одновременно использовать <action> и <direct> или <action> и <reverse> (см. Автоматическое обращение шагов типа step).