Семантика

Имеется 64 региста ввода/вывода, 64 регистра базы, 64 регистра работ, 64 регистра стиля.

Каждый регистр имеет односимвольное имя, символы для имен: [0-9a-zA-Z_]. Этих имен всего 63 штуки, потому один из регистров в каждом наборе поименован быть не может, потому недоступен. То есть зарезервирован для расширений. Если он реально встречается в программе, то в дампе он именуется символом -, но именем этот символ не является.


Регистры ввода-вывода

Регистры ввода/вывода многофункциональны. В них может заноситься результат команды, из них могут браться входные данные команды и управление. В этих регистрах могут храниться следующие сущности:

Коды приведены, как отмечаются в регистре. В описании команд имеют немного иное значение.

Первые 4 сущности могут участвовать в преобразованиях значений. Если в регистре есть информация, то одна из форм помечается как первоисточник, другие формы в регистре являются производными. Если требуется приведение к форме, отсутствующей в регистре, то источником информации для новой формы может послужить как первоисточник, так и какая либо из производных имеющихся в регистре форм. Описание приведения в зависимости от использования регистра в команде приведено ниже.

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

При запуске pgoblin на 0й регистр ввода/вывода помещаются входной поток (из стека, или, если пуст, stdin) и stdout. Остальные регистры ввода-вывода при старте pgoblin пусты, при форке все регистры ввода-вывода в родительском и порожденном процессах идентичны.

Поскольку вывод (OUT), управление (CTL) и ввод (IN) - регистры одного пула, то через эти регистры команды могут передавать результаты на вход или управление последующим командам. Поведение команд, у которых выходной регистр ввода/вывода совпадает со входным или контрольным, и при этом в регистрах используются не потоки, не определено.

При завершении pgoblin все открытые на регистрах ввода/вывода файлы, помеченные к закрытию, закрываются, все остальное содержимое регистров ввода/вывода теряется.


Регистры базы

В регистрах базы содержатся соединения с базами. Там определена не только СУБД, но и конкретная база, к которой отправляются запросы, и другие параметры. Все параметры командной строки отправляются в регистр базы 0. Для остальных регистров СУБД регистра 0 является СУБД по умоляанию. Соединение с базой устанавливается только когда оно впервые потребовалось, на том регистре, на котором оно затребовано. Параметры соединения сейчас можно задавать для регистра 0 через стандартные опции pq при вызове pgoblin. Так же на все соединения действуют переменные окружения в соответствии с клиентскими библиотеками СУБД. Параметры соединений с базами на любом регистре могут задаваться в соответствующей соманде #connect.

При запуске 0й регистр базы заполняется параметрами соединения, но не открывается, пока не потребуется. Вполне возможны программы на pgoblin, которые работают без СУБД.

При форке порожденный процесс получает регистры баз с таким же содержимым, как и родитель, но все установленные соединения с СУБД помечаются как не "свои", и при завершении порожденного процесса они не будут закрыты.

При завершении pgoblin все соединения с базами на открытых регистрах базы, которые были открыты текущим процессом, закрываются, если иное не задано в команде #exit.


Регистры работ

Все регистры работ предназначены для интерфейса с ОС. Через них есть доступ к файловой системе, наблюдение за процессами-потомками, в них есть списки номеров процессов с кодами завершения (или -1, если код завершения (еще) не получен) и номерами команд, которые эти процессы породили. Длинна списка практически неограничена.

0й регистр работ заполняется номерами родительского и текущего процессов. Номера команд и коды завершения у них -1.

Процессы могут только добавляться в регистр работ, порядок процессов в регистре соответствует порядку, в котором процессы добавлялись.

Все процессы, порожденные неявным форком, заносятся в 0й регистр работ.


Регистры стиля

Регистр стиля может содержать правила оформления выводимых таблиц и коллекцию именованных значений. В регистре стиля 0 всегда содержится экземпляр стиля 0, в котором коллекция именованных значений пуста, а таблицы выводятся конкатенацией всех значений всех полей во всех строках по порядку. Остальным регистрам стиля могут присваиваться произвольные стили.


Порядок исполнения команд

Каждой команде передаются номера 6ти регистров

Первые 3 регистра - это регистры из общего набора регистров ввода/вывода. Регистры базы, работ и стиля - это другие наборы, не пересекающиеся с набором регистров ввода/вывода и между собой.

Если какой либо регистр в команде должен использоваться, но не указан, то используется регистр по умолчанию - 0.

Выполнение каждой команды начинается с подготовки регистров, с которыми команда работает. Последовательность подготовки регистров совпадает с последовательностью их записи в программе:

После подготовки регистров исполняется команда, возможно, с неявным форком, если это определено на этапе подготовки регистров.

Если в процессе подготовки или выполнения команды случилась ошибка, то управление передается в секцию #trap, если такая была определена до возникновения ошибки, иначе выполняется #return.

Если команда помещает в выходной регистр ввода-вывода какое-либо значение, и у этого регистра определен выход, то после выполнения команды этот регистр разгружается. Регистр ввода-вывода 0 практически всегда имеет выход в stdout, потому результаты, отправленные в этот регистр, выводятся.


OUT - выходной регистр ввода-вывода

В этот регистр, как правило, помещается результат (в описании команд стоит пометка Po в OUT), но некоторые команды переоформляют этот регистр (без пометки Po). Команда может поместить в регистр текст (Po Pt), имя файла (Po Pf), таблицу (Po Pq) или поток (Po Pm).

Если в регистре уже существовал Pt или Pq, то они разрушатся.

Если в регистре существовал Pf, то он преобразуется в поток (Pm) в файл, заданный Pf. Если имя файла внесено в регистр командой #file, то файл замещается, если же командой #cat, то файл дописывается.

Во вновь созданный или ранее существовавший поток Pm произойдет выгрузка помещаемого значения

Pt выгружается непосредственно.

Pf выгружает файл с заданным именем.

Pq выгружается стилем 0.

Если в регистре нет ни выходного потока, ни имени файла, то при исполнении команды делается неявный форк и поток создается с выхода команды на Pm родительского процесса. Номер процесса при неявном форке помещается в 0й регистр работ.


CTL - управляющий регистр ввода-вывода

Как правило, из этого регистра берется управляющая информация для команды, например, SQL команды для обращающихся к СУБД команд pgoblinа.

Если указан регистр 0, то это текст - литерал, который следует за командой pgoblinа. Для команды exec, которая требует Pq, при использовании 0го регистра значение собирается из литералов команды и литералов пустых команд, непосредственно следующих за командой exec. В остальных случаях обработка регистра происходит так же, как и входного регистра ввода-вывода.


IN - входной регистр ввода-вывода

Команда может затребовать на ввод значение одного из (по состоянию на момент описания) 4х видов, и храниться в регистре могут значения 4х пригодных для ввода видов. Беда в том, что они могут не совпадать, и тогда включается процедура приведения.

Если в регистре содержится Pq, то его можно привести к Pt конкатенацией всех ячеек Pq. В свою очередь, Pt можно привести к Pm, этот поток отдаст все содержимое Pt.

Если в регистре содержится Pf, то открывается файл с созданием Pm, этот поток выдает все содержимое файла. Его можно считать целиком и получить Pt.

Если регистр пуст, то создается поток в заданном регистре и заказывается форк, направление потока от родителя к порожденному процессу.


CON - регистр базы

Если соединения с СУБД нет, а оно требуется, то устанавливается в соответствии с параметрами, которые хранятся в регистре. Если в регистре уже есть установленное соединение, то используется существующее соединение.


JOB - регистр работ

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


STY - регистр стиля

Некоторые команды могут взять из стиля значение по имени, другие могут отправить стилю таблицу для преобразования в поток. Стили - это, по сути, программы на отдельном языке, описано отдельно.



А.А.Бабайлов (C)2003..2022