В продукте «Форсайт. Аналитическая платформа» используется язык программирования Fore.
Мне хотелось бы познакомить вас с ним, причем с разных точек зрения. В этой статье давайте поговорим о его внешнем устройстве и применении.
Прежде чем перейти непосредственно к обзору возможностей Fore, немного расскажу о предпосылках его создания.
Итак, это внутренний язык и используется он в одной из крупнейших систем бизнес аналитики «Форсайт. Аналитической платформы» (ранее Prognoz Platform). Платформа объединяет современные технологии хранилищ данных, визуализации, оперативного анализа данных (OLAP), формирования отчетности, моделирования и прогнозирования бизнес-процессов.
Обратим внимание на то, что при изменении состояния какого-либо компонента может возникнуть событие, которое, в свою очередь, может повлиять на другие компоненты системы. С точки зрения пользователя, зачастую такие процессы должны быть программируемы, чтобы обеспечить адаптируемость и настраиваемость компонентов.
Необходимость именно в таких свойствах компонентов и стала причиной создания собственного высокоуровневого языка программирования, который бы позволил связать различные части платформы.
В самом начале развития платформы возникла необходимость настройки бизнес-логики приложения. Предусмотреть различные опции и дополнительные модули на все случаи жизни нельзя, поэтому потребовалась добавить возможность подключать свои собственные модули, причем модули должны были быть кросс-платформенными, работать под различными ОС и максимально просто и быстро разрабатываться. Разработка велась в начале 2000-х годов, .NET только зарождался, работал только под OC Windows и его судьба была совсем не очевидной, а Java и прочих интерпретируемых языков пришлось отказаться так как далеко не все заказчики разрешали установку дополнительных рантайм-платформ. Единственной по настоящему кросс-платформенной технологией являлся только С++, что резко сокращало число потенциальных разработчиков систем.
Так как ни одна из существующих технологий не обеспечивала все наши потребности, мы решили разработать свой собственный кросс-платформенный скриптовый язык, обеспечивающий большую гибкость, снижающий порог вхождения и позволяющий вести разработку не только программистам, но и аналитикам и обычным пользователям. Отсюда и появилась идея реализовать язык Fore.
Реализация своего скриптового языка принесла нам также ряд бонусов, таких как администрирование и раздача прав на подсистемы, возможность обновления систем на лету без переустановки дистрибутивов на каждой рабочей станции (достаточно накатить pef, и изменения будут доступны всем пользователям), возможность редактирования модулей на территории заказчика без установки дополнительного ПО и оперирование базовыми терминами предметной области с помощью поставляемых системных сборок Fore.
А теперь давайте разложим Fore, как говорится, по полочкам.
Внутреннее устройство Fore
На первый взгляд Fore может показаться сложным, но на самом деле он похож на привычные всем языки программирования. Он является объектно-ориентированным языком: пользователь может писать на нем свои классы, интерфейсы.
При создании Fore были максимально учтены все аспекты высокоуровневых языков, благодаря чему разработчику не составит труда перейти к написанию на нем программного кода.
Архитектура Fore
Для дальнейшего понимания особенностей Fore обратимся к понятию сборки. Сборка, она же Assembly, в Fore – это контейнер для модулей, форм и ресурсов с возможностью создавать папки. Модуль Fore, он же Unit, – компилируемый и исполняемый файл, содержащий в себе программный код. Можно выделить лишь одно ограничение – в сборке не может находиться сборка. Сборка может ссылаться на системные сборки и сборки репозитория. Сборка Fore может работать с другими сборками: она может использовать публичные классы, константы, интерфейсы и прочее. Для этого достаточно подключить к сборке сборку, элементы которой необходимо использовать. Также в «Форсайт. Аналитической платформе» существуют системные сборки, доступные для подключения. Схематично архитектура сборок выглядит следующим образом:
Как уже было сказано, существуют системные сборки. Подключаются они к прикладным довольно просто – через среду разработки. В ней же возможно подключать сборки репозитория:
Fore – высокоуровневый язык программирования
Будучи объектно-ориентированным высокоуровневым языком программирования, Fore аккумулирует в себе множество преимуществ других языков. За счет объектно-ориентированности он обладает инкапсуляцией, наследованием и полиморфизмом. В Fore присутствуют интерфейсы, классы, объекты, присущие им наследования, переопределение и т.д. Выделение памяти реализовано здесь наподобие C#: программисту не надо существенно озадачиваться внутренним механизмом работы памяти, что существенно упрощает разработку.
Помимо этого, стоить отметить, что в Fore работает «сборщик мусора», который позволяет освобождать выделенную, но не используемую память, что, в свою очередь, защищает от утечек памяти.
Давайте посмотрим на объектно-ориентированность Fore. Создадим простой пример с классами и интерфейсами для демонстрации возможностей. Форма будет выглядеть следующим образом:
Опишем интерфейс, в котором будет функция, выполняющая преобразование двух целочисленных значений в строку:
Создадим два класса, реализующие этот интерфейс. Один будет возвращать строку-сумму, другой – разность:
Объявим переменную типа интерфейса в классе формы:
Для кнопки 1 будем устанавливать класс суммы, для второй – разности:
По нажатии на кнопку 3 будет выводиться результат выполнения функции интерфейса:
Убедимся, что все работает:
Обновления сборок, совместная разработка, безопасность
Нельзя не обратить внимания на такие важные аспекты для конечного пользователя, как безопасность, многопользовательскую разработку и обновления. С точки зрения обновлений: для сборок можно создать Pef-файл, которым в дальнейшем обновить сборку на других репозиториях. Это нам позволит обновить поведение других репозиториев без каких-либо изменений в ручном режиме. При таком обновлении заказчик может использовать новую разработанную и отлаженную в другом репозитории версию приложения уже на конечном репозитории.
Помимо этого, в «Форсайт. Аналитической платформе» присутствует возможность многопользовательского доступа к разрабатываемым приложениям. Данная технология называется VCS (Version Control System, она же система контроля версий).
В платформе также существует возможность настройки пользователей, различных групп пользователей, их привилегий. Есть редактор политик, мандатный доступ и прочие возможности настройки безопасности в «менеджере безопасности».
Fore везде
Хотелось бы обратить ваше внимание на очень важную вещь – Fore-выражения. Они тоже используются в различных частях комплекса, и это я подробнее покажу на некоторых примерах. Давайте, собственно, уже непосредственно к ним и переходить. Посмотрим сначала использование Fore в отчетности и использования выражений.
Отчетность
В регламентных отчетах можно выделить различные варианты использования Fore. Это могут быть события, выражения в ячейке, гиперссылки, области формул, условия фильтрации, вычислимые элементы измерений и прочее. Мы, в свою очередь, рассмотрим использование Fore на примере первых трех.
Посмотрим на события. Непосредственно к отчету можно подключить Fore-сборку, в которой будут описываться действия на программном языке для различных событий.
Подключить такой модуль очень просто: «Форсайт. Аналитическая платформа» позаботится об этом и сгенерирует необходимый программный код:
Для того чтобы убедиться, что все корректно работает, в создавшийся Fore-модуль поместим следующий программный код, предварительно подключив в ссылках системную сборку «Ui»:
Теперь при открытии данного отчета можно наблюдать следующее:
Теперь обратим внимание на выражения в ячейке формулы. Внешние функции вызываются с помощью Fore, а различные арифметические операции и операции приведения реализованы непосредственно в Fore:
Таким образом, текст, находящийся в окне формулы после символа «=» парсится, компилируется и непосредственно выполняется благодаря Fore-выражениям.
Теперь продемонстрируем работу с гиперссылками. Подключим к нашему регламентному отчету Fore-модуль, который заблаговременно создали:
Теперь в модуле пропишем глобальную процедуру, естественно подключив сборку «Ui»:
А для ячейки регламентного отчета выполним следующие действия:
Теперь при нажатии данной гиперссылки выполняется Fore-функция, что наглядно видно на картинке:
Выражения
Теперь предлагаю обратить внимание на выражения, используемые в «Форсайт. Аналитической платформе». Для наглядности посмотрим несколько примеров. Замечу, что этими примерами использование выражений не ограничивается.
Для начала взглянем на обычную, казалось бы, процедуру импорта данных. Выполним процедуру импорта из файла:
Указываем имя файла, нажимаем «Далее» и видим следующую картину:
Нас в данный момент интересует вычислимое поле. Мы добавим его, и откроется «Универсальный редактор формул», в дальнейшем – УРФ:
В УРФ мы задаем выражение для нового вычислимого поля в зависимости от других полей данных. Fore используется для парсинга этого выражения, а в дальнейшем при его корректности для его компиляции и выполнения. В таком простом примере используются функция подстроки, операции приведения и деления.
Убедимся, что выражение отработало корректно:
Любой УРФ, встречаемый в комплексе, задает Fore-выражение.
Рассмотрев импорт данных, предлагаю немного остановиться на моделировании. Чтобы не тратить время, возьмем готовую модель с приближенными к реальности данными.
Открываем модель и видим следующее:
Естественно, нам в глаза бросается обилие настроек, но сейчас нас интересует только спецификация. При нажатии «Открыть в редакторе» откроется УРФ. Это уже говорит нам о том, что перед нами – Fore-выражение.
Даже в мастере редактирования табличного справочника можно задать выражение. Для этого необходимо нажать «Больше настроек» и перейти на «Привязки блоков»:
Выражение по двойному нажатию редактируется в УРФ.
Ну и напоследок хотелось бы отметить, что платформа поставляется вместе с документацией, которая содержит как описание спецификации языка, так и документацию на все доступное API. Заказчик очень легко может обучить своих специалистов, иногда так и делается, и как с привлечением преподавателей от компании, так и без их привлечения. Ряд наших заказчиков именно таким образом обучили своих специалистов и продолжают сопровождение систем собственными силами.
Далее, заказчики для развития систем могут привлекать как специалистов нашей компании, так и специалистов наших партнеров, что позволяет более просто и быстро найти исполнителей для выполнения задач требуемой квалификации и в приемлемые сроки.
Также отмечу, что язык Fore очень похож на такие популярные языки как Паскаль/Дельфи и C#, и разработчики, знакомые с этими языками, очень легко осваивают Fore. Не стоит также забывать, что платформа допускает использование .NET/Fore.NET модулей и форм, что позволяет привлекать к разработке, в том числе, и C# разработчиков. Языки Fore и Fore.NET легко интегрируются между собой, и вся информация по данным языкам присутствует в документации.
При разработке прикладных систем переписывается только визуальная оснастка с использованием высокоуровневых компонентов платформы. Все функции ядра доступны через API и активно переиспользуются в прикладных системах и не требуют переписывания, так что прикладные системы могут содержать лишь небольшое количество прикладного кода, все зависит от требуемой степени кастомизации визуального интерфейса.
На этом предлагаю остановиться. До встречи!