Forth
http://fforum.winglion.ru/

Генератор на Форте кода для C
http://fforum.winglion.ru/viewtopic.php?f=2&t=3119
Страница 1 из 6

Автор:  dmitry-st [ Вт апр 04, 2017 16:05 ]
Заголовок сообщения:  Генератор на Форте кода для C

Приветствую завсегдатаев форума!

Хотелось бы услышать идеи о том как на Форте можно красиво обрабатывать иерархические структуры данных.
Видел местные темы по структурам и посмотрел, что есть в GForth, но остаётся неудовлетворённость.

По работе есть объёмный кусок рутинного кода на Си который желательно автоматизировать.
Для начала думаю написать генератор сишных структур и соответствующих им функций get/set с проверками допустимых значений.
Решение на Лиспе для меня очевидно, а Форт пока только осваиваю и не вижу как лучше.

Проиллюстрирую.
Например, должны появиться следующие структуры:
Код:
struct UserGroup {
   int priority;                     /* 1..10, default 10 */
   char name[MAX_GROUP_NAME_LENGTH]; /* default "" */
};

struct User {
   char enable;                      /* 0..1, default 0 */
   char name[MAX_USER_NAME_LENGTH];  /* default "" */
   struct UserGroup group[MAX_USER_GROUPS];
};

Если писать генератор на Лиспе, то файл содержащий описание структур мог бы выглядеть как присваивание одной переменной всего дерева.
Начать можно было бы как-то так:
Код:
(setf code-tree
    '(UserGroup
        (priority
            (type int) (min 1) (max 10) (default 10))
        (name
            (type char) (array MAX_GROUP_NAME_LENGTH) (default ""))))

При этом разбором этого файла и созданием соответствующих вложенных списков составляющих дерево занимается Лисп. Как говориться готовый функционал "из коробки".
Далее можно было бы сразу писать код чтобы по этому дереву пройтись для генерации *.h и *.c файлов. И по ходу делая проверки на синтаксис и корректность.

В Форте я насколько понял таких готовых плюшек нет, но можно много чего создать самобытного.
Думал парсить заголовочный файл С со структурами, но тогда надо всю дополнительную информацию писать в комментариях, что не здорово.
Думал задействовать библиотечку чтения json формата, но в json варианте получиться много кавычек... более тяжеловесно смотрится.

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

Автор:  gudleifr [ Вт апр 04, 2017 16:24 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

dmitry-st писал(а):
Хотелось бы услышать идеи о том как на Форте можно красиво обрабатывать иерархические структуры данных.
FORTH - это язык действий, структур данных там просто нет.
Вы пишете: есть некая схема, на основании которой хочется построить суперсистему, на основании которой будут строиться предметные языки. На FORTH это переводится так: выбираем нужный проблемно-ориентированный язык и с нуля строим FORTH-систему, позволяющую прийти к нему методом последовательных приближений. Нужен другой проблемно-ориентированный язык? ... с нуля строим еще одну FORTH-систему.
В отличие от Lisp "понимание смысла структур" для FORTH означает просто преобразование одного текстового файла в другой, или, лучше, исполнение одного файла для получения другого...

Возможно Вам нужен не FORTH, а родные сишные lex/yacc...

Автор:  vpn289 [ Вт апр 04, 2017 16:49 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

Не вполне понятно, что вам нужно. Вы хотите программу на Форте, которая бы по некоему шаблону подготавливала текст для программы на Си?
На Форте чаще решение приходит при движении от частного к общему. Сперва придумывается и решается какой-то маленький частный примерчик, потом другой. Вырисисовывается и задается общий вид, и потом уже решение обобщается.
Давайте для начала попробуем решить маленький частный примерчик.

Автор:  Hishnik [ Вт апр 04, 2017 18:17 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

В Форте синтаксис такой, что отдельного понятия "структура" не видится. Есть довольно мощный механизм контекстных словарей, так что можно определить два словаря StructInstance1 и StructInstance2, и в каждом из них иметь слово UserData, которое будет указывать на собственный кусок памяти. Но при этом автоматически поддержка StructInstance2->UserData не появляется. С одной стороны, хотелось бы и на такую реализацию посмотреть (в том числе и вложенную), с другой - вопрос действительно нетривиальный. Править язык или править подход?

Автор:  dmitry-st [ Вт апр 04, 2017 18:59 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

vpn289 писал(а):
Не вполне понятно, что вам нужно. Вы хотите программу на Форте, которая бы по некоему шаблону подготавливала текст для программы на Си?

Наверное можно и так выразиться)
Хотелось бы конечно чтобы этот шаблон был исполняемой программой для форта.

vpn289 писал(а):
На Форте чаще решение приходит при движении от частного к общему. Сперва придумывается и решается какой-то маленький частный примерчик, потом другой. Вырисисовывается и задается общий вид, и потом уже решение обобщается.
Давайте для начала попробуем решить маленький частный примерчик.

Согласен, что надо начинать с малого.
В моём случае это генерация кода для пары структур Си.

gudleifr писал(а):
В отличие от Lisp "понимание смысла структур" для FORTH означает просто преобразование одного текстового файла в другой, или, лучше, исполнение одного файла для получения другого...

Для начала исполнение файла в результате чего должно появиться в памяти дерево. Которое можно анализировать.

gudleifr писал(а):
Возможно Вам нужен не FORTH, а родные сишные lex/yacc...

Этот хороший вариант. Правда совсем с чистого листа делать придётся. Лисп и Форт предоставляют всё таки некоторый готовый функционал.

Автор:  gudleifr [ Вт апр 04, 2017 19:34 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

dmitry-st писал(а):
Для начала исполнение файла в результате чего должно появиться в памяти дерево.
Совершенно не обязательно. Мы просто привыкли к концепции Вирта: "Алгоритмы + Структуры данных = Программа". Т.е. "Структуры данных" образуют некий язык для общения "Алгоритмов", позволяя иметь не один алгоритм от начала до конца, но много простых. Однако, если мы посмотрим на скомпилированный код, мы не увидим и следа "структурности" (кроме, разве что, чисто паразитной) - тупо берем отсюда, кладем сюда, увеличиваем счетчик и т.д. и т.п. Так вот, FORTH позволяет писать "сразу откомпилированный" код. Он может облазить дерево, даже не зная, что дерево.

Например, уже писал что для списово-карточного движка вместо полного спискового СЛОВАРЯ (инкапсулирующего что-то аж навроде ПЛЭНЕРовской унификации шаблонов), ввел всего три простейших "лексикончика":
1. Вставка/редактирование элемента в текущей позиции. Основные слова - НОВАЯ-ГОЛОВА и УПАКОВАТЬ-ГОЛОВУ (т.е. вставка брата и сына).
2. Выполнение некоторой операции для всех элементов списка - слово ПЕРЕБРАТЬ.
3. Перенос некоторого числа случайно выбранных карт из одного списка в другой - главное слово ОТМУСОЛИТЬ.
Причем, взаимопроникновение этих трех наборов слов минимально.
И сейчас меня напрягает только то, что, наверное, и единообразные (почти) честные списки использовал зря. Несколько квазисписков разного вида (да массивы, да шаблоны) - и все вышло бы еще проще.

Автор:  dmitry-st [ Ср апр 05, 2017 07:10 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

gudleifr писал(а):
Так вот, FORTH позволяет писать "сразу откомпилированный" код. Он может облазить дерево, даже не зная, что дерево.

Например, уже писал что для списово-карточного движка вместо полного спискового СЛОВАРЯ (инкапсулирующего что-то аж навроде ПЛЭНЕРовской унификации шаблонов), ввел всего три простейших "лексикончика":
1. Вставка/редактирование элемента в текущей позиции. Основные слова - НОВАЯ-ГОЛОВА и УПАКОВАТЬ-ГОЛОВУ (т.е. вставка брата и сына).
2. Выполнение некоторой операции для всех элементов списка - слово ПЕРЕБРАТЬ.
...

То что в откомпилированном коде у многих языков не хранится информация о структурах данных это понятно.
А вот программировать в этом стиле... пока не могу представить как это выглядело бы в моём случае для сто-пятьсот сишных структур.
Можете показать псевдокодом на русском языке как с помощью НОВАЯ-ГОЛОВА и других слов можно распечатать для начала только одну struct UserGroup?

Автор:  gudleifr [ Ср апр 05, 2017 08:48 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

dmitry-st писал(а):
Можете показать псевдокодом на русском языке как с помощью НОВАЯ-ГОЛОВА и других слов можно распечатать для начала только одну struct UserGroup?
См. как образуются колоды КАРТ в том исходнике - http://gudleifr.forum2x2.ru/t5-topic

"По Муру" - http://www.gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=%5C6.PERWOISTOTNIKI%5CCHARLES%20H.MOORE%20PROGRAMMING%20A%20PROBLEM%2DORIENTED%2DLANGUAGE%5C3.%20PROGRAMS%20WITH%20INPUT%20/%20PROGRAMMY%20S%20WWODOM%5C3.7.%20CONTROL%20LANGUAGE,%20EXAMPLE%20/%20ASYK%20UPRAWLENIA,%20PRIMER

Как перейти от привычных структур в нормальной форме к операциями над ними по рецепту FORTH?
Нужно потихоньку обеспечить функционал, потихоньку вводя данные по мере надобности. Причем, для каждых данных выбирается тот способ хранения, который требуется функционалом (см. зависимость организации массивов от типов операций в А.Ахо, Дж.Хопкрофт, Дж.Ульман, Построение и анализ вычислительных алгоритмов, 4-я глава).

Автор:  dmitry-st [ Ср апр 05, 2017 10:11 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

Hishnik писал(а):
В Форте синтаксис такой, что отдельного понятия "структура" не видится.

Ну да, префиксный Лисп наоборот это постфиксный Форт)
Переверните мой пример с созданием вложенного списка и получится строго по философии Форта.

В Лиспе (setf code-tree 'что-то) это:
setf - слово связывающее переменную со значением
code-tree - имя переменной
' - символ чтения с разбором скобок, но без обычного вычисления встречающихся внутри скобок слов

В Форте могло бы быть соответственно:
'что-то code-tree setf
но создатели Форта оставили это программистам и думаю правильно.
Больше гибкости. Есть где развернуться)

Автор:  gudleifr [ Ср апр 05, 2017 10:25 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

dmitry-st писал(а):
но создатели Форта оставили это программистам
Создатели FORTH и программисты - это одни и те же люди. LISP - это виртуальная машина, основанная на списках (т.е. структурах данных). FORTH - это реальная машина, построенная на чем угодно. И ждать от него поддержки каких-то там структур не приходится.
Кстати. вот еще FORTH-способы создания структур "по месту" - http://www.gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=%5C3.POLESNYE%20ALGORITMY%5CFORTH%20I%20STRUKTURY%20DANNYH

Автор:  Hishnik [ Ср апр 05, 2017 13:48 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

dmitry-st писал(а):
В Форте могло бы быть соответственно:
'что-то code-tree setf
но создатели Форта оставили это программистам и думаю правильно.
Больше гибкости. Есть где развернуться)

Гибкость действительно дает определенные перспективы. И тут действительно есть что обсудить. С одной стороны, не очень хочется добавлять в Форт исключения вида "в Форте кроме слов есть структуры данных, причем точка внутри слова разделяет поля структуры". С другой, хочется вот такого:
http://fforum.winglion.ru/viewtopic.php?f=2&t=3101

Автор:  Victor__v [ Ср апр 05, 2017 13:54 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

А СУБД испольозвать пробовали?
типа:
id type name zn comment
1 int test 10 null

и уж после этого вычислять, парсить, и компоновать.

Вообще, хотелось бы увидеть вначале набор входных данных, а ещё лучше стековую диаграмму

Автор:  dmitry-st [ Ср апр 05, 2017 15:29 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

Hishnik писал(а):
С другой, хочется вот такого:
http://fforum.winglion.ru/viewtopic.php?f=2&t=3101

Красиво, но такого варианта не встречал. Запомнились:
Forth Meets Smalltalk http://soton.mpeforth.com/flag/fms/index.html
GFort https://www.complang.tuwien.ac.at/forth ... ture-Usage
Forth200x https://www.complang.tuwien.ac.at/forth ... Structures

Автор:  dmitry-st [ Ср апр 05, 2017 15:52 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

Victor__v писал(а):
А СУБД испольозвать пробовали?
типа:
id type name zn comment
1 int test 10 null

и уж после этого вычислять, парсить, и компоновать.

Не уверен что точно понял.
Использовать SQL синтаксис CREATE TABLE для описания структур?
Если не трудно приведите пример на базе struct UserGroup - там всего два поля.

Victor__v писал(а):
Вообще, хотелось бы увидеть вначале набор входных данных, а ещё лучше стековую диаграмму

Я привёл в пример 2 структуры. Указанные в комментариях параметры должны выставляться при создании объекта структуры и проверяться в функциях типа setUserGroupPriority(int).
Это реальные структуры из рабочего проекта. Подобных много и с большим количеством полей.
Хорошей практикой считается для однотипного кода писать генераторы. Это повышает надёжность кода и освобождает от рутины.

Автор:  KPG [ Ср апр 05, 2017 18:22 ]
Заголовок сообщения:  Re: Генератор на Форте кода для C

dmitry-st писал(а):
Ну да, префиксный Лисп наоборот это постфиксный Форт)
Переверните мой пример с созданием вложенного списка и получится строго по философии Форта.

Может посмотреть как будет выглядеть предполагаемое решение на Factor языке програмирования, как наиболее близкого
к Lisp и Forth.

P.S. Прочтение форума не подсказало приемлемое решение? :)
Тред не особо пока читал, но вероятнее разбирал бы входной поток штатными средствами Форт и передавал управление
на разобранные слова и они уже бы генерировали свой вывод исходя из контекста в потоке. Может быть задейсвовал код из FFL
или поэкспериментировал с регулярками или Форт парсерами подобным YACC (Grey4 и вариантами) или что то подобное Timbre, но уже в направлени Си->Forth или прямое применение Си->Forth (проект LCC на Forth прототип уже был представлен на местном форуме и его вариации)

Сейчас, как некоторый интерес, скомпоновал материал в предварительном варианте цикла статей от Креншоу "Как написать компилятор" c иллюстрацией кода на I-Forth (взял русский перевод и заменил код из Forth варианта). Можно обкатать данные уроки в применениии к SP-Forth или Win32Forth.
Вроде по этим урокам делался проект паскалеподобного языка D2Lang (2002г) где основными идеями стали минимальность клюевых слов, расширяемость, подобно, концепции Си библиотек, два стека внутри, один тип данных - указтель с указанием размера данных в памяти и управляющие слова подобные операторам (THEN берёт значение флага со стека и в зависимости от него делает переход) и ещё какие то моменты.
Может и как решение встроить Форт в необходимые и близкие затронутой теме инструментари, как в универсальные так и специализированные.

Страница 1 из 6 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/