USER

Материал из ПМК вики
Перейти к: навигация, поиск

USER — служебное слово Каллисто, лишённое заголовка. Обработчик переменных USER без определяющей части.

USER           ( −− a )                             Обработчик переменных типа USER (слово без заголовка).

Заголовок самого слова USER в Каллисто отсутствует, но многие встроенные переменные (BASE, STATE, BLK и др.) на самом деле являются переменными типа USER. Словарные статьи переменных USER хранятся в памяти программ и создавать новые переменные USER можно только путём изменения исходного текста Каллисто.

История[править]

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

Каллисто 1.0 не поддерживает многозадачный режим, но реализует обращение к стандартным переменным по смещению с целью экономии памяти программ.

USER в предыдущем стандарте Forth-83 (англ.)[править]

         USER         +n --                         M                    
              A defining word executed in the form: 
                      +n USER <name>                
                               ____                 
              which creates a user variable <name>.  +n is the offset
                                             ____                    
              within the user area where the value for <name> is stored.
                                                        ____            
              Execution of <name> leaves its absolute user area storage
                            ____                                       
              address.

USER в стандарте Forth-79 (англ.)[править]

USER          n  ---                            L0
       A defining word used in the form:
                       n USER cccc
       which creates a user variable cccc.
       The parameter field of cccc contains n as a fixed offset relative to
       the user pointer register UP for this user variable. When cccc is
       later executed, it places the sum of its offset and the user area
       base address on the stack as the storage address of that
       particular variable.

Реализация[править]

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

Во время работы Каллисто создавать новые переменные в памяти программ невозможно, поэтому в целях дальнейшей экономии места порождающее слово USER лишено заголовка и создающей части. Хотя в приложениях нельзя использовать имя USER, исполняющая часть слова USER может быть использована при внесении изменений в исходный текст Каллисто. Конечно, в Каллисто 1.0 подобная работа не для начинающего разработчика — введение новых переменных USER технически возможно, но требует ручного пересчёта многих адресов.

Для повышения быстродействия Каллисто исполняющая часть слова USER написана на языке МК.

2586 ;#USER
2587 ; USER             ( −− a )                             Обработчик переменных типа USER (слово без заголовка).
2588 ; Переменные USER могут быть только в памяти программ и их поле параметров занимает всего 1 байт.
2589 ; Поэтому определяющая часть слова некорректна и излишня
2590 ;LUSER:         .DB     4
2591 ;               .TEXT   "USER"
2592 ;               .DW     LDEFER
2593 ;USER:          .DW CALL, CON, PSCOD
2594 SUSE:           RM7 2 + KPRGM 11000 + KM3  KGOTO9       ; 000 быстрее, чем ВП 3

Реализации из SP-Forth 4.20:

0 VALUE USER-CODE
…
CODE _USER-CODE
     LEA  EBP, -4 [EBP]
     MOV  [EBP], EAX
     POP EAX
     MOV EAX, [EAX]
     LEA EAX, [EDI] [EAX]
     RET
END-CODE

' _USER-CODE TO USER-CODE
…
        ' _USER-CODE  >VIRT VALUE USER-CODE
…
: USER ( "<spaces>name" -- ) \ локальные переменные потока
  [T] HEADER [I]
  USER-CODE COMPILE,
  TC-USER-ALIGNED SWAP ,
  CELL+ TC-USER-ALLOT
;
: USER-CREATE ( "<spaces>name" -- )
  [T] HEADER [I]
  USER-CODE COMPILE,
  TC-USER-ALIGNED SWAP ,
  TC-USER-ALLOT
;
: USER ( "<spaces>name" -- ) \ локальные переменные потока
  USER-CREATE
  4 USER-ALLOT
;

Советская реализация[править]

Определение слова USER в FORTH ИТЭФ использовало регистр DI процессора 8086 для указания на базовый адрес переменных USER текущей задачи. 16-битное смещение хранилось в поле данных такой переменных:

            HEAD     204Q,'USE',322Q,USER, $COL           ; USER
            DW CON,PSCOD
   $USE   LABEL   FAR
            ADD  BX, 2
            MOV  AX, [BX]
            ADD  AX, DI
            PUSH AX
            NEXT

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Stub-icon-48px.png Это заготовка статьи. Вы можете помочь проекту, дополнив её.