Декларативна мова
з обмеженими імперативними властивостями
для програмування «МІА: Документообіг» 1.0
Передмова
Колись в мене була мрія зробити ERP систему зі своєю мовою програмування, це
означало би, що ERP система достатньо формалізована і стабільна.
Ця мова бачилася мені максимально обмеженою і простою, на рівні конфігураційних скриптів.
Головним чином мова створена для реконфігурації маршрутів документів по папках,
для чого потрібна рекомпіляція ерланг модулів. Також мова анонсує поки що єдиний
імперативний оператор, що дозволяє перепаковувати документи та їх поля.
В майбутньому — це повноцінна мова для модулів бізнес-процесів BPE, схем даних KVS,
та візуальних форм.
м.Вишневе, 2023
Анотація
Основна ідея та мотивація — створити DSL навколо бібліотек ERP/1 [KVS,BPE,NITRO,FORM]
з повним контролем над оператором call, а також нерекурсивним
імреративним оператором присвоювання assign. Інші синтаксичні
конструкції — декларативні, що відображені в операторах route,
result, document, notify.
Окремі частини (преамбули) синтаксичних конструкцій form і event
можуть містити імперативну прелюдію для підготування змінних, яка складається
з послідовності імперативних операторів.
Мова підтримує маніпуляцію списками, деконструкцію структур, паттерн-мачінг,
систему аксесорів до структур, система типів — мінімально-необхідна для
компіляції в BEAM байт-код та унаслідована від системи типів Erlang AST.
У мові відсутні синитаксичні конструкції циклів, умовних операторів та
неконтрольованої рекурсії. Однак, неконтрольовану рекурсію можна створити
в BPMN дефініціях (як корекурсивний процес), тому верифікатор моделей BPE який
перевіряє FormalTalk BPE файл містить детектор циклів в call-графах.
У статті представлена конфігурація системи «МІА: Документообіг» на
анонсованій мові програмування «FormalTalk» або ft.
Розкажемо тут тільки
як компілювати патерн-мачінг правила для функцій routeTo та routeFrom,
які використовуються для визначення папок користувачів, які отримають посилання
на поточний документ на певній стадії обробки.
Нотація Бекуса-Наура
Мова підтримує три типи файлів: KVS, FORM, BPE. Кожен модуль може містити
наступні синтаксичні конструкції: import (нефункіональна); record,
event, route, form,
notice (функціональні).
Кожна синтаксична функціональна конструкція містить свій обмежений спосіб компіляції патерн-мачінга
для певного класу функцій, що використовуються в МІА:Документообіг.
Слова мови
Будь-яка послідовність слів мови розділених пробілом
трактується як імʼя функції і її аргументи:
Якщо args використовується в декларативних конструкціях,
то всі слова означаються параметри, якщо ж args використовуються
в імперативних конструкціях decls, то перший
аргумент означає імʼя функції, як в call, assign.
Оскільки мотивація ft — це мінімізація
неконтрольованої рекурсії, всі викливи функцій повинні бути
контрольованими або бібліотечними, а сам компілятор
повинен знаходити та ідентифікувати цикли в call-графах.
Тому компілятор ft розуміє тільки
вручну додані схеми компіляції для певного словника вбудованих
чи розширюваних функцій.
Слова, які входять до складу args можуть бути типізованими
або нетипізованими. Якщо в середині слова зустрічається символ :,
то таке слово типізоване.
Друге слово terminal після :
визначає наступні скорочення:
Приклади:
Аксесори структур
Аксесор крапка . є синтаксичною
конструкцією доступу до іменованих структур полів.
Якщо слово мови містить аксесор . —
це означає, що слово зліва повинно містити типову специфікацію,
яка містить словник всіх полів, з яким буде звірятися слово справа.
Аксесор тільда ~ є синтаксичною конструкцією
доступу до іменованих структур обʼєктів, які не містять типової
інформації, такі як map, dict.
У випадку коли аксесор тільда ~ застосовується
до елементів типів-структур — застосовується схема компіляції :kvs.getfield, :kvs.setfield.
У випадку коли аксесор крапка ~ застосовується
до елементів типів-структур — застосовується схема компіляції
безпосередньої маніпуляції зі структурами {,
}, описаними в наступному параграфі.
Списки та структури
Якщо слово містить на свому початку та кінці символи
[ і ], воно визначає
синтаксичну конструкцію формування списків list,
dict та map. Елементи
списків — окремі слова — перелічуються через кому ,.
Вони можуть бути: змінними, словами з аксесорами,
типізованими змінними та контстантами. Колои елементи списку
містять рівність = вони формують структуру dict.
Коли елементи списку містять -> вони формують
структуру map. Приклади:
Якщо слово мови містить в кінці символ },
а також символ { в середині або на початку,
то таке слово визначає конструктор стркутури або її паттерн-мачінг (деконструктор).
Якщо символ { зустрічається в середині
слова, то символи від початку до нього визначають тип структури-конструктора
або змінну цього типу, як показано в прикладах:
Конфігурація «МІА: Документообіг»
Тут показана конфігурація «Вхідного Документа» та всіх необхідних
файлів для компіляції цієї частини CRM.ERP.UNO.
KVS модулі
KVS модулі призначені для визначення метанінформації бізнес-обʼєктів,
детального опису типів їх полів.
Щоб побачити внутрішнє представлення цього модуля, наберіть в Elixir консолі наступну команду:
FORM модулі
FORM модулі призначені для визначення структури форм які репрезентують
певні бізнес-обʼєкти, що повинні бути визначені до цього в модулях KVS.
Щоб побачити внутрішнє представлення цього модуля, наберіть в Elixir консолі наступну команду:
BPE модулі
BPE модулі призначені для визначення логіки бізнес-процесів,
опису маршрутів документів routeTo, routeFrom та notify.
Щоб побачити внутрішнє представлення цього модуля, наберіть в Elixir консолі наступну команду:
В модулях BPE дозволяється використовувати скорочені назви задач, папок та полів:
LEEX/YECC консоль
Після генерації лексичних та синтаксичних парсерів
зразу корисно написати функції доступу до згенерованих модулів:
Компілятор
Так як Erlang та Elixir, FormalTalk використовує Erlang AST для
паттерн-мачінг компіляції, яка охоплює всі 20 стадій компіляції мови Erlang.
Фактично, це --- не компілятор (як і Elixir), а швидше
звичайна AST транформація з мови більше вужчої та бідної (FormalTalk)
в тюрінг-повну мову числення процесів (Erlang AST).
Тестування компілятора
Новостворений BEAM модуль в папці priv/out/ повинен містити скомпільовану функцію routeTo,
яка повертає список обʼєктів ERP.routeProc.
Структура папки priv/erp.uno/:
Скомпільовані BEAM файли в папці priv/out/:
Присвячую мову програмування ft Ліліані Левицькій
та всім держслужбовцям України.
Бібліографія
Хоча для створення мови достатньо знання Erlang AST та його компіляції,
а також бібліотек N2O.DEV, не можна сказати що на автора не вплинула наступна
класична небагата бібліографія по декларативних мовах:
[1]. J.W.Lloyd. Practical Advantages of Declarative Programming. GULP-PRODE 1994.
[2]. E.Murru. Hands-on Low-code Application Development with Salesforce. 2020
[3]. P.Padawitz. Deduction and Declarative Programming. Cambridge. 1992.
[4]. H.Schwichtenberg,S.S.Wainer. Proofs and Computations. ASL, 2012.
[5]. Krishnamurti,Ramakrishnan. Practical Aspects of Decl. Languages. PAPL, 2002.
[6]. P.Roy, S.Haridi. Concepts, Techniques, and Models of Computer Programming. Swedish Institute of Compuer Science, 2003.