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