Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 18:00

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Генератор на Форте кода для C
СообщениеДобавлено: Вт апр 04, 2017 16:05 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 28, 2017 10:04
Сообщения: 21
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Приветствую завсегдатаев форума!

Хотелось бы услышать идеи о том как на Форте можно красиво обрабатывать иерархические структуры данных.
Видел местные темы по структурам и посмотрел, что есть в 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 варианте получиться много кавычек... более тяжеловесно смотрится.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Вт апр 04, 2017 16:24 
dmitry-st писал(а):
Хотелось бы услышать идеи о том как на Форте можно красиво обрабатывать иерархические структуры данных.
FORTH - это язык действий, структур данных там просто нет.
Вы пишете: есть некая схема, на основании которой хочется построить суперсистему, на основании которой будут строиться предметные языки. На FORTH это переводится так: выбираем нужный проблемно-ориентированный язык и с нуля строим FORTH-систему, позволяющую прийти к нему методом последовательных приближений. Нужен другой проблемно-ориентированный язык? ... с нуля строим еще одну FORTH-систему.
В отличие от Lisp "понимание смысла структур" для FORTH означает просто преобразование одного текстового файла в другой, или, лучше, исполнение одного файла для получения другого...

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Вт апр 04, 2017 16:49 
Не в сети

Зарегистрирован: Вс мар 26, 2017 00:23
Сообщения: 40
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Не вполне понятно, что вам нужно. Вы хотите программу на Форте, которая бы по некоему шаблону подготавливала текст для программы на Си?
На Форте чаще решение приходит при движении от частного к общему. Сперва придумывается и решается какой-то маленький частный примерчик, потом другой. Вырисисовывается и задается общий вид, и потом уже решение обобщается.
Давайте для начала попробуем решить маленький частный примерчик.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Вт апр 04, 2017 18:17 
Не в сети
Administrator
Administrator
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Вт апр 04, 2017 18:59 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 28, 2017 10:04
Сообщения: 21
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
vpn289 писал(а):
Не вполне понятно, что вам нужно. Вы хотите программу на Форте, которая бы по некоему шаблону подготавливала текст для программы на Си?

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

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

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

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

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

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

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


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

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 07:10 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 28, 2017 10:04
Сообщения: 21
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
gudleifr писал(а):
Так вот, FORTH позволяет писать "сразу откомпилированный" код. Он может облазить дерево, даже не зная, что дерево.

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 08:48 
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-я глава).


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 10:11 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 28, 2017 10:04
Сообщения: 21
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Hishnik писал(а):
В Форте синтаксис такой, что отдельного понятия "структура" не видится.

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 10:25 
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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 13:48 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
dmitry-st писал(а):
В Форте могло бы быть соответственно:
'что-то code-tree setf
но создатели Форта оставили это программистам и думаю правильно.
Больше гибкости. Есть где развернуться)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 13:54 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
А СУБД испольозвать пробовали?
типа:
id type name zn comment
1 int test 10 null

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 15:29 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 28, 2017 10:04
Сообщения: 21
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 15:52 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 28, 2017 10:04
Сообщения: 21
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Victor__v писал(а):
А СУБД испольозвать пробовали?
типа:
id type name zn comment
1 int test 10 null

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Генератор на Форте кода для C
СообщениеДобавлено: Ср апр 05, 2017 18:22 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
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 берёт значение флага со стека и в зависимости от него делает переход) и ещё какие то моменты.
Может и как решение встроить Форт в необходимые и близкие затронутой теме инструментари, как в универсальные так и специализированные.



За это сообщение автора KPG поблагодарил: dmitry-st
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу 1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB