![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Приняты следующие дизайнерские решения относительно автоматического генератора симуляторов систем взаимодействия (см. "Анонс нового языка программирования"). Некоторые детали проектной документации подлежат уточнению позднее.
Определения
Симулятором называется результат компиляции правил взаимодействия с побочными действиями, описанных на языке, заявленном ранее. Приложением называется внешняя программа, определяемая пользователем, которая использует симулятор через интерфейс, описанный ниже.
Проект
1. Компилятор генерирует симулятор на языке ISO/IEC 9899:1999 за конечное время. Симулятор имеет один общий стек для всех активных пар. Симулятор предоставляет интерфейс приложению для проталкивания в вершину стека:
2. Симулятор вызывает внешнюю функцию
3. Сигнатура
4. Приложение определяет каждую связь между двумя дополнительными портами с порядковыми номерами
5. Реализация компилятора может, но не обязана предоставлять опцию многопоточной обработки стека активных пар. В случае поддержки данной опции, реализация может затребовать дополнительные ограченения к приложению и побочным действиям правил взаимодействия.
Обоснование
(Здесь и далее под слепой системой имеется в виду система слепой перезаписи графов, которая симулирует взаимодействие направленных комбинаторов с дополнительным типом ψ.) Прежде всего, данный проект направлен на автоматическое генерирование симулятора системы взаимодействия для отладочного вывода результатов работы слепой системы. Однако, проект ставит своей целью симуляцию любых систем взаимодействия для произвольных приложений.
1. В слепой системе задействуются четыре стека активных пар. Однако, в общем случае как сигнатура системы взаимодействия, так и правила взаимодействия формально могут быть бесконечными множествами. В общем случае не существует унифицированного многостекового решения с балансом выделяемой и освобождаемой памяти, которое бы можно было получить автоматически за конечное время. Интерфейс к проталкиванию в вершину стека предоставлен как для инициализации стека перед началом работы симулятора, так и для создания новых активных пар уже во время его работы.
2. Структуры, используемые как в слепой системе, так и в других приложениях могут отличаться от тех, которыми оперирует симулятор. Поэтому симулятор не накладывает никаких ограничений ни на внутреннее представление сети взаимодействия, ни на время работы функции
3. Интерфейс к сигнатуре, предоставляемый симулятором приложению, выбран так, чтобы избежать как засорения пространства имен перечислениями во время написания и сборки приложения, так и сравнения строк во время работы симулятора.
4. Представление связей между двумя дополнительными портами позаимствовано из слепой системы и выбрано таким образом, что при возникновении активной пары с участием агента
5. Ввиду конфлюэнтности систем взаимодействия и локальности правил для них, вполне естественно применять многопоточную обработку стека активных пар. Тем не менее, на данном этапе не ставится цели непременно реализовать данную опцию.
Интерфейс к симуляторам систем взаимодействия выбран по аналогии с теми в IEEE 1003.1-2008, что между утилитой
Определения
Симулятором называется результат компиляции правил взаимодействия с побочными действиями, описанных на языке, заявленном ранее. Приложением называется внешняя программа, определяемая пользователем, которая использует симулятор через интерфейс, описанный ниже.
typedef struct {
void *type;
int index;
void *aux[INAUXLEN];
} inagent;
extern const struct insign {
void *offline;
void *wire;
void *type1;
void *type2;
...
} insign;
Проект
1. Компилятор генерирует симулятор на языке ISO/IEC 9899:1999 за конечное время. Симулятор имеет один общий стек для всех активных пар. Симулятор предоставляет интерфейс приложению для проталкивания в вершину стека:
void inpush(inagent *left, inagent *right)
. Только сам симулятор выталкивает вершину стека. Симулятор предоставляет интерфейс к запуску взаимодействия: void interact(void)
. Возврат из функции interact()
происходит по достижении дна стека активных пар.2. Симулятор вызывает внешнюю функцию
inagent *inaux(void *aux, void *offline)
, определяемую приложением, чтобы получить ячейку, связанную своим главным портом с дополнительным портом aux
. Значение аргумента берется только из массива aux
в структуре inagent
одного из агентов активной пары только на вершине стека. Симулятор не предполагает какой-либо структуры по адресу aux
, никогда не разыменовывает его и использует аргумент функции inaux()
исключительно в качестве идентификатора. Приложение полностью решает само, какой характер носит значение aux
. Симулятор никогда не сохраняет возвращаемое значение функции и только копирует данные из памяти по этому адресу.3. Сигнатура
insign
содержит поля offline
, wire
, type1
, type2
..., где type1
, type2
... - различные имена, участвующие в описании системы взаимодействия в виде \type1
, \type2
... Всем полям структуры insign
присвоены различные целые значения. Если в описании системы взаимодействия участвует имя \offline
, \wire
или \special
, где special
- ключевое или зарезервированное слово ISO/IEC 9899:1999, результат компиляции неопределен.4. Приложение определяет каждую связь между двумя дополнительными портами с порядковыми номерами
a
и b
произвольных inagent alpha
и inagent beta
, соответственно, такой парой структур inagent left
и inagent right
, что insign.wire == left.type
, insign.wire == right.type
, left == right.aux[0]
, right == left.aux[0]
, left == alpha.aux[a]
и right == beta.aux[b]
. Если wire1
и wire2
- идентификаторы этих двух структур, то после вызова inaux(wire1, offline)
симулятор ожидает, что последующий вызов inaux(wire2, unused)
вернет указатель на такую структуру inagent agent
, что agent.type == insign.offline
и agent.aux[0] == offline
. Если в описании одного правила имя соединения между двумя дополнительными портами используется один или более двух раз, результат компиляции неопределен.5. Реализация компилятора может, но не обязана предоставлять опцию многопоточной обработки стека активных пар. В случае поддержки данной опции, реализация может затребовать дополнительные ограченения к приложению и побочным действиям правил взаимодействия.
Обоснование
(Здесь и далее под слепой системой имеется в виду система слепой перезаписи графов, которая симулирует взаимодействие направленных комбинаторов с дополнительным типом ψ.) Прежде всего, данный проект направлен на автоматическое генерирование симулятора системы взаимодействия для отладочного вывода результатов работы слепой системы. Однако, проект ставит своей целью симуляцию любых систем взаимодействия для произвольных приложений.
1. В слепой системе задействуются четыре стека активных пар. Однако, в общем случае как сигнатура системы взаимодействия, так и правила взаимодействия формально могут быть бесконечными множествами. В общем случае не существует унифицированного многостекового решения с балансом выделяемой и освобождаемой памяти, которое бы можно было получить автоматически за конечное время. Интерфейс к проталкиванию в вершину стека предоставлен как для инициализации стека перед началом работы симулятора, так и для создания новых активных пар уже во время его работы.
2. Структуры, используемые как в слепой системе, так и в других приложениях могут отличаться от тех, которыми оперирует симулятор. Поэтому симулятор не накладывает никаких ограничений ни на внутреннее представление сети взаимодействия, ни на время работы функции
inaux()
. Например, приложение может ожидать данные из сокета IPv4, прежде чем функция вернет значение. Приложение также может хранить сеть взаимодействия в файле на диске или даже удаленно в текстовом формате вместо кучи в памяти. Таким образом, значение аргумента может быть не только указателем на место в памяти, а вообще произвольным целым числом. 3. Интерфейс к сигнатуре, предоставляемый симулятором приложению, выбран так, чтобы избежать как засорения пространства имен перечислениями во время написания и сборки приложения, так и сравнения строк во время работы симулятора.
4. Представление связей между двумя дополнительными портами позаимствовано из слепой системы и выбрано таким образом, что при возникновении активной пары с участием агента
wire
типа insign.wire
с одной стороны и произвольного agent
- с другой, происходит подмена противоположного конца wire
на agent
. Впоследствии, симулятор получит идентификатор agent
, когда и если он вызовет inaux()
против соответствующего дополнительного порта. Специальный тип insign.offline
введен для того, чтобы отличать внутренние идентификаторы агентов на стороне приложения от действительных указателей внутри симулятора.5. Ввиду конфлюэнтности систем взаимодействия и локальности правил для них, вполне естественно применять многопоточную обработку стека активных пар. Тем не менее, на данном этапе не ставится цели непременно реализовать данную опцию.
Интерфейс к симуляторам систем взаимодействия выбран по аналогии с теми в IEEE 1003.1-2008, что между утилитой
yacc
и приложениями, в том числе генерируемыми с помощью утилиты lex
(см. "Interface to the Lexical Analyzer").