Библиотека для кеширования зависящих друг от друга объектов

Постановка задачи всё ещё содержит изрядно элементов её решения, увы ☹.

Дано пространство объектов (изначально пустое). У каждого возможного объекта есть:

Имена могут быть составными: например, могут быть объекты, имена которых имеют одинаковые суффиксы, и с такими группами объектов предполагается работать. Также частью имени является версия (timestamp).

  1. FrBrGeorge/MyDict/speech_balloon_question.png Вариант: можно заранее договориться, что у имени есть синтаксическая структура

  2. FrBrGeorge/MyDict/speech_balloon_question.png Вариант: имя можно оставить в покое и ввести отдельное поле категории с хештегами или чем-то подобным

  3. FrBrGeorge/MyDict/speech_balloon_question.png Вариант: такие категории можно оформить как часть родословной, тогда нового поля не надо (версию, наверное, нельзя выносить в родословную)

Далее в тексте под термином имя предполагается вариант № 1

Объекты могут образовываться двумя путями:

Среди типов объектов выделяется особый тип рецепт (FrBrGeorge/MyDict/speech_balloon_question.png один или несколько?). Рецепт описывает граф генерации объектов (логика работы рецепта может быть любой — это контент объекта типа рецепт).

В шаблоне могут встречаться:

Требуется: на основании имени (FrBrGeorge/MyDict/speech_balloon_question.png шаблона?) объекта-целевого генерата

Пример «Make»

(синтаксис условный) Собрать объект программа: prog (программа — тип, prog — имя).

Рецепты (два объекта в системе):

компоновка::
  generates = программа: «имя»; файл_лог: «имя».log
  sources = файл_obj: «имя».o; файл_obj: lib.o
  content = call_gnu_ld

и

компиляция::
  generates = файл_obj: «имя».o
  sources = файл_си: «имя».c
  content = call_gcc

В этом примере

Процедуры call_gnu_ld / call_gcc устанавливают версию генерата равной текущему времени:

  1. FrBrGeorge/MyDict/speech_balloon_question.png Вариант: Сообразно внутренней логике — это не контролируется синтаксисом

  2. FrBrGeorge/MyDict/speech_balloon_question.png Вариант: Сообразно умолчаниям, которые (в иных случаях) можно поменять, например, на «сделать версию равной версии исходника»

Пример «HWorker»

(синтаксис условный) Собрать объект оценка: финал (user: Никифор) (user: Никифор — фильтр на родословную)

Рецепты

финальный_балл::
  gerenates = оценка: финал (user: «студент»)
  sources = оценка: за_задачу (user: «студент»; задача: «задача»);
            оценка: за_посещаемость (user: «студент»; задача: «задача»)
  content = вычислить_формулу

Здесь:

оценка_задачи::
  gerenates = оценка: за_задачу (user: «студент»; задача: «задача»)
  sources = решение: «имя_программы» (user: «студент»; задача: «задача»)
  content = оценить_решение

Здесь «решение» — это входные данные, в которых предполагается единственный объект с произвольным именем (отсюда свободная переменная «имя_программы»)

оценка_посещаемости::
  gerenates = оценка: за_посещаемость (user: «студент»; задача: «задача»)
  sources = решение: «имя_программы» (user: «студент»; задача: «задача», version=MIN);
            дедлайн: «неважно_что» (задача: «задача»)
  content = оценить_время

Здесь выбирается самое раннее решение с помощью явного фильтра имени; а имя дедлайна значения не имеет вообще.

TODO очистка неиспользованных генератов


Предыдущий вариант постановки.

Дано

  1. Задано некоторое (изначально пустое) пространство объектов разных категорий
    1. Часть категорий — это объекты-исходники

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

    2. Оставшиеся категории — это объекты-генераты

      • Генерат (возможно, несколько, и возможно — различных категорий) конструируется из объектов других категорий (как исходников, так и генератов) с помощью процедуры сборки

  2. У каждого объекта и каждой процедуры есть уникальный идентификатор

  3. У каждого объекта и каждой процедуры есть версия («время создания»). Версия не может уменьшаться.

    • Появление процедуры или объекта с имеющимся идентификатором, но новой (более поздней) версией называется обновлением

    • Решение о присвоении объекту определённой версии принимает процедура
    • Если идентификатор и версия совпадают, считается, что объект не изменился.

Известны:

Понятие «актуальности» и «недоступности»

Актуальный объект или процедура всегда имеют наибольшую версию.

Дополнительно:

Недоступным называется объект, который не может быть получен никакой актуальной процедурой.

Хранение

Хранятся как минимум все версии исходников и все доступные генераты.

Требуется

На основании заданных процедур и хранимого пространства объектов получить цель — заданный набор актуальных исходников и/или генератов.

Если по каким-то причинам объект получить нельзя, возвращается т. н. пустой объект, при этом доступен вердикт — обоснование, отчего объект не получен.

Условия

Реализация

TODO Пока только идеи

FrBrGeorge/ActualEducationalTasks/UniversalCache (последним исправлял пользователь FrBrGeorge 2025-09-17 22:26:09)