Немного компьютерной лингвистики
Feb. 4th, 2022 08:14 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Если бы я знал ответ на более или менее ретрокомпьютерный вопрос, который хочу задать, из него могла бы получиться неплохая задачка для олимпиад по лингвистике. А пока это только вопрос в воздух.
Имеется двоичный код (считай, "черный ящик"), реализующий функциональность хранилища данных, позволяющий работать с массивами пар "ключ-данные", хранящихся на внешних устройствах, адресуемых по "логический номер устройства-номер блока"
Известен неполный интерфейс к нему (мелкие детали опущены):
Известно, что код работает на "микропрограммном" принципе. Интерфейсные вызовы дают "чёрному ящику" следующие последовательности микрокоманд:
Предлагается, используя навыки логического мышления, вывести из этого смысл и назначение использованных микрокоманд, насколько это возможно. У меня есть несколько идей, но полной ясности я не достиг.
Имеется двоичный код (считай, "черный ящик"), реализующий функциональность хранилища данных, позволяющий работать с массивами пар "ключ-данные", хранящихся на внешних устройствах, адресуемых по "логический номер устройства-номер блока"
Известен неполный интерфейс к нему (мелкие детали опущены):
- создать новый каталог верхнего уровня, задавая Номер Устройства/Начальный Номер Блока/Число Блоков для каталога
- создать в каталоге верхнего уровня массив, задавая имя массива и НУ/ННБ/ЧБ, где массив будет храниться
- открыть массив по имени, он становится текущим
- занести в текущий массив запись "ключ-данные" (если запись с таким ключом уже есть, возвращается ошибка)
- считать из текущего массива данные по ключу
- удалить из текущего массива запись по ключу
- модифицировать новыми данными в текущем массиве запись по ключу (если записи с таким ключом не было, выполняется как "занести")
Известно, что код работает на "микропрограммном" принципе. Интерфейсные вызовы дают "чёрному ящику" следующие последовательности микрокоманд:
- создать каталог: 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
Предлагается, используя навыки логического мышления, вывести из этого смысл и назначение использованных микрокоманд, насколько это возможно. У меня есть несколько идей, но полной ясности я не достиг.
no subject
Date: 2022-02-06 09:42 am (UTC)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.
no subject
Date: 2022-02-06 09:46 am (UTC)no subject
Date: 2022-02-07 08:20 am (UTC)which possibly means arrays are associative
Duh. That's what позволяющий работать с массивами пар "ключ-данные" implies.
The mechanism of conditionals is still unclear. It could be that command 00 reads some flags and constructs an opcode to execute based on them. Like
opcode = (entry_exists << 5) | .... ; if (opcode) execute(opcode); else continue;
And opcode 20 does whatever is necessary to fulfill the request.
no subject
Date: 2022-02-07 08:32 am (UTC)11-15-00-21-26-40-20
so 40 means stop, and 00 means "conditionally skip the next 3 instructions".