Работаю над новой функциональностью для моего компилятора машин состояний — Guile-SMC.
Итоги работы: получилось сделать преобразование ДКА в код на Scheme, который никаким образом не зависит от самого Guile-SMC. На выходе получается самодостаточный код (который можно записать в одном файле), который похож на тот, который я мог бы написать руками.
Для того, чтобы получить подобный самодостаточный код, я копирую ядро Guile-SMC в выходной код, при этом сам ДКА преобразуется в подобное представление (реальный пример):
Из интересного: получилось также сделать некую "оптимизацию" выходного кода путём удаления неиспользуемых процедур.
Теперь у Guile-SMC три режима (цели) компиляции:
-
-
-
Пример запуска с указанием цели компиляции:
#projects #guile #smc #compiler
Итоги работы: получилось сделать преобразование ДКА в код на Scheme, который никаким образом не зависит от самого Guile-SMC. На выходе получается самодостаточный код (который можно записать в одном файле), который похож на тот, который я мог бы написать руками.
Для того, чтобы получить подобный самодостаточный код, я копирую ядро Guile-SMC в выходной код, при этом сам ДКА преобразуется в подобное представление (реальный пример):
(define (run-fsm context)
""
(define (DEFAULT context)
"Count parenthesis."
(let ((event (event-source context)))
(cond ((guard:eof-object? context event)
(let ((context (action:validate context event)))
(log-debug "[~a] -> [*]" 'DEFAULT)
context))
((guard:semicolon? context event)
(let ((context (action:no-op context event)))
(log-debug "[~a] -> [~a]" 'DEFAULT 'COMMENT)
(COMMENT context)))
((guard:double-quote? context event)
(let ((context (action:no-op context event)))
(log-debug "[~a] -> [~a]" 'DEFAULT 'STRING)
(STRING context)))
((#{guard:#t}# context event)
(let ((context (action:count context event)))
(DEFAULT context))))))
(define (STRING context)
"Skip a string."
(let ((event (event-source context)))
(cond ((guard:double-quote? context event)
(let ((context (action:no-op context event)))
(log-debug "[~a] -> [~a]" 'STRING 'DEFAULT)
(DEFAULT context)))
((#{guard:#t}# context event)
(let ((context (action:no-op context event)))
(STRING context))))))
(define (COMMENT context)
"Skip a comment."
(let ((event (event-source context)))
(cond ((guard:newline? context event)
(let ((context (action:no-op context event)))
(log-debug "[~a] -> [~a]" 'COMMENT 'DEFAULT)
(DEFAULT context)))
((#{guard:#t}# context event)
(let ((context (action:no-op context event)))
(COMMENT context))))))
(DEFAULT context))
Из интересного: получилось также сделать некую "оптимизацию" выходного кода путём удаления неиспользуемых процедур.
Теперь у Guile-SMC три режима (цели) компиляции:
-
guile — обычный режим компиляции, который выбирается по-умолчанию. В этом случае выходной код зависит от наличия Guile-SMC в системе и без него выполняться не будет.-
guile-standalone-copy — моя первая попытка сделать самодостаточный код. В этом случае все необходимые модули Guile-SMC копируются в отдельный каталог рядом с выходным ДКА, и зависимости ДКА переписываются так, чтобы они указывали на скопированные модули.-
guile-standalone — вторая (текущая) попытка сделать самодостаточный код, и похоже самая успешная (хотя я решил оставить guile-standalone-copy как вариант, т.к. в некотроых случаях он может быть удобнее.)Пример запуска с указанием цели компиляции:
$ cat fsm.puml | smc compile -L . -U "((context))" -t guile-standalone -m "(custom-fsm)" > custom-fsm.scm
#projects #guile #smc #compiler
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
👍1
Добавил ещё один пример кода для работы с компилятором Guile-SMC:
https://github.com/artyom-poptsov/guile-smc/tree/master/examples/compiler
На выходе, в файле
https://github.com/artyom-poptsov/guile-smc/tree/master/examples/compiler
На выходе, в файле
fsm.scm, после выполнения следующей команды:$ guile -L . main.scm > fsm.scmбудет самодостаточный Guile-код, который можно запустить без наличия Guile-SMC в системе:
$ echo "hello world" | guile -L . run.scm#guile #smc #fsm #projects
GitHub
guile-smc/examples/compiler at master · artyom-poptsov/guile-smc
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
Выпустил релиз Guile-SMC 0.4.0:
https://lists.gnu.org/archive/html/guile-user/2022-03/msg00041.html
В новом релизе:
- Добавлен профайлер для ДКА, который позволяет выявлять "узкие" места в автомате за счёт анализа времени, сколько автомат проводит в каждом состоянии.
- Добавлено два режима (цели) компиляиции:
- Парсер для PlantUML оптимизирован и стал примерно на 25% быстрее (как раз "узкое" место выявлено с помощью
- Добавлена man-страница для
- Дополнена и расширена документация в Info.
#guile #smc #fsm #projects #dev
https://lists.gnu.org/archive/html/guile-user/2022-03/msg00041.html
В новом релизе:
- Добавлен профайлер для ДКА, который позволяет выявлять "узкие" места в автомате за счёт анализа времени, сколько автомат проводит в каждом состоянии.
- Добавлено два режима (цели) компиляиции:
guile-standalone и guile-standalone-copy. Эти режимы позволяют создавать ДКА на основе описания в PlantUML, которые пригодны для использования без наличия Guile-SMC в системе.- Парсер для PlantUML оптимизирован и стал примерно на 25% быстрее (как раз "узкое" место выявлено с помощью
smc profile)- Добавлена man-страница для
smc (см. man smc)- Дополнена и расширена документация в Info.
#guile #smc #fsm #projects #dev
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
👍1
Работаю над портированием Guile-ICS на мой компилятор детерминированных конечных автоматов (ДКА) Guile-SMC:
https://github.com/artyom-poptsov/guile-ics
Интересная задача, которая позволяет выявить недостатки Guile-SMC и понять сам процесс проектирования и реализации ДКА — чтобы впоследствии адаптировать Guile-SMC.
Поскольку проект Guile-SMC является для меня исследовательским, сразу не всегда понятно, как должны быть реализованы те или иные вещи. Чтобы это понять, надо использовать инструмент и смотреть, подходит ли он под решаемую задачу.
Проекты наподобие Guile-SMC мне интересны во-первых тем, что они являются "инструментами для создания инструментов", и во-вторых, что они потенциально позволят думать о решаемых задачах по-новому (следовательно, лучше контролировать сложность задач.)
В Guile-ICS будет использоваться два ДКА, один будет вложен в другой.
Первый (базовый) ДКА необходим для разбора строк формата iCalendar (RFC5545). Второй (высокоуровневый) ДКА необходим для разобора потока объектов iCalendar.
В целом, первая часть задачи портирования (разработка и реализация ДКА) уже реализована, тесты в процессе написания. Вторая часть портирования заключается в переносе старого кода Guile-ICS на использование Guile-SMC.
#guile #smc #fsm #projects #dev
https://github.com/artyom-poptsov/guile-ics
Интересная задача, которая позволяет выявить недостатки Guile-SMC и понять сам процесс проектирования и реализации ДКА — чтобы впоследствии адаптировать Guile-SMC.
Поскольку проект Guile-SMC является для меня исследовательским, сразу не всегда понятно, как должны быть реализованы те или иные вещи. Чтобы это понять, надо использовать инструмент и смотреть, подходит ли он под решаемую задачу.
Проекты наподобие Guile-SMC мне интересны во-первых тем, что они являются "инструментами для создания инструментов", и во-вторых, что они потенциально позволят думать о решаемых задачах по-новому (следовательно, лучше контролировать сложность задач.)
В Guile-ICS будет использоваться два ДКА, один будет вложен в другой.
Первый (базовый) ДКА необходим для разбора строк формата iCalendar (RFC5545). Второй (высокоуровневый) ДКА необходим для разобора потока объектов iCalendar.
В целом, первая часть задачи портирования (разработка и реализация ДКА) уже реализована, тесты в процессе написания. Вторая часть портирования заключается в переносе старого кода Guile-ICS на использование Guile-SMC.
#guile #smc #fsm #projects #dev
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
memory heap
Работаю над портированием Guile-ICS на мой компилятор детерминированных конечных автоматов (ДКА) Guile-SMC: https://github.com/artyom-poptsov/guile-ics Интересная задача, которая позволяет выявить недостатки Guile-SMC и понять сам процесс проектирования и…
Почти завершил работу по портированию Guile-ICS на Guile-SMC. Код получается более понятный и легко адаптируемый. Часть вопросов решается правкой ДКА в формате PlantUML, иногда даже без правки Scheme-кода.
По ходу дела похоже исправил недоработку в старой версии Guile-ICS — теперь парсер способен читать все поддерживаемые типы компонентов календаря, согласно RFC5545.
Одна из проблем, которые остались — сборка в отдельном каталоге при
Ещё думаю, что надо в ближайшее время зарелизить новую версию Guile-SMC, чтобы было, от чего отталкиваться при работе над связанными проектами.
#guile #smc #dev #projects
По ходу дела похоже исправил недоработку в старой версии Guile-ICS — теперь парсер способен читать все поддерживаемые типы компонентов календаря, согласно RFC5545.
Одна из проблем, которые остались — сборка в отдельном каталоге при
make distcheck не может найти некоторые файлы.Ещё думаю, что надо в ближайшее время зарелизить новую версию Guile-SMC, чтобы было, от чего отталкиваться при работе над связанными проектами.
#guile #smc #dev #projects
Выпустил релиз Guile-SMC 0.5.0 — компилятора детерминированных конечных автоматов (ДКА) для GNU Guile:
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.5.0
Официальный анонс в списке рассылки Guile:
https://lists.gnu.org/archive/html/guile-user/2022-08/msg00071.html
Основные возможности:
- Таблица переходов между состояниями может быть автоматически проверена на наличие тупиковых и недостижимых состояний.
- ДКА Guile-SMC при работе собирают статистику — можно узнать, сколько шагов и переходов делала машина состояний при работе.
- Guile-SMC включает в себя профилировщик, который позволяет по логам работы ДКА узнать, сколько система провела в каждом состоянии времени и какой процент от общего времени работы это составляет. Это позволяет находить "узкие места" и оптимизировать ДКА на основе цифр, полученных в реальной работе.
- Поддержка разных "целей" для компиляции — есть три цели: обычная "guile", которая даёт на выходе код ДКА, который для работы будет требовать наличие Guile-SMC в целевой системе; "автономный" режим ("guile-standalone"), который позволяет получить на выходе код ДКА, который не зависит от наличия Guile-SMC в целевой системе (и также по виду близок к тому, который мог бы быть написан в ручном режиме, где переход между состояниями по сути представлен рекурсивным вызовом процедур, каждая из которых представляет одно из состояний ДКА); и наконец "автономный" режим с сохранением Guile-SMC основы ("guile-standalone-copy"), который копирует в вместе с ДКА часть Guile-SMC, которая необходима для его работы.
- Возможность запустить ДКА напрямую из PlantUML-файла (см. команду
Цель проекта — автоматизировать и упростить разработку ДКА для различных задач (в первую очередь различных парсеров, как раз одна из областей моих интересов), избежать дублирования работы.
Основные изменения в версии 0.5.0:
- Для цели компиляции
- Для цели компиляции
- При компиляции для цели
- Команда
-
- Модуль
- Исправлены справочные сообщения от команд.
- В команду
- Документация в Texinfo обновлена.
#guile #smc #fsm #dev #projects
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.5.0
Официальный анонс в списке рассылки Guile:
https://lists.gnu.org/archive/html/guile-user/2022-08/msg00071.html
Основные возможности:
- Таблица переходов между состояниями может быть автоматически проверена на наличие тупиковых и недостижимых состояний.
- ДКА Guile-SMC при работе собирают статистику — можно узнать, сколько шагов и переходов делала машина состояний при работе.
- Guile-SMC включает в себя профилировщик, который позволяет по логам работы ДКА узнать, сколько система провела в каждом состоянии времени и какой процент от общего времени работы это составляет. Это позволяет находить "узкие места" и оптимизировать ДКА на основе цифр, полученных в реальной работе.
- Поддержка разных "целей" для компиляции — есть три цели: обычная "guile", которая даёт на выходе код ДКА, который для работы будет требовать наличие Guile-SMC в целевой системе; "автономный" режим ("guile-standalone"), который позволяет получить на выходе код ДКА, который не зависит от наличия Guile-SMC в целевой системе (и также по виду близок к тому, который мог бы быть написан в ручном режиме, где переход между состояниями по сути представлен рекурсивным вызовом процедур, каждая из которых представляет одно из состояний ДКА); и наконец "автономный" режим с сохранением Guile-SMC основы ("guile-standalone-copy"), который копирует в вместе с ДКА часть Guile-SMC, которая необходима для его работы.
- Возможность запустить ДКА напрямую из PlantUML-файла (см. команду
smc run)Цель проекта — автоматизировать и упростить разработку ДКА для различных задач (в первую очередь различных парсеров, как раз одна из областей моих интересов), избежать дублирования работы.
Основные изменения в версии 0.5.0:
- Для цели компиляции
guile-standalone добавлены недостающие зависимости в целевой код.- Для цели компиляции
guile-standalone также изменён API: теперь в целевом коде процедура для запуска называется fsm-run!, которая функционирует также, как и при цели компиляции guile — что позволяет обеспечить одинаковый интерфейс запуска ДКА, который не зависит от цели компиляции.- При компиляции для цели
guile-standalone выходной код теперь имеет более аккуратный вид.- Команда
smc context теперь позволяет генерировать промежуточный контекст, который можно использовать для обеспечения минимальной зависимости от внутренней структуры модулей Guile-SMC (это необходимо для совместимости различных целей компиляции, что опять же позволяет использовать разные цели без переписывания пользовательского кода.) В будущем рекомендуется использовать именно этот промежуточный контекст, а не прямой доступ к модулям Guile-SMC.-
smc context теперь может читать описание ДКА в PlantUML из файла.- Модуль
(smc core stack) удалён.- Исправлены справочные сообщения от команд.
- В команду
smc run добавлены дополнительные проверки корректности параметров запуска.- Документация в Texinfo обновлена.
#guile #smc #fsm #dev #projects
GitHub
Release v0.5.0 · artyom-poptsov/guile-smc
Version 0.5.0
Переписываю систему логирования в Guile-SMC. В списке рассылки
В новой версии консольный интерфейс будет позволять указывать драйвер логирования и опции для него (идею подсмотрел в Docker, а более конкретно в
Плюс добавится драйвер
#guile #smc #dev
guix-patches указали на проблемы с текущей версией логирования, так что скоро будет Guile-SMC 0.5.1 с исправлениями и обратной совместимостью с 0.5.0.В новой версии консольный интерфейс будет позволять указывать драйвер логирования и опции для него (идею подсмотрел в Docker, а более конкретно в
dockerd.) При сборке хочу использовать драйвер логирования file, вместо syslog, который до этого по-умолчанию ставился.Плюс добавится драйвер
null, который будет заглушать все логи. Кстати, логирование в stderr будет также решаться отдельным драйвером, который однако будет ставиться в дополнении к другим драйверам логирования в режиме отладки.#guile #smc #dev
Выпустил релиз Guile State Machine Compiler (Guile-SMC) 0.5.1:
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.5.1
Список основных изменений:
- Исправил нежелательное сокрытие внутренней процедуры Guile
- Добавил возможность выставлять драйвер логирования для Guile-SMC — это в частности позволило решить проблемы со сборкой Guile-SMC в изолированных окружениях (и/или с ограниченным доступом к ФС и сервисам). Теперь можно при использовании консольной утилиты
- Добавил более гибкую возможность дублирования логов в
- При компиляции примера парсера для формата PNG теперь используется драйвер логирования
- В тестах теперь логирование использует драйвер
- Описание пакета для GNU Guix обновлено.
- Обновлена документация в формате Texinfo.
Программы, работающие с Guile-SMC 0.5.0 должны без изменений продолжать работать с 0.5.1.
Скоро отправлю патч в GNU Guix с обновлённым пакетом.
#guile #smc #fsm #dev #projects
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.5.1
Список основных изменений:
- Исправил нежелательное сокрытие внутренней процедуры Guile
log процедурой из модуля (smc core log).- Добавил возможность выставлять драйвер логирования для Guile-SMC — это в частности позволило решить проблемы со сборкой Guile-SMC в изолированных окружениях (и/или с ограниченным доступом к ФС и сервисам). Теперь можно при использовании консольной утилиты
smc указывать один из драйверов: syslog (по-умолчанию), file или null (отключение логирования.)- Добавил более гибкую возможность дублирования логов в
stderr — теперь это работает с любым драйвером логирования, не только с syslog.- При компиляции примера парсера для формата PNG теперь используется драйвер логирования
null.- В тестах теперь логирование использует драйвер
file и логи сохраняются рядом с тестами в каталоге tests.- Описание пакета для GNU Guix обновлено.
- Обновлена документация в формате Texinfo.
Программы, работающие с Guile-SMC 0.5.0 должны без изменений продолжать работать с 0.5.1.
Скоро отправлю патч в GNU Guix с обновлённым пакетом.
#guile #smc #fsm #dev #projects
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
👍1
memory heap
Выпустил релиз Guile State Machine Compiler (Guile-SMC) 0.5.1: https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.5.1 Список основных изменений: - Исправил нежелательное сокрытие внутренней процедуры Guile log процедурой из модуля (smc core log).…
В релизе Guile-SMC 0.5.1 обнаружилось несколько ошибок, пришлось в срочном порядке делать 0.5.2:
https://lists.gnu.org/archive/html/guile-user/2022-09/msg00002.html
Исправленные ошибки:
- Команды
#guile #smc #fsm #dev #projects
https://lists.gnu.org/archive/html/guile-user/2022-09/msg00002.html
Исправленные ошибки:
- Команды
smc context и smc compile теперь добавляют к выходному коду модуль (smc core config).#guile #smc #fsm #dev #projects
Очередной подход к продумыванию архитектуры Guile-SMC.
Хочется выделить универсальные строительные блоки для ДКА, при этом сохранив архитектуру гибкой. Думаю, есть смысл вынести предикаты (сторожи переходов, a.k.a.
Разработчики ДКА не обязаны вообще использовать предоставленные мной контексты и могут сделать всё самостоятельно. Если хочется сэкономить труд, то можно например воспользоваться предоставленными мной предикатами, но при этом полностью игнорировать предоставляемые Guile-SMC контексты.
Хочу также добавить функциональный контекст на базе модуля
#guile #smc #fsm #projects #dev
Хочется выделить универсальные строительные блоки для ДКА, при этом сохранив архитектуру гибкой. Думаю, есть смысл вынести предикаты (сторожи переходов, a.k.a.
guards) в отдельные модули, т.к. они универсальны. При этом, сами контексты, над которыми оперируют ДКА, будут тоже в отдельных модулях. В итоге, должен получиться конструктор "собери себе ДКА".Разработчики ДКА не обязаны вообще использовать предоставленные мной контексты и могут сделать всё самостоятельно. Если хочется сэкономить труд, то можно например воспользоваться предоставленными мной предикатами, но при этом полностью игнорировать предоставляемые Guile-SMC контексты.
Хочу также добавить функциональный контекст на базе модуля
(srfi srfi-9 gnu), в дополнении к ООП-варианту, который был до этого.#guile #smc #fsm #projects #dev
⚡3
Выпустил релиз Guile-SMC 0.6.0 — компилятора конечных автоматов для GNU Guile:
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.0
Основные новшества:
- Новая реализация контекста. Теперь контекст предоставляет предикаты отдельно от структур данных для обеспечения ДКА памятью. То есть, теперь есть модули
- Убрана поддержка цели компиляции
- Класс
-
-
- При указании опции
#dev #projects #guile #smc #fsm
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.0
Основные новшества:
- Новая реализация контекста. Теперь контекст предоставляет предикаты отдельно от структур данных для обеспечения ДКА памятью. То есть, теперь есть модули
(smc context char) и (smc context u8), предоставляющие предикаты для ДКА, работающих с символами и байтами соответственно. При этом, предоставляются также функциональные и ООП-структуры данных для обеспечения ДКА памятью — например, (smc context functional u8) и (smc context oop u8).- Убрана поддержка цели компиляции
guile-standalone-copy, так как смысла в ней мало, а для её поддержки требуются мои (ограниченные) ресурсы. Остались цели guile (генерация кода, зависящего от Guile-SMC) и guile-standalone (генерация кода, не зависящего от Guile-SMC.)- Класс
<fsm> теперь позволяет добавлять специальные процедуры pre-action и post-action, которые выполняются в начале обработки события и в конце, соответственно.-
smc compile и smc context теперь позволяет указывать путь к установленным модулям Guile-SMC через опцию --guile-smc-path.-
smc profile теперь позволяет выдавать статистику в JSON-формате.- При указании опции
--debug, консольные команды больше не включают дублирование логов в stderr — вместо этого теперь предлагается использовать специальную опцию stderr=true в --log-opt.#dev #projects #guile #smc #fsm
GitHub
Release v0.6.0 · artyom-poptsov/guile-smc
Version 0.6.0
Выпустил релиз Guile-SMC 0.6.1, компилятора конечных автоматов для GNU Guile:
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.1
В новой версии:
- Добавлена возможность установки глобального источника событий для ДКА в разделе
- Исправлена ошибка в процедуре
- Исправлены ошибки в сериализации/десериализации состояний в модуле
- Обновлена документация.
#dev #projects #guile #smc #fsm
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.1
В новой версии:
- Добавлена возможность установки глобального источника событий для ДКА в разделе
legend внутри PlantUML-файла. Например:legend- Команда
event-source: next-char
endlegend
smc context теперь позволяет установить подтип генерируемого контекста. Если раньше можно было выбрать только из двух вариантов — oop и functional, то сейчас можно использовать такие варианты, как:oopПодобная мера позволила сократить объём генерируемого кода для контекста (не берутся те части контекста из Guile-SMC, которые не используются), и кроме того, это позволило решить проблему с дублированием процедур при использовании функционального (
oop/generic
oop/port
oop/char
oop/u8
functional
functional/generic
functional/char
functional/u8
functional) контекста, где каждый вариант предоставлял свою копию процедур, но все основные процедуры имели одинаковые имена.- Исправлена ошибка в процедуре
fsm-run!, из-за которой при завершении работы ДКА возвращалась не последнаяя версия контекста, а предыдущая — это приводило к ошибкам работы функциональных вариантов контекста, где контекст не изменялся, а создавался новый на основе предыдущего. В этой ситуации если в конце работы ДКА происходило какое-то заключительное действие с контекстом (например, обновление через действие по выходу из состояния), то данные изменения не были видны. В случае использования ООП-контекста такой проблемы не возникало, так как ООП-контекст использует мутабельные структуры.- Исправлены ошибки в сериализации/десериализации состояний в модуле
(smc core state) — теперь exit-action корректно сохраняется при преобразовании состояния в список, а при обратном преобразовании списка в состояние восстанавливается.- Обновлена документация.
#dev #projects #guile #smc #fsm
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
⚡1
memory heap
Сравнение скорости обработки текстовых данных через Guile-DSV. В первом случае (верхняя синяя линия на графике) тест проходил на оригинальной версии Guile-DSV с рукописным ДКА, а во втором случае (оранжевая нижняя линяя на графике) — с ДКА, сгенерированным…
Исправил ошибки в профилировщике детерминированных конечных автоматов из поставки Guile-SMC, исправления пойдут в следующий релиз.
Использование профилировщика на примере Guile-DSV:
Кусок файла
#dev #projects #guile #dsv #smc
Использование профилировщика на примере Guile-DSV:
$ dsv --log-driver file --log-opt=file=smc.log -F rfc4180 --to unix datasets/covid.csv > test.csv
$ smc profile smc.log
Total transitions: 1661324
Total time: 84173181 us
Stats:
read_quote: 30647003 us (36.4095 %)
read_quoted_field: 27615130 us (32.8075 %)
read_field_first_char: 23677038 us (28.1290 %)
add_row: 2233946 us (2.6540 %)
add_final_row: 35 us (.0000 %)
read_first_field_first_char: 29 us (.0000 %)
Кусок файла
smc.log:$ head smc.log
2023-08-10 21:19:05.522313 (DEBUG): [*] -> [read_first_field_first_char]
2023-08-10 21:19:05.522342 (DEBUG): [read_first_field_first_char] -> [read_quoted_field]
2023-08-10 21:19:05.522377 (DEBUG): [read_quoted_field] -> [read_quote]
2023-08-10 21:19:05.522427 (DEBUG): [read_quote] -> [read_field_first_char]
2023-08-10 21:19:05.522448 (DEBUG): [read_field_first_char] -> [read_quoted_field]
2023-08-10 21:19:05.522483 (DEBUG): [read_quoted_field] -> [read_quote]
2023-08-10 21:19:05.522508 (DEBUG): [read_quote] -> [read_field_first_char]
2023-08-10 21:19:05.522527 (DEBUG): [read_field_first_char] -> [read_quoted_field]
2023-08-10 21:19:05.522556 (DEBUG): [read_quoted_field] -> [read_quote]
2023-08-10 21:19:05.522585 (DEBUG): [read_quote] -> [read_field_first_char]
#dev #projects #guile #dsv #smc
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
⚡1
Выпустил релиз Guile-SMC 0.6.2:
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.2
Ключевые изменения:
- Исправлена ошибка с процедурой
- Исправлена ошибка высчитывания отметок времени в модуле
- Исправлен рассчёт времени в модуле
- В модуль
- Теперь Guile-SMC позволяет задавать
- В модуле
- Обновлена документация.
Новый релиз обратно совместим с версиями 0.6.0 и 0.6.1.
#dev #projects #guile #smc
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.2
Ключевые изменения:
- Исправлена ошибка с процедурой
pre-action в модуле (smc context functional char): Теперь процедура во всех случаях возвращает контекст.- Исправлена ошибка высчитывания отметок времени в модуле
(smc trace-context). Теперь значение отметок времени всегда получается положительным, как и должно. При этом, если всё же обнаруживается уход времени в отрицательные значения, бросается ошибка.- Исправлен рассчёт времени в модуле
(smc cli command-profile) профайлера. Теперь профайлер Guile-SMC даёт правильные значения суммарного времени работы ДКА и времени для каждого отдельно взятого состояния.- В модуль
(smc context oop generic) добавлен недостающий модуль (smc core log). Его отсутствие приводило бы к ошибками при попытке использования (smc context oop generic).- Теперь Guile-SMC позволяет задавать
pre-action и post-action для ДКА прямо в PlantUML описании. Эти процедуры выполняются перед всеми остальными проверками для каждого состояния, и могут например использоваться для обновления счётчиков в контексте. Пример задания этих процедур в PlantUML файле описания ДКА:legend- Для класса
pre-action: custom-pre-action
post-action: custom-post-action
endlegend
<fsm> в модуле (smc fsm) теперь добавлены процедуры для задания pre-action (fsm-pre-action-set!) и post-action (fsm-post-action-set!). Также из модуля экспортированы процедуры fsm-pre-action и fsm-post-action для получения текущих значений pre-action и post-action соответственно.- В модуле
(smc core log) теперь регистрируется логгер по-умолчанию, под именем "guile-smc". Также добавлена процедура smc-log-default-logger.- Обновлена документация.
Новый релиз обратно совместим с версиями 0.6.0 и 0.6.1.
#dev #projects #guile #smc
GitHub
Release v0.6.2 · artyom-poptsov/guile-smc
Version 0.6.2
⚡1
Обнаружил недавно проблему в Guile-DSV, что библиотека не проверяет консистентность длины строк табличных данных. Это не обязательно является проблемой в случае чтения данных, однако при обработке таблиц (например, при форматированном выводе на экран) это приводило к трудно осмысляемым ошибкам вроде:
Сейчас я исправил эту недоработку и добавил для процедуры
По ходу дела выяснилось также, что парсер RFC 4180 похоже неправильно парсит некоторые сложные поля, где внутри поля содержится знак-разделитель. Это ещё требует дополнительного исследования.
И ещё выяснилось, что в Guile-SMC оказывается неправильно считаются строки в контексте
#guile #dsv #smc #projects
$ echo -e "a,b,c\nd,e\n" | ./pre-inst-env ./utils/dsv
Backtrace:
In ice-9/boot-9.scm:
1752:10 7 (with-exception-handler _ _ #:unwind? _ # _)
In unknown file:
6 (apply-smob/0 #<thunk 7f1b3a516300>)
In ice-9/boot-9.scm:
724:2 5 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
In ice-9/eval.scm:
619:8 4 (_ #(#(#<directory (guile-user) 7f1b3a519c80>)))
In utils/dsv:
272:8 3 (main _)
In dsv/table.scm:
460:21 2 (format-table (("a" "b" "c") ("d" "e")) () #:width _ # _ …)
347:27 1 (table-wrap (("a" "b" "c") ("d" "e")) _ #:width _ # _ # _)
241:23 0 (table-wrap-row _ _)
dsv/table.scm:241:23: In procedure table-wrap-row:
In procedure car: Wrong type argument in position 1 (expecting pair): ()
Сейчас я исправил эту недоработку и добавил для процедуры
dsv->scm опцию #:validate?, которая по-умолчанию выставлена в #f (false). Если же выставить её в #t (true), то тогда ошибка будет более понятной. Вот пример на тех же тестовых данных:$ echo -e "a,b,c\nd,e\n" | ./pre-inst-env ./utils/dsv
Backtrace:
In ice-9/boot-9.scm:
1752:10 9 (with-exception-handler _ _ #:unwind? _ # _)
In unknown file:
8 (apply-smob/0 #<thunk 7f1f270af300>)
In ice-9/boot-9.scm:
724:2 7 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
In ice-9/eval.scm:
619:8 6 (_ #(#(#<directory (guile-user) 7f1f270b2c80>)))
In utils/dsv:
272:8 5 (main _)
In dsv/cli/common.scm:
144:38 4 (print-file #<input: file 0> unix "" _ #:numbering? _ # …)
In dsv/unix.scm:
81:19 3 (dsv->scm _ #:debug-mode? _ #:delimiter _ #:validate? _ …)
In smc/fsm.scm:
469:37 2 (_ #<fsm current-state: add_row statistics: 11/5 7f1f1…> …)
426:22 1 (_ #<fsm current-state: add_row statistics: 11/5 7f1f1…> …)
In dsv/fsm/dsv-context.scm:
100:2 0 (throw-row-length-error _ _ _ _)
dsv/fsm/dsv-context.scm:100:2: In procedure throw-row-length-error:
Inconsistent row length on line 10: expected 3, got 2 #<input: file 0> 10 0 ("d" "e") #<char-context 7f1f1d41a8c0>
По ходу дела выяснилось также, что парсер RFC 4180 похоже неправильно парсит некоторые сложные поля, где внутри поля содержится знак-разделитель. Это ещё требует дополнительного исследования.
И ещё выяснилось, что в Guile-SMC оказывается неправильно считаются строки в контексте
functional/char.#guile #dsv #smc #projects
GitHub
GitHub - artyom-poptsov/guile-dsv: Delimiter-separated values (DSV) format parser for GNU Guile.
Delimiter-separated values (DSV) format parser for GNU Guile. - artyom-poptsov/guile-dsv
⚡1