Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024) — различия между версиями

Материал из 0x1.tv

(Новая страница: «;{{SpeakerInfo}}: {{Speaker|Даниил Исакевич}} <blockquote> </blockquote> {{VideoSection}} {{vimeoembed||800|450}} {{youtubelink|}} {{SlidesSectio…»)
 
;{{SpeakerInfo}}: {{Speaker|Даниил Исакевич}}
<blockquote>
Показаны примеры использования Рефала-М для преобразования
текстов на формальных языках: автоматического построения ДРАКОНовских диаграмм (редактор <tt>drakon</tt>) из псевдокода и наборов формул предложенного автором
языка в виде схем-графов (пакет <tt>graphviz</tt>). 

Уделено внимание организации программы и программирования, возникающим ситуациям и приёмам.
</blockquote>

{{VideoSection}}

{{vimeoembed||800|450}}
{{youtubelink|}}

{{SlidesSection}}
[[File:Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf|left|page=-|300px]]

{{----}}

== Thesis ==

=== Введение ===

Рефал  язык, созданный для написания программ, пишущих программы. 
Его наличие поощряет создание языков под своё понимание и нужные классы задач. 
Часто перевод с одного формального языка высокого уровня на другой более низкого уровня осуществим достаточно быстро. 

Выходной язык низкого уровня может быть достаточной для решения задачи частью более богатого языка, сделанного кем-то другим. 

Среди востребованных задач такого рода  построение содержательной графики.

=== Укрощение drakon'а ===

Автоматизация формирования ДРАКОНовских диаграмм понадобилась из-за того, что для
редактора <tt>drakon</tt> диаграмма  лишь куча графических элементов; он не имеет
представления об их связях, и при редактировании диаграмма «расползается».

А результат (штук пятнадцать красивых картинок) понадобился если не послезавтра,
то хотя бы на следующей неделе. Поэтому было решено прекратить тесное общение
с <tt>drakon</tt>ом, скормив ему готовые диаграммы.

Файл <tt>имя.drn</tt>, в котором <tt>drakon</tt> хранит диаграммы, является базой
данных SQLite и может быть создан последовательностью SQL-запросов; собственно
диаграммы и графические элементы создаются <tt>INSERT</tt>-ами в соответствующие
таблицы.

Для описания диаграмм человеком создан язык, позволяющий вводить последовательности
действий, выделять и именовать блоки кода, в том числе ветвления с проверкой условия
и циклы с переменной-счётчиком. Краткое описание синтаксиса языка:
<pre>
текст ::= строка переводстроки текст | конецфайла
строка ::= описаниешага `//' комментарии | описаниешага
комментарии ::= комментарий `//' комментарии | комментарий
описаниешага ::= заголовок `{' | `}' | описаниедействия
заголовок ::= условие `?' | перем `=' нач `:' кон |
              названиеблокакода
</pre>

Псевдокод на этом языке переводится в SQL-запросы Рефал-программой<ref name="Drakoder"><i>Исакевич&nbsp;Д.</i> Преобразователь псевдокода в диаграммы ДРАКОН. https://gitflic.ru/project/dvisa/drakoder</ref> за три основных этапа (каждый этап  несколько более мелких шагов):
#  Ввод текста, распознавание и преобразование его структуры
#  Размещение блоков на диаграммах
#  Дорисовка соединительных линий и вывод SQL-запросов 


Для размещения графических элементов потребовалось вычислять их размеры и
координаты. Координаты <m>X</m> зависят от вложенности блоков кода и удобнее вычисляются,
если программа представлена как лес. Координаты <m>Y</m> на диаграмме вычисляются
в порядке следования по программе как плоскому списку.

=== От набора формул к схеме ===

Другая задача  перевод набора формул ЯСП (описан в отдельном докладе) в команды
языка <tt>dot</tt> пакета <tt>graphviz</tt>. Перевод выполняется Рефал-программой<ref name="Metahim"><i>Исакевич&nbsp;Д.</i> Преобразователь формул ЯСП в схемы GraphViz. https://gitflic.ru/project/dvisa/metahim</ref>. 

Основные его этапы:
#  Ввод и разбор формул и построение леса, перевод выражений в префиксную форму
#  Выделение представляющих интерес общих подвыражений
#  Представление леса как списка узлов (корни и листья именованы) и дуг
#  Склейка одноимённых узлов
#  Нумерация узлов, формирование команд выходного языка.


=== Замечания о программировании ===

Последовательность преобразований реализована функцией
<pre>
ЦепьПреобразований {
    .вхарг (.прочие (?функция .допарг)) =
        <Mu ?функция .допарг
            <ЦепьПреобразований .вхарг (.прочие)»;
    .вхарг () = .вхарг;
}
</pre>
 используя которую удобно наращивать цепочку вызовов; порядок вызовов слева направо, поэтому код сохраняет читаемость.

Особое внимание уделяется построению плана преобразований, одни из которых изменяют
структуру данных в целом, а другие обрабатывают локальные ситуации (обычные или особые). 
Документирование такой программы  отдельная задача.

Чтобы хорошо выделить модули, лучше решать несколько похожих задач. Поэтому сейчас
модули выделены только для ЯСП.

При расчётах размеров и координат терм нагружается подтермами, и было бы удобно
искать значения по «ключу»  что требует реализовать функцию поиска. 
Сейчас такой функции нет, и программист следит за расположением подтермов сам.

{{----}}
[[File:{{#setmainimage:Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024)!.jpg}}|center|640px]]
{{LinksSection}}
<!-- <blockquote>[©]</blockquote> -->
* https://gitflic.ru/project/strusov/refal-machine
* https://gitflic.ru/project/dvisa/drakoder
* https://gitflic.ru/project/dvisa/metahim
<references/>

[[Категория:OSSDEVCONF-2024]]
[[Категория:Open-source projects]]
[[Категория:Draft]]

Версия 05:48, 23 октября 2024

Докладчик
Даниил Исакевич

Показаны примеры использования Рефала-М для преобразования текстов на формальных языках: автоматического построения ДРАКОНовских диаграмм (редактор drakon) из псевдокода и наборов формул предложенного автором языка в виде схем-графов (пакет graphviz).

Уделено внимание организации программы и программирования, возникающим ситуациям и приёмам.

Видео

Презентация

Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024).pdf

Thesis

Введение

Рефал — язык, созданный для написания программ, пишущих программы. Его наличие поощряет создание языков под своё понимание и нужные классы задач. Часто перевод с одного формального языка высокого уровня на другой более низкого уровня осуществим достаточно быстро.

Выходной язык низкого уровня может быть достаточной для решения задачи частью более богатого языка, сделанного кем-то другим.

Среди востребованных задач такого рода — построение содержательной графики.

Укрощение drakon'а

Автоматизация формирования ДРАКОНовских диаграмм понадобилась из-за того, что для редактора drakon диаграмма — лишь куча графических элементов; он не имеет представления об их связях, и при редактировании диаграмма «расползается».

А результат (штук пятнадцать красивых картинок) понадобился если не послезавтра, то хотя бы на следующей неделе. Поэтому было решено прекратить тесное общение с drakonом, скормив ему готовые диаграммы.

Файл имя.drn, в котором drakon хранит диаграммы, является базой данных SQLite и может быть создан последовательностью SQL-запросов; собственно диаграммы и графические элементы создаются INSERT-ами в соответствующие таблицы.

Для описания диаграмм человеком создан язык, позволяющий вводить последовательности действий, выделять и именовать блоки кода, в том числе ветвления с проверкой условия и циклы с переменной-счётчиком. Краткое описание синтаксиса языка:

текст ::= строка переводстроки текст | конецфайла
строка ::= описаниешага `//' комментарии | описаниешага
комментарии ::= комментарий `//' комментарии | комментарий
описаниешага ::= заголовок `{' | `}' | описаниедействия
заголовок ::= условие `?' | перем `=' нач `:' кон |
              названиеблокакода

Псевдокод на этом языке переводится в SQL-запросы Рефал-программой[1] за три основных этапа (каждый этап — несколько более мелких шагов):

  1. Ввод текста, распознавание и преобразование его структуры
  2. Размещение блоков на диаграммах
  3. Дорисовка соединительных линий и вывод SQL-запросов


Для размещения графических элементов потребовалось вычислять их размеры и координаты. Координаты зависят от вложенности блоков кода и удобнее вычисляются, если программа представлена как лес. Координаты на диаграмме вычисляются в порядке следования по программе как плоскому списку.

От набора формул к схеме

Другая задача — перевод набора формул ЯСП (описан в отдельном докладе) в команды языка dot пакета graphviz. Перевод выполняется Рефал-программой[2].

Основные его этапы:

  1. Ввод и разбор формул и построение леса, перевод выражений в префиксную форму
  2. Выделение представляющих интерес общих подвыражений
  3. Представление леса как списка узлов (корни и листья именованы) и дуг
  4. Склейка одноимённых узлов
  5. Нумерация узлов, формирование команд выходного языка.


Замечания о программировании

Последовательность преобразований реализована функцией

ЦепьПреобразований {
    .вхарг (.прочие (?функция .допарг)) =
        <Mu ?функция .допарг
            <ЦепьПреобразований .вхарг (.прочие)»;
    .вхарг () = .вхарг;
}

— используя которую удобно наращивать цепочку вызовов; порядок вызовов слева направо, поэтому код сохраняет читаемость.

Особое внимание уделяется построению плана преобразований, одни из которых изменяют структуру данных в целом, а другие обрабатывают локальные ситуации (обычные или особые). Документирование такой программы — отдельная задача.

Чтобы хорошо выделить модули, лучше решать несколько похожих задач. Поэтому сейчас модули выделены только для ЯСП.

При расчётах размеров и координат терм нагружается подтермами, и было бы удобно искать значения по «ключу» — что требует реализовать функцию поиска. Сейчас такой функции нет, и программист следит за расположением подтермов сам.

Опыт использования Рефала-5 для преобразования текстов на формальных языках (Даниил Исакевич, OSSDEVCONF-2024)!.jpg

Примечания и ссылки

  1. Исакевич Д. Преобразователь псевдокода в диаграммы ДРАКОН. https://gitflic.ru/project/dvisa/drakoder
  2. Исакевич Д. Преобразователь формул ЯСП в схемы GraphViz. https://gitflic.ru/project/dvisa/metahim