spamsink: (Default)
spamsink ([personal profile] spamsink) wrote2022-02-04 08:14 pm

Немного компьютерной лингвистики

Если бы я знал ответ на более или менее ретрокомпьютерный вопрос, который хочу задать, из него могла бы получиться неплохая задачка для олимпиад по лингвистике. А пока это только вопрос в воздух.



Имеется двоичный код (считай, "черный ящик"), реализующий функциональность хранилища данных, позволяющий работать с массивами пар "ключ-данные", хранящихся на внешних устройствах, адресуемых по "логический номер устройства-номер блока"

Известен неполный интерфейс к нему (мелкие детали опущены):

  • создать новый каталог верхнего уровня, задавая Номер Устройства/Начальный Номер Блока/Число Блоков для каталога
  • создать в каталоге верхнего уровня массив, задавая имя массива и НУ/ННБ/ЧБ, где массив будет храниться
  • открыть массив по имени, он становится текущим
  • занести в текущий массив запись "ключ-данные" (если запись с таким ключом уже есть, возвращается ошибка)
  • считать из текущего массива данные по ключу
  • удалить из текущего массива запись по ключу
  • модифицировать новыми данными в текущем массиве запись по ключу (если записи с таким ключом не было, выполняется как "занести")


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

  • создать каталог: 10-21
  • создать массив: 31-11-15-21-26-11-14-12-10-21
  • открыть массив: 31-11-14-12-25
  • занести запись: 11-15-21-26 (в случае ошибки отрабатывает только 11-15)
  • считать данные: 11-14-22
  • удалить запись: 11-14-23-27
  • модифицировать: 11-15-00-21-26-40 (подаётся на вход и выполняется, если такой записи не было); если была, то вместо этого выполняется 11-15-20


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

[personal profile] dijifi 2022-02-05 04:27 pm (UTC)(link)
00 начало модификации
10 каталог
11 поиск
12 открыть массив
14 выборка для чтения или удаления
15 выборка для модификации
20 запись данных
21 запись
22 чтение данных
23 удаление
26 обновить индексацию
27 обновить индексацию при удалении
31 массив
40 конец модификации

[personal profile] sassa_nf 2022-02-06 09:42 am (UTC)(link)
how do you know all these have distinct functions manipulating high level abstractions like catalogue or array?

what if 11 is "push r0 onto operand stack"

what I find "inconsistent" in your description, is:

> создать массив: 31-11-15-21-26-11-14-12-10-21
> занести запись: 11-15-21-26

From the second line we conclude 11-15-21-26 refers to "key" and "value" to store somewhere. But there is no apparent "value" to store in 31-11-15-21-26, if we choose 31 to only be "cd /".

If we assume that the creation of array is the remainder of the clause, "11-14-12" followed by "создать каталог" "10-21" (which possibly means arrays are associative), then "11-14-12" seems to be a read-only part of the statement, as it is also used in "открыть массив", where we don't expect any modification operations.

> подаётся на вход и выполняется, если такой записи не было

it is unclear why in this case it would be different from "занести запись", of which we see "11-15" and "21-26". So one would expect "00" to be a "conditional", but it would need executing, wouldn't it, whereas you say "11-15-20" gets executed.