ECMAScript | Блок данных | Тип спецификации

ECMAScript | Блок данных | Тип спецификации

Тип спецификации Блока Данных (Data Block) используется для описания отдельной и изменяемой последовательности числовых значений байтового (8-битного) размера. Байтовое значение (byte value) — это целое число в диапазоне от 0 до 255 включительно. Значение блока данных создается из фиксированного числа байтов, каждый из которых имеет начальное значение 0.

 

Для удобства записи в этой спецификации синтаксис, подобный массиву, может использоваться для доступа к отдельным байтам значения блока данных. Эта нотация представляет значение блока данных как последовательность байтов с целочисленным индексом, начинающуюся с нуля (0). Например, если db — это 5-байтовое значение блока данных, то db[2] может использоваться для доступа к его 3-му байту.

Блок данных, который находится в памяти, на который могут ссылаться одновременно несколько агентов, называется Общим Блоком Данных (Shared Data Block). У Общего Блока Данных есть идентификатор (для целей проверки равенства значений блока общих данных), который не содержит адресов: он привязан не к виртуальным адресам, на которые блок сопоставляется в любом процессе, а к набору ячеек в памяти. что представляет блок. Два блока данных равны, только если наборы содержащихся в них ячеек равны; в противном случае они не равны, и пересечение содержащихся в них наборов местоположений будет пустым. Наконец, блоки общих данных можно отличить от блоков данных.

Семантика общих блоков данных определяется с помощью событий общих блоков данных моделью памяти. В Абстрактных Операциях ниже представлены события блока общих данных и они действуют как интерфейс между семантикой оценки и семантикой событий модели памяти. События формируют кандидата на выполнение , на котором модель памяти действует как фильтр. Пожалуйста, обратитесь к модели памяти для полной семантики.

События блока общих данных моделируются Записями, определенными в модели памяти.

Следующие Абстрактные Операции используются в этой спецификации для работы со значениями Блока Данных:

 

6.2.8.1 CreateByteDataBlock ( size )
6.2.8.2 CreateSharedByteDataBlock ( size )
6.2.8.3 CopyDataBlockBytes ( toBlock, toIndex, fromBlock, fromIndex, count )

 

6.2.8.1 CreateByteDataBlock ( size )

Абстрактная операция CreateByteDataBlock принимает аргумент size (неотрицательное целое число). При вызове она выполняет следующие шаги:

1. Пусть db будет новым значением Блока Данных, состоящим из байтов size. Если создать такой Блок Данных невозможно, вызовите исключение RangeError.
2. Установите для всех байтов db значение 0.
3. Вернуть db.

 

6.2.8.2 CreateSharedByteDataBlock ( size )

Абстрактная операция CreateSharedByteDataBlock принимает аргумент size (неотрицательное целое число). При вызове она выполняет следующие шаги:

1. Пусть db будет значением нового Общего Блока Данных, состоящим из size байтов. Если невозможно создать такой Общий Блок Данных, вызовите исключение RangeError.
2. Пусть выполнение execution будет полем [[CandidateExecution]] в Записи Агента окружающего агента.
3. Пусть eventList будет полем [[EventList]] элемента execution.[[EventsRecords]], у которого [[AgentSignifier]] есть AgentSignifier().
4. Пусть zero будет «0».
5. Для каждого индекса i из db выполните
   а. Добавить WriteSharedMemory {[[Order]]: Init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero } в eventList.
6. Вернуть db.

 

6.2.8.3 CopyDataBlockBytes ( toBlock, toIndex, fromBlock, fromIndex, count )

Абстрактная операция CopyDataBlockBytes принимает аргументы toBlock (Блок Данных или Общий Блок Данных), toIndex (неотрицательное целое число), fromBlock (блок данных или Общий Блок Данных), fromIndex (неотрицательное целое число) и count (неотрицательное целое число). При вызове она выполняет следующие шаги:

1. Утверждено: fromBlock и toBlock - разные значения.
2. Пусть fromSize будет количеством байтов в fromBlock.
3. Утверждено: fromIndex + countfromSize.
4. Пусть toSize будет количеством байтов в toBlock.
5. Утверждено: toIndex + counttoSize.
6. Повторите, пока count > 0,
  а. Если fromBlock является Общим Блоком Данных, тогда
    i. Пусть execution будет полем [[CandidateExecution]] в Записи Агента окружающего агента.
    ii. Пусть eventList будет полем [[EventList]] элемента execution.[[EventsRecords]], у которого [[AgentSignifier]] есть AgentSignifier().
    iii. Пусть байты bytes будут Списком, единственным элементом которого является недетерминированно выбранное значение байта.
    iv. ПРИМЕЧАНИЕ. В реализациях байты bytes являются результатом неатомарной инструкции чтения на базовом оборудовании. Недетерминизм - это семантическое предписание модели памяти для описания наблюдаемого поведения оборудования со слабой согласованностью.
    v. Пусть readEvent будет ReadSharedMemory {[[Order]]: Unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1} ".
    vi. Добавьте readEvent в список событий eventList.
    vii. Добавить Запись Выбранного Значения {[[Event]]: readEvent, [[ChosenValue]]: bytes} к execution.[[ChosenValues]].
    viii. Если toBlock - это блок общих данных, то
      1. Добавьте WriteSharedMemory {[[Order]]: Unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes} в список событий eventList.
    ix. Иначе,
      1. Установите для toBlock[toIndex] значение bytes[0].
  b. Иначе,
    i. Утверждено: toBlock не является блоком общих данных.
    ii. Установите для toBlock[toIndex] значение fromBlock[fromIndex].
  c. Установите для toIndex значение toIndex + 1.
  d. Установите для fromIndex значение fromIndex + 1.
  e. Установить для count значение count - 1.
7. Верните NormalCompletion(empty).

 

Информационные ссылки

Стандарт ECMAScript — Раздел «6.2.8 Data Blocks» — https://tc39.es/ecma262/#sec-data-blocks