ПРОБЛЕМНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ ВЕКТОРНОЙ ГРАФИКИ
Введение. С появлением вычислительной техники создано великое множество языков программирования. Из года в год, разрабатывая новые конструкции, внедряя их в прошлые наработки, появляются более гибкие и удобные средства человеко-машинного взаимодействия. Каждый язык имеет свои достоинства и недостатки (скорость выполнения, объем занимаемой памяти, соответствие/несоответствие решению конкретных задач), что и является предпосылкой для дальнейшего развития языков.   
Одним из подобного рода специальных направлений являются языки программирования векторной графики [1; 2; 5]. Они рассматриваются как проблемно-ориентированные или узкоспециализированные, главной задачей которых является работа с векторными изображениями любой сложности. Такие изображения, по сравнению с растровыми, могут масштабироваться без потерь и занимать значительно меньше памяти. 
Редакторы векторной графики представляют собой набор инструментов, упрощающий процесс рисования. С помощью редакторов можно вращать, перемещать, отражать, растягивать, выполнять основные аффинные преобразования над объектами, изменять их порядок и комбинировать примитивные в более сложные объекты. 
Работа с таким программным обеспечением выполняется с помощью мыши, графического планшета или клавиатуры. Последний подход встречается чаще. 
Обзор реализованных решений. С помощью рассматриваемых различных языков описания векторной графики можно создавать, хранить и редактировать векторные изображения [6]. 
Одним из таких инструментов является язык описания страниц PostScript (PS) [7; 8], который в основном используется в издательских системах. В 1982 году Adobe разработал его для использования в принтерах как альтернатива растровым изображениям. Он реализован в виде небольшой серии текстовых команд, способной создавать простые двумерные изображения. Однако этот язык имеет свои недостатки: 
a) для каждой платформы необходимо писать свой PostScript из-за различающихся параметров вывода; 
b) язык считается нестабильным; 
c) в некоторых случаях при изменении разрешения изображения возможно искажение формы контура кривой Безье; 
d) наблюдается избыточность за счет хранения невидимых частей изображения. 
На сегодняшний день наблюдается распространение современной версии этого языка – Encapsulated PostScript (EPS). 
В 1986 году вышел в свет популярный инструмент gnuplot [3] для визуализации разных видов как двухмерных, так и трехмерных графиков. Это свободная и кроссплатформенная утилита, обладающая собственной системой команд и способная работать интерактивно (в режиме командной строки) или выполнять скрипты, читаемые из файлов. 
В 1998 году был разработан язык векторной разметки (Vector Markup 
Language - VML) [4] и представлен компаниями Microsoft, AutoDesk, HewlettPackard и Macromedia. Написанные на нем объекты помещаются внутрь Web-страниц, среди обычного HTML-кода. Фигуры VML при этом являются такими же объектами для скриптовых языков типа JavaScript, как и объекты HTML, таким образом, их можно динамически модифицировать, а также можно значительно уменьшить код страницы, заменяя объекты тегами VML. Несмотря на то, что этот язык представляется довольно удобным, мощным и безопасным, он не получил широкого распространения. 
С 1999 года консорциумом Всемирной паутины (World Wide Web Consortium – W3C) был создан язык разметки масштабируемой векторной графики (Scalable Vector Graphics - SVG) [6; 9]. Он предназначен для описания двумерной векторной и смешанной векторной/растровой графики в формате XML и поддерживает как неподвижную, так и анимированную интерактивную графику. Этот формат очень хорошо зарекомендовал себя в виду хорошей читаемости, масштабируемости, совместимости с таблицей стилей CSS, а также способности сохранения текста (с возможностью дальнейшего редактирования). Данный вариант языка включает в себя все преимущества XML (но, к сожалению, и недостатки).  
Постановка задачи. Исходя из представленных выше преимуществ и недостатков рассмотренных средств, можно перечислить следующие важные качества проблемно-ориентированного языка описания векторной графики: 
- простота и интуитивность описания изображения 
- интерфейс, ориентированный на пользователя-непрограммиста, 
- возможность динамической модификации изображений 
Приняв за основу эти качества, можно поставить задачу разработки проблемно-ориентированного языка для описания векторной графики. Отличительной особенностью этого языка является возможность выполнять слияние и отсечение контуров фигур. 
Каждая операция, разделяемая символом «;», может либо объявлять и присваивать новые значения объектам, либо рисовать и поворачивать выбранные объекты. Объекты в данном языке могут иметь один из пяти типов данных: число, точка, вектор, фигура и цвет. При их объявлении можно также использовать динамическую типизацию с «var». Язык обладает минимальным математическим аппаратом, состоящим из аддитивных и мультипликативных функций. 
Пример 1 - «pac-man» (рисунок 1). В начале строится квадрат, у которого есть повернутая и масштабированная копия. Потом оригинальная фигура масштабируется и получает смещение по заданному вектору. К ней добавляются 4 точки, образуя восьмиугольник. Из полученного отсекается раннее полученная копия на заданном смещении. Конечная фигура отображается на экран.
Рисунок 1. Пример 1
Пример 2 - «радостное солнышко» (рисунок 2). В начале строится квадрат. Он увеличивается в 4 раза и смещается на заданный вектор. Потом к квадрату добавляются еще 4 точки, получая восьмиугольник. Далее эта фигура объединяется с повернутой на 20 градусов копией, образуя «шероховатый» круг. После этого отдельно строятся «глаза» к этому кругу, представляющие собой треугольники, и «рот». Далее назначаются параметры отображения ранее полученных фигур. Конечный результат визуализируется на экран.
Рисунок 2. Пример 2 
В предлагаемом проблемно-ориентированном языке выполняется диагностика до первой ошибки. Сообщение об ошибке включает указание места возникновения этой ошибки и перечисление возможных вариантов. Для вычислительной части предусмотрено дерево разбора (рисунок 3). 
Рисунок 3. Дерево разбора (1й слой – тип левого операнда, 2й – операция, 3й – тип правого 
операнда, 4й – ожидаемый тип результата) 
Примеры диагностики: 
Рисунок 4. Пример диагностики 1
Рисунок 5. Пример диагностики 2 
Рисунок 6. Пример диагностики 3   
Рисунок 7. Пример диагностики 4 
Выводы. В результате проведенных исследований были разработаны проблемно-ориентированный язык программирования и специализированное интерпретирующее средство, соответствующее этому языку. В нем реализованы базовые функции, способные сформировать изображение. В дальнейшем в этот язык можно добавлять новый функционал, а также провести некоторые оптимизационные работы.