Поделиться

суббота, 27 августа 2011 г.

Жизненный путь: Pilgrim5

Не могу не рассказать. Pilgrim5 - это не язык программирования, это система имитационного моделирования, с которой я работал очень долго и очень много. Разработана она была еще где-то в начале 90-х годов моим научным руководителем Емельяновым А. А. (в то время, конечно, он еще моим руководителем не был, потому что еще нечем было научно руководить). Система имитационного моделирования - это такая штука, которая позволяет настраивать "узлы", "транзакты", "генераторы" и "пути", то есть модели процессов, запускать их и получать всякую статистику. Все, что можно представить в виде системы массового обслуживания, можно представить в виде модели на Pilgrim и обсчитать.

Система имитационного моделирования в данном случае представляет собой просто статическую библиотеку pilgrim.lib, которая ликнуется к проекту, и еще пару заголовочных файлов, которые с помощью инструкций препроцессора до неузнаваемости меняют текст основного исходника проекта. То есть сами не меняют - просто программист должен из-за этих макроопределений набивать в файл такое, что ни капли не похоже на C-шный текст. Вот примерчик:


Такая модель создания хм... моделей оригинальна и, когда начинаешь работать в этой области (а я начал в 1998 или 1999-ом в рамках институтского курса), весьма удобна. Этот мизерный по объему и по сравнению с его же функциональность код, сам создает и окно, и несложные инструменты для анализа процесса, и даже графики строит кое-какие. Конечно, когда требуется модель более сложная, с более богатой визуализацией, с дополнительными расчетами, с подключением к БД, со всякими трюками, наподобие придуманного мною в свое время "парного забега" (долго объяснять) или чем-то подобным, возникают проблемы, которые таким вот нестандартным вынужденным синтаксисом только усугубляются. Но речь сейчас не об этом.

Любопытно то, что даже по сравнению с OpenGL, Pilgrim5, наверное, еще более глубоко и профессионально изученная мною технология. С этой системой я работал долгие годы, создав много крупных и мелких моделей разной степени сложности для разных целей. Вот самые памятные проекты:
  • модель издательства, с учетом работы отделов сбыта, производства, букинистики и т. д. и т. п. с визуализацией, в которой все вертелось, бегало, уменьшалось и увеличивалось, динамически отображая состояние процесса по многим показателям (заказная);
  • модель родного деканата Института компьютерных технологий МЭСИ;
  • модель системы дистанционного обучения и взаимодействия с ней обучаемых с учетом индивидуальных учебных планов, курсов, дисциплин, промежуточного и итогового контроля и прочего, и прочего - для этой модели впервые пришлось подключать БД, из которой программа дергала данные, в БД же была вынесена и большая часть интерфейса для ввода данных, и все проверки этих данных на корректность и целостность, а сама модель стала ядром моей кандидатской диссертации;
  • три больших модели "Структурированной системы мониторинга инженерных систем" (СМИС) - тут тоже понадобилась БД, но не потому что данные были сложные, как в предыдущем случае (там были курсы, темы внутри курсов, индивидуальные планы), а потому что данных было очень много, а само моделирование производилось помиллисекундно (заказная).
Помимо этого я разработал на базе Visio конструктор для имитационных моделей, который позволяет перевести одним щелчком это:


в текст на C, который гарантированно компилируется.

Интересно, что когда ты создаешь модели в Pilgrim-е, ты пишешь на C и не на C одновременно. То есть в тех аспектах, которые выходят за рамки терминологии Pilgrim-a ты должен соблюдать синтаксис и логику C, но большую часть времени ты мыслишь категориями теории массового обслуживания и имитационного моделирования. Программируя внутри Visual Studio, выполняя те же операции и шаги, что и обычно, ты при этом работаешь в основном не с языком программирования, а с чем-то созданным поверх этого языка. Любопытное ощущение.

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

8 комментариев:

  1. С визио в си - это что-то интересное. Даже не знал что такое возможно.

    ОтветитьУдалить
  2. А чего невозможного? Я же собираю из схемы в текстовый файл с синтаксисом C. А в Pilgrim применяемые конструкции C довольно стандартные, их не очень много (см. пример выше). Нужно было только их проанализировать. Хотя, если честно, я сам, когда оглядываюсь назад на эту работу сейчас, думаю: "Как мне в голову это пришло"? :) Я тогда целую теорию по графическим конструкторам разработал.

    В принципе, можно было бы подцепить, чтобы сразу после этого оно и компилилось, и билдилось, чтобы прям сразу exe-шник получался. - только лично мне это не нужно особо. Приятно сознавать, что, помимо философии и аналитики, у меня за плечами и в арсенале совершенно конкретное, полезное и в чем-то уникальное ПО. :)

    ОтветитьУдалить
  3. Я так понимаю была создана специальная программа, которая анализировала *.vsd файлы, использующие специальные заготовки?

    ОтветитьУдалить
  4. На самом деле, все было и проще и сложнее одновременно. Весь конструктор был на Визио: шаблон (template) + файл заготовок (stencil).

    В файле заготовок каждая фигура была дополнена пользовательскими свойствами, где хранились параметры узлов + связана с диалогом настройки этих параметров. Код, привязанный к фигуре, отвечал за ввод и сохранение данных, проверку их на корректность, а также за поиск всех узлов, с которыми связан коннекторами данный, и действия/условия, которые нужно выполнить/проверить. Для того, чтобы в пользовательском интерфейсе забивать действия / условия переходов из одного узла в тот или иной другой, которые потом преобразовывались в код на C: присвоение значений переменным, расчеты, проверка условий и построение условий любой сложности, пришлось разработать целую систему, которую я самозабвенно назвал StepChainLogic (SCL). Благодаря тому, что операции и стыки между операциями (блоги ЕСЛИ, ТО, ИНАЧЕ, И, ИЛИ и т.д.) выбирались и менялись кнопочками, а переменные после объявления просто выбирались из списков, также как и номера узлов, а еще потому, что система демонстрировала одновременно и мнемоническое представление (ЕСЛИ А=0, ТО ПРИСВОИТЬ 10 ПАРАМЕТРУ ТРАНЗАКТА ТАКОМУ-ТО) и C-код этого же, была понятна и манагерам и программерам. То есть код в файле заготовок отвечал за одну фигуру/узел.

    Файл заготовок был привязан к шаблону. Код в шаблоне отвечал за всякие околомодельные действия: создание глобальных переменных, построение действий, которые нужно сделать до запуска модели, настройку параметров модели с соответствующими диалогами, настройку параметров отчета, за создание пользовательской панели инструментов с нужными кнопочками в интерфейсе Визио и т. д. Также шаблон отвечал за модель в целом: за автонумерацию узлов (а их можно было не только добавлять, но и удалять), за проверку корректности модели с точки зрения Pilgrim - наличие входов и выходов из всех узлов кроме генераторов и терминаторов, отсутствие выходов из терминатора, отсутствие входов в генераторы, непротиворечивость условий переходов и т. д. Он же отвечал за трансляцию графического представления в работающий код на C.

    Весь код был на VBA, причем под Визио, который был первым, в котором вообще был VBA, то есть там была кривая объектная модель, куча всего не работала, хоть и декларировалась, куча всего не декларировалась и не работала, куча делала вид, что работает, но при сохранении не сохранялась. :) В общем, я не только языком могу того, я еще и суровый программистский мужик. :)

    То есть поставка была такая: шаблон, файл с заготовками и 4 иконки для панели инструментов. Плюс я прописывал все это файло, где надо, так что создавать "Модель Pilgrin 5" можно было прямо из стартового окна со стандартными шаблонами Визио (Файл, Новый...) наряду с "Блочная диаграмма" и т. д.

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

    ОтветитьУдалить
  5. VBA, потому что мелкомягкие друзья вовремя прикупили перспективный визио5.

    ОтветитьУдалить
  6. Именно так. Но мне-то было все равно, кто его тогда прикупил: я просто увидел перспективу в том, чтобы заняться внутренней механикой модели, а для интерфейса, рисования, редактирования и перетаскивания фигур, соединения их коннекторами и прочего воспользоваться возможностями Визио.

    ОтветитьУдалить
  7. речь идет о модулях для смис и смик?

    ОтветитьУдалить
    Ответы
    1. Речь идет об имитационном моделировании с применением системы Пилигрим и о разработанном мною графическом конструкторе. Было это в начале 00-ых. Модель потоков данных в СМИК / СМИС - это была одна модель, которая разрабатывалась с применением этого конструктора.

      Удалить