LINUX.ORG.RU

Data flow programming

 


1

3

Что-то мне приснилось на днях и подумал я запилить на коленке библиотеку для сабжа.

Основа системы - объект типа модель, который включает в себя ячейки с данными. Между ячейками есть связи, которые описываются наподобии:

(A, B, C) -> (X, Y)

и далее описывается код расчёта данных для ячеек в X и Y в зависимости от данных в ячейках A, B, С. При изменении данных отдельных ячеек в модели на основании вышеописаннх связей какие-то ячейки надо пересчитать, а какие-то нет (отображения функциональны). Называть этот процесс будем обновлением модели. Задача - определить данные каких именно ячеек нужно пересчитать и какой оптимальной последовательностью вычислений это сделать. Подобная задача решается такими программами как система сборки make и менеджерами пакетов. Здесь особенность в том, что основа ячейки - переменные в памяти программы.

Возникли следующие идеи:

Во-первых это понятие представления. Представление состоит из отдельных видов. Это чем-то похоже на модель с ячейками, но виды - это не области памяти, а порты в которые данные выводятся и уже не возвращаются (наподобие стандартных потоков, сокетов). Представление привязано к определённому типу моделей, а данные для видов зависят от данных в ячейках модели наподобие как зависят данные в ячейках между собой. Может в отдельном представлении могут быть переменные, но они уже не зависят от данных модели.

У одного объекта типа модели может быть несколько представлений причём как разных типов так и схожих. Поэтому адрес на объект модели должен быть содержаться в составе объекта представления - без отношения наследования из ООП не смотря на привязанность типа представления к типу модели.

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

Может ещё есть алгоритмы совершеннее вышеописанных идей? Какие алгоритмы полезно изучить для реализации такого?

★★★★★

Очень похоже на банальные электронные таблицы, может оказаться внезапно-полезным чтение статей по их устройству. Некоторые умеют и с циклами работать.

sislochka
()

Возможно, ты изобретаешь язык Пролог.

i-rinat ★★★★★
()

Похоже на reactive programming

pi11 ★★★★★
()

(A, B, C) -> (X, Y)

и далее описывается код расчёта данных для ячеек в X и Y в зависимости от данных в ячейках A, B, С.

На LUT реализуется логика в ПЛИС.

gag ★★★★★
()

(A, B, C) -> (X, Y)

А ты про паттерн-матчинг слышал?

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

Зависимые типы данных …

Просьба к тем, кто использует зависимые типы привести пример хорошего
обобщенного алгоритма с кратким разъяснением его … /в inet много статей, но какие-то простенькие и не убедительные/ …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Не, буду дальше API для метаданных совершенствовать.

Далее хороший пример двух функций.

Одной на вход подаем директорию с *.xlsx /при этом API ни чего об xlsx не знаем/.
Она анализирует 1000 xlsx и создает метаданные, которые пригодны для работы с этими 1000 xlsx.

Вторая функция /к примеру/ может создать объект на основе метаданных для xlsx и загрузить данные какого-либо xlsx в объект.

ВСЕ!

Вот такие обобщенные алгоритмы

МОЕ! ...  

При этом текст программы для создания метаданных для xlsx и загрузка в создаваемый объект всего лишь две строки, а не

( ( (АБСТРАКЦИЯ)->АБСТРАКЦИЯ ) => АБСТРАКЦИЯ ) => АБСТРАКЦИЯ ...

Владимир

anonymous
()

Что-то мне приснилось на днях

А мне сегодня какая-то ЛАМЕРЮГА приснилась.
Объясняю, объясняю, объясняю, объясняю, …, а она не

БУМ БУМ

Может это ЛОР был? …

Владимир

anonymous
()
Ответ на: комментарий от sislochka

Некоторые умеют и с циклами работать.

Ссыслочка умеет работать только с ссыклами.

anonymous
()

Не пойму, ты функции изобрёл что ли?

jachejka_X, jachejka_Y = kod_rascheta(jachejka_A, jachejka_B, jachejka_C)

Задача - определить данные каких именно ячеек нужно пересчитать

Пересчитывать нужно все зависимые ячейки, очевидно, начиная с той, которую изменили.

Циклические зависимости у ячеек запрещены.

А зря.

anonymous
()
Ответ на: комментарий от anonymous

А мне сегодня какая-то ЛАМЕРЮГА приснилась. Объясняю, объясняю, объясняю, объясняю, …, а она не

БУМ БУМ Может это ЛОР был? …

У меня просьба к форумчанам не ГРОБИТЬ новичков, которые фантазируют на темы разработки.
Видите ли, как это не странно, но в их фантазиях бывают дельные мысли.

МАЛО, НО БЫВАЮТ! ...

Это много полезней чем УЧЕНЫЙ БРЕД на темы

Чем Go лучше КОБОЛ ...

Владимир

anonymous
()
Ответ на: комментарий от ox55ff

Пили патч в метапрог

Ага.
Вы еще посоветуйте ГОМНА тарелку в обед СКУШАТЬ! …

Вы уж с этой МетаВселенной как нибудь сами разбирайтесь ...

Владимир

anonymous
()
Ответ на: комментарий от ox55ff

Пили патч в метапрог

Есть фильм «Королевство кривых зеркал».
Так вот Метапрог это

Хорошая идея, пропущенная через СТО КРИВЫХ ЗЕРКАЛ ...  

Но изначальная идея - хорошая! …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Есть фильм «Королевство кривых зеркал».

Так вот нынешний мир это ЗАПОВЕДИ БОГА

отраженные в ста кривых зеркалах ...

Утрирую конечно, но суть отражена ПРАВИЛЬНО! …

Владимир

anonymous
()
Ответ на: комментарий от ados

Получается, что описал кишки какой-нибудь электронной таблицы.

Дельные мысли в его суждениях есть, но похоже ТС боится продолжить диалог в этом треде

И понятно почему! ...

Владимир

anonymous
()
Ответ на: комментарий от ados

Получается, что описал кишки какой-нибудь электронной таблицы.

Sorry, не заметил, что это пост ТС.

Да почему именно электронной таблицы?
Похоже вы сами себя ОТХЛЕСТАЛИ …

Владимир

anonymous
()

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

отношения ячеек формируют граф

Отношения выражаются самой структурой программы.

какой оптимальной последовательностью вычислений это сделать

Ленивые вычисления.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Как бы в целом это похоже на общую концепцию функционального программирования.

Это да.

Мне «ближе» императивное + декларативное + логическое программирование …

Что касаемо функционального программирования, то это как

императивное + декларативное + логическое программирование БЕЗ ЯИЦ ...

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Поддерживаете ли вы пользователей, уведомляющих администрацию ресурса о нарушениях правил форума?

На работе то же ведь администрация есть и очень схожа на администрацию ЛОР … /ну вы поняли/.

Я сотрудничаю с

РАЗРАБОТКОЙ! ...

Владимир

anonymous
()

Такие вещи реализуются с помощью dependency tree. Если изменился узел - то нужно пересчитать всех детей этого узла, и все.

Циклические зависимости возможно разрешить итеративно, с помощью нескольких проходов. Например любой ассемблер так считает все свои адреса. Те что смог рассчитать сразу - рассчитал, «ячейка» вернула статус рассчитнно. Не смог - но сумел сузить диапазон, сохранил и вернул статус «пересчитать на следующем проходе».

Майкрософт кстати уже начали подозревать что табличный процессор может быть чем-то большим.

https://thenewstack.io/microsoft-excel-becomes-a-programming-language/

Если майки выкатят специальный Эксель для разработки, нетекстовое программирование сразу станет мэйнстримом. За него будут платить и все тру текстовые прогеры с Лора резко переобуются. Скорей бы посмотреть на то, как они будут маневрировать.

kolpakchi
()

То, что ты описал, встречается в том или ином виде в разных языках программирования высокого уровня.

Замени свои «ячейки» на «выражения», а «связи» на «функции» и пиши свою модель на Haskell. Я только не знаю, как там по умолчанию кеширование результатов вычисления функций реализовано, возможно нужно будет настроить в более агрессивную сторону.

Я использую нечто подобное в моем проекте на питоне. Почти все методы объектов у меня - это лениво вычисляемые кешируемые свойства (похоже на @cached_property из стандартной библиотеки, но мне нужно немного больше гибкости).

В любой момент обращаешься к любому атрибуту объекта и дальше все необходимые вычисления выполняются рекурсивно.

Может ещё есть алгоритмы совершеннее вышеописанных идей?

Если смотреть на твою модель с одной стороны, то это будет, как ты выразился, «пересчет модели». Если посмотреть с противоположной стороны, то «ленивые вычисления + кеширование». Мне лично второй вариант кажется более естественным.

aquadon ★★★★★
()
Последнее исправление: aquadon (всего исправлений: 1)
Ответ на: комментарий от aquadon

То, что ты описал, встречается в том или ином виде в разных языках программирования высокого уровня.

Угу, «высокОГО».

Уже лет шестьдесят все ИЗОБРЕТАЮТ, ИЗОБРЕТАЮТ, ИЗОБРЕТАЮТ, … - БАЛАЛАЙКИ.

Им до ВЫСОКОГО уровня как до …

Вас обманывают! ...

Владимир

anonymous
()
Ответ на: комментарий от anonymous

На форуме бывает обсуждают использование Rust в Linux.

ИМХО для разработки ядра его не нужно использовать.
У Си своя RTL, у Rust своя, …

Для разработки tools, API, … - non problem …

Владимир

anonymous
()
Ответ на: комментарий от ados

Пора бы уже опохмелиться после вчерашнего

И вчера и сегодня все посты по делу.
Тем более, что в постах говорится о том, что разработано и реально используется …

Владимир

anonymous
()

@ados, конечно SORRY.

Что касается пить, то скажу вам по секрету: не пью, не курю, не матюкаюсь, …

МНОГО на этой неделе API хорошего разработал, ну вот и не удачно поделился

своим  

Владимир

anonymous
()
Ответ на: комментарий от aquadon

как там по умолчанию кеширование результатов вычисления функций реализовано

Никак.

возможно нужно будет настроить в более агрессивную сторону

В Haskell нет кэширования. Ты можешь, конечно, сделать свою обвязку, или использовать какую-нибудь стороннюю библиотеку, но с языком это уже слабо связано.

Miguel ★★★★★
()
Ответ на: комментарий от kolpakchi

Майкрософт кстати уже начали подозревать что табличный процессор может быть чем-то большим.

Это, в общем, уже давно общее место.

Если майки выкатят специальный Эксель для разработки

Excel для разработки уже существует. Он называется Excel.

нетекстовое программирование сразу станет мэйнстримом.

Ща, разбежался.

Miguel ★★★★★
()
Ответ на: комментарий от kolpakchi

Эксель - это какое программирование, текстовое или нет?

Почти исключительно текстовое, с минимальными вкраплениями (не больше, чем, скажем, при использовании IDE).

Miguel ★★★★★
()

О, я таким страдал лет 20ть назад в аспирантуре:-)

Тут главное понять зачем. Если джаст-фор-фан тогда ладно, а если хочется этим осчастливить человечество или решить какую то свою реальную задачу… То скорее всего что то пошло не так:-(

Вообще, ежели хочется интересных актуальных задач джаст-фор-фан, в тч по программированию, то велкам, их есть у меня:-)

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

Вообще, ежели хочется интересных актуальных задач джаст-фор-фан, в тч по программированию, то велкам, их есть у меня:-)

Актуальных задач много.
У вас они одни, у других другие.
Так что

Успехов вам! ...
anonymous
()
Ответ на: комментарий от AntonI

а если хочется этим осчастливить человечество или решить какую то свою реальную задачу…

то что ты нишмог, это не значит что другие не смогут

Вообще, ежели хочется интересных актуальных задач джаст-фор-фан, в тч по программированию, то велкам, их есть у меня:-)

мы готовы, давай

anonymous
()

Может ещё есть алгоритмы совершеннее вышеописанных идей? Какие алгоритмы полезно изучить для реализации такого?

  1. Arcan, Durden галерея в бложике Arcan есть такое: pipeworld – как раз на твоё dataflow похоже. ещё: arcan-as-operating-system-design

  2. внезапно, Xanadu и изначальный гипертекст Теодора Хольма Нельсона. конкретно, ZigZag Database и похожее многомерное zzStructures.

  3. метапрог истинного пути, конечно же. whatever that is. LOL

anonymous
()

Подобная задача решается такими программами как система сборки make и менеджерами пакетов. Здесь особенность в том, что основа ячейки - переменные в памяти программы.

Reactive Programming: FRP изначальный на хаскеле либо Object FRP на F# (был какой-то игровой движок на F# с ОО FRP) либо внезапно, RED и ексель в десяток строчек здесь: native-reactive-spreadsheet-in-17-loc . ещё см. livecoding

на REBOL3 тоже что-то подобное было, только по другому и не так просто.

anonymous
()
Ответ на: комментарий от anonymous

Просьба к тем, кто использует зависимые типы привести пример хорошего обобщенного алгоритма с кратким разъяснением его

в idris-tutorial понравилось про.

anonymous
()
Ответ на: комментарий от aquadon

как там по умолчанию кеширование результатов вычисления функций реализовано

никак, но man мемоизация

anonymous
()
Ответ на: комментарий от kolpakchi

специальный Эксель для разработки

тю. ещё во времена AbiWord был какой-то рядом с ним (или одновременно) Excel на GTK, в котором на Guile scheme формулы описывались.

думается, ленивость туда добавить не сильно сложно было бы.

anonymous
()
Ответ на: комментарий от kolpakchi

Эксель - это какое программирование, текстовое или нет?

гипертекстовое многомерное.

в духе ZigZag structures многомерного гипертекста изначального нашего Теодора Холма Нельсона.

собственно, случай тривиальный : многомерность равна двум. в сводных таблицах чуть получше, но всё равно ещё не OLAP. и даже не MUMPS.

в 90х кстати, кто-то на MUMPS-ах сетевой распределённый ексель написал. в котором таблицы можно было совместно редактировать, всем офисом.

M сам по себе императивный, типа FOCAL-а. но в общем, ООП обвязки MUMPS-а появляются: (Cache Object Script, EsiObjects, PSL aka Profile Script Language, MAGIC, MSH (см на хабре и на гитхабе репозиторий с реализацией – туда даже GTK впихнули))

так что нечто объектно-реактивное на таком, имхо, вполне себе возможно изобразить.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.