<<< BACK NEXT >>>

ПЕРЕМЕННЫЕ  И  МЕСТА: БАЗОВЫЕ ПОНЯТИЯ

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

'D'   - двойное плавающее число (double float)   - 8 байт
'F'   - плавающее число (float)                  - 4 байта
'G'   - great (unsigned long) "большое"          - 4/8 байт
'L'   - long                                     - 4/8 байт
'W'   - word (unsigned  integer)                 - 4 байта
'I''  - integer                                  - 4 байта
'H'   - unsigned half-integer                    - 2 байта
'J'   - signed half integer                      - 2 байта
'B'   - байт (byte)                              - 1 байт
'C'   - character                                - 1 байт
'S'   - строка                                   - количество знаков строки
                                                   + 1 байт конца
'V'   - переменная                               - 9 байт
'P'   - место                                    - 10 байт
'O'   - блок/команда                             - 8 байт

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

   WRITE_ONLY    - только для записи
   READ_ONLY     - только для чтения
   LOCKED        - запрещено для использования.
   FREE или UNLOCKED (синонимы) - свободно или разблокировано.

   При этом изменить состояние места, так же как и всесторонне (без ограничений) использовать место может только блок (но не его подблоки), первым установивший ограничивающее состояние, естественно, до установления им состояния "FREE".    Доступ к статусу (проверка) из других блоков места осуществить с помощью операции '$':

   $<имя места>

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

   . . .
  Wait $Place1 == FREE
  Place1 := 10

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

ТИПИЗИРОВАННЫЕ ПЕРЕМЕННЫЕ

В язык Caper 4 включены средства типизации переменных. Тип переменной задается следующими дескрипторами типа:

   ‘<’[<свойство>] <тип> ‘>’

<свойство> ::= size | memnum | array | as | implant
<тип>      ::= <базовый тип> | <порожденный тип>

Базовые типы определяются ключевыми словами:
<базовый тип> ::= null | double | float | great | long |
                  word | int | half | shalf | byte |
                  char | addr | string | array | var | place |
                  collect | block

<порожденный тип> ::= <имя структуры> | <имя блока прототипа> | <имя internal-блока>

Свойства типа определяют применение оператора к типу:

size    - размер типа;
memnum  – количество членов структуры (для простых типов не употребляется).
array   - массив элементов типа <тип>
implant – используется только для порождаемых типов (структур, коллекций).Включает весь состав членов <тип> в определяемый.
as      - используется только в определении блока оператора internal совместно с
               array – блок-массив
               data  - блок данных
               text  - блок текста
               image – блок-образ файла

Так, в результате выполнения выражения

   var := <size int> + 10

переменная var получит значение 14, где 4 – размер int.Описатель типизированной переменной (далее – дескриптор переменной):

   ‘<’ <тип> ‘>’ ‘[’ [числовой литерал], {, <числовой литерал> . . . } ‘]’
   <имя переменной>

Примеры представления типизированных переменных:

<int> [10] arrOfInt     - переменная, предназначенная для хранения указания 
                          на массив int, состоящий из 10-ти элементов;
  <block> blVar           - переменная, предназначенная для хранения указания
                          блока;
  <double> [] arrOfDouble – переменная, предназначенная для хранения указания на
                          массив double (количество элементов не определено);
<string> [10, 20, 30 ] arrOfStrings – переменная, предназначенная для хранения
                          указания на многомерный массив строк.

        
По переменным - указаниям на массивы с определенными границами могут быть построены реальные массивы (см. оператор build).

<<< BACK NEXT >>>