воскресенье, 25 апреля 2010 г.

Добавил Computation Expressions в Nemerle

При содействии Андрея Белякова (WolfHound) и Владислава Чистякова (VladD2) я добавил поддержку computation expressions в Nemerle. Поддерживаются все вычислительные конструкции F#, но несколько своим образом, подстроенным под особенности самого Nemerle. Но пока синтаксис не устоялся.

Я думаю, что мне удалось угадать алгоритм разбора правильно. На базе computation expressions реализованы list comprehension, array comprehension и enumerable (sequence) comprehension как частный случай общего механизма. Добавил все, используя макросы и не меняя сам компилятор языка. Получилась внешняя библиотека.

Должен сказать, что Nemerle произвел очень приятное впечатление. Язык и среда достойны всяческого внимания.

среда, 14 апреля 2010 г.

Aivika версии 1.0.3.0

Выложил новую версию библиотеки моделирования Aivika. Написана она на F# с использованием двух монад. Эта библиотека позволяет создавать и запускать имитацию гибридных моделей. Сейчас охватывается системная динамика (System Dynamics) и Discrete Event Simulation (как time-driven, event-driven так и process-driven simulation). В планах добавление agent-based modeling. В тестах обгоняет SimPy примерно в два раза на его же типе задач, хотя Aivika умеет значительно больше. Есть недописанный обрывок документации.

Сейчас не буду вдаваться в маркетинговые лозунги. Напишу лишь пару технических деталей.

В основе лежит (императивная) монада Dynamics, которая умеет системную динамику, т.е. запускать имитацию и интегрировать динамическую систему. Что характерно, дифф.-уравнения задаются в высшей степени декларативно.

Поверх этой монады есть ее продолжение DynamicsCont<’a> = Dynamics<’a -> unit> -> Dynamics<unit>. Фишка в том, что используя синтаксис вычислительный выражений, можно писать как бы “обычный” код на F# в монаде DynamicsCont, который будет временами прерываться. Это нужно для реализации “процессов”, которые могут усыпляться, просыпаться, ставиться в очередь на выполнение в такое-то время, блокироваться для захвата разделяемого ресурса и т.д. Все это предполагается в process-driven simulation. Используются свойства продолжения.

Так вот, такой код, используя лифт, может вызывать вычисления в исходной монаде Dynamics, т.е. интегрироваться с динамическими системами. Частный случай монадного трансформера. Это позволяет строить гибридный модели, где одна часть может быть описана дифф.урами, а другая задаваться дискретными процессами. В перспективе сюда добавлю агенты – вся инфраструктура готова.

Все хозяйство представляет собой embedded domain specific language (eDSL). Поскольку внутри используются монады, то легко встраивать вызовы функций .NET внутрь симуляции через вычислительные выражения, т.е. через монадический bind. eDSL же дает возможность встраивать симуляции в обычные .NET приложения.

Подозреваю, что подобные системы стоят дорого. Проблема в том, что мой код получился очень маленьким по объему (90 кб)… и не таким быстрым.