Nov. 2nd, 2012

Приняты следующие дизайнерские решения относительно автоматического генератора симуляторов систем взаимодействия (см. "Анонс нового языка программирования"). Некоторые детали проектной документации подлежат уточнению позднее.

Определения

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

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. Реализация компилятора может, но не обязана предоставлять опцию многопоточной обработки стека активных пар. В случае поддержки данной опции, реализация может затребовать дополнительные ограченения к приложению и побочным действиям правил взаимодействия.

Обоснование )

Интерфейс к симуляторам систем взаимодействия выбран по аналогии с теми в IEEE 1003.1-2008, что между утилитой yacc и приложениями, в том числе генерируемыми с помощью утилиты lex (см. "Interface to the Lexical Analyzer").

Profile

Anton Salikhmetov

November 2018

S M T W T F S
    123
45678 910
11121314151617
18192021222324
252627282930 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 9th, 2025 04:14 pm
Powered by Dreamwidth Studios