CREATE: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
Строка 117: | Строка 117: | ||
' _CREATE-CODE TO CREATE-CODE | ' _CREATE-CODE TO CREATE-CODE | ||
… | |||
' _CREATE-CODE >VIRT VALUE CREATE-CODE | |||
… | … | ||
: SHEADER ( addr u -- ) | : SHEADER ( addr u -- ) |
Текущая версия от 21:31, 13 ноября 2017
CREATE (создать) — стандартное слово Каллисто.
CREATE ( −− ) Создать начало статьи (до PFA) для следующего слова.
Фраза CREATE XXX формирует слово с именем XXX (заголовок и CFA), оставляя его поле параметров пустым. При исполнении такое слово кладёт на стек адрес своего поля данных.
Ввод слова CREATE[править]
В режиме ЛАТ последовательно нажмите клавиши С/П × ИП ШГ← 2 ИП
CREATE в стандарте ANS Forth[править]
6.1.1000 CREATE CORE ( "<spaces>name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. Если указатель области данных не выровнен, резервирует достаточно области данных для его выравнивания. Новый указатель области данных определяет поле данных name. CREATE не распределяет область данных в поле данных name. name Выполнение: ( -- a-addr ) a-addr - адрес поля данных name. Семантика выполнения name может быть расширена использованием DOES>. См.: 3.3.3 Область данных, 6.1.1250 DOES>. A.6.1.1000 CREATE Адрес области данных слова, определенного CREATE, дается указателем области данных немедленно после выполнения CREATE. Резервирование пространства поля данных типично делается с помощью ALLOT. Типичное использование: ... CREATE SOMETHING ...
История[править]
Слово присутствует в Форте−79 и последующих, но имеет небольшие отличия из−за принятия на себя функций <BUILDS
В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово CREATE под именем ENTER
CREATE создавал классическую словарную статью:
ссылка на предыдущую запись счётчик и 3 символа код для выполнения параметры
Поле кода было важной инновацией, так как косвенный переход был единственным накладным расходом, как только слово было найдено. Про ценность счётчика для различения слов Чак Мур узнал от писателей компиляторов из Стэнфорда.
В 1970 году Чак Мур, создатель Форта, называл слова, кладущие на стек значение или адрес своего поля данных «существительными» (англ. noun).
Если CREATE используется, как часть современной конструкции CREATE…DOES> — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить слово CREATE на слово <BUILDS
Английское слово create означает «создать».
CREATE в предыдущем стандарте Forth-83 (англ.)[править]
CREATE -- M,79 A defining word executed in the form: CREATE <name> Creates a dictionary entry for <name>. After <name> is created, the next available dictionary location is the first byte of <name>'s parameter field. When <name> is subsequently executed, the address of the first byte of <name>'s parameter field is left on the stack. CREATE does not allocate space in <name>'s parameter field.
CREATE в стандарте Forth-79 (англ.)[править]
CREATE 239 A defining word used in the form: CREATE <name> to create a dictionary entry for <name>, without allocating any parameter field memory. When <name> is subsequently executed, the address of the first byte of <name>'s parameter field is left on the stack.
CREATE в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
CREATE A defining word used in the form: CREATE cccc by such words as CODE and CONSTANT to create a dictionary header for a Forth definition. The code field contains the address of the words parameter field. The new word is created in the CURRENT vocabulary.
Реализация[править]
Создающая часть слова CREATE является высокоуровневой. Для ускорения исполнения создаваемых слов исполняющая часть слова CREATE написана на языке МК.
3310 ;#CREATE 3311 ; CREATE ( −− ) Создать начало статьи (до PFA) для следующего слова. 3312 ; Сформировать слово с именем XXX (заголовок и CFA), оставив его поле параметров пустым. 3313 ; При обращении к XXX на стек кладётся его адрес. 3314 ; Длина имени слова ограничивается 31 литерой 3315 ; Слово присутствует в Форте−79 и последующих, но имеет небольшие отличия из−за принятия на себя функций <BUILDS 3316 LCREAT: .DB 6 3317 .TEXT "CREATE" ; ( "<пр>имя" −− ) 3318 .DW LIDDOT 3319 CREAT: .DW CALL, BL,WORD, FIND, ZBRAN,CRE 3320 .DW DROP,IDDOT,LITB ; Наш FIND возвращает NFA 3321 .DB 4 3322 .DW MESS ; Сообщение, что такое слово уже есть 3323 CRE: .DW HERE, DUP,CAT, LITB 3324 .DB 31 3325 .DW MIN ; Обрезать длину по 31 литеру 3326 .DW DUP, CCOM ; биты SMUDGE и IMMEDIATE сброшены 3327 .DW ALLOT ; Оставить слово как поле имени 3328 .DW LATES, COMMA ; NFA прошлого слова в поле связи 3329 .DW CURR,UAT, STORE ; Сделать слово последним в словаре CURRENT @ 3330 .DW LITP,SCRE, BRAN,RCOMMA ; CFA: созданное слово кладёт на стек свой PFA 3331 SCRE: RM7 10002 + KM3 KGOTO9 ; Созданные слова размещаются в области двоичных данных
Реализации из SP-Forth 4.20:
0 VALUE CREATE-CODE … CODE _CREATE-CODE LEA EBP, -4 [EBP] MOV [EBP], EAX POP EAX RET END-CODE ' _CREATE-CODE TO CREATE-CODE … ' _CREATE-CODE >VIRT VALUE CREATE-CODE … : SHEADER ( addr u -- ) HERE 0 , ( cfa ) \ DUP LAST-CFA ! 0 C, ( flags ) -ROT WARNING @ IF 2DUP GET-CURRENT SEARCH-WORDLIST IF DROP 2DUP TYPE ." isn't unique" CR THEN THEN CURRENT @ +SWORD ALIGN HERE SWAP ! ( заполнили cfa ) ; : HEADER PARSE-NAME SHEADER ; … : CREATE ( "<spaces>name" -- ) \ 94 [T] HEADER [I] CREATE-CODE COMPILE, ;
USER LAST-CFA … VECT SHEADER : SHEADER1 ( addr u -- ) HERE 0 , ( cfa ) DUP LAST-CFA ! 0 C, ( flags ) -ROT WARNING @ IF 2DUP GET-CURRENT SEARCH-WORDLIST IF DROP 2DUP TYPE ." isn't unique (" SOURCE-NAME TYPE ." )" CR THEN THEN CURRENT @ +SWORD ALIGN ( сдвигаем указатель кода так, чтобы при компиляции переменных и векторов ) ( следующая ячейка данных, находящаяся после CALL *-CODE была выровнена: ) ALIGN-BYTES @ DUP 4 > IF 5 - ALLOT ELSE 1 - ALLOT THEN HERE SWAP ! ( заполнили cfa ) ; ' SHEADER1 ' SHEADER TC-VECT! … : CREATED ( addr u -- ) \ Создать определение для c-addr u с семантикой выполнения, описанной ниже. \ Если указатель пространства данных не выровнен, зарезервировать место \ для выравнивания. Новый указатель пространства данных определяет \ поле данных name. CREATE не резервирует место в поле данных name. \ name Выполнение: ( -- a-addr ) \ a-addr - адрес поля данных name. Семантика выполнения name может \ быть расширена с помощью DOES>. SHEADER HERE DUP LAST-CFA @ ! DOES>A ! ( для DOES ) ['] _CREATE-CODE COMPILE, ; : CREATE ( "<spaces>name" -- ) \ 94 PARSE-NAME CREATED ;
Советская реализация[править]
Юрий Семёнов приводит следующее определение слова CREATE (стр. 139):
: CREATE FINDN ( поиск слова в словаре) IF ( если оно найдено) DROP ( запись адреса поля имени в стек) ID. ( печать имени) 4 MESSAGE ( печать "MSG# 4") THEN HERE ↑ C@ ( запись в стек числа символов в слове) WIDTH @ ( максимально допустимое число символов в имени ) MIN ( укорочение имени, если оно слишком длинное) 1+ ALLOT ( выделение нужного числа байт) ?ALIGN ( выравнивание выделенного числа байт на чётную границу, что важно для ЭВМ типа СМ) ↑ $A0 TOGGLE ( коррекция байта имени) HERE 1- $80 TOGGLE ( коррекция последнего байта имени) LAST , ( формирование поля LFA) CURRENT @ ! ( коррекция значения CURRENT) HERE 2+ , ; ( заполнение поля CFA)
Описание и определение слова CREATE в ядре ФОРТ-ЕС:
CREATE -> СОЗДАТЬ НАЧАЛО СТАТЬИ (ДО PFA) ДЛЯ 36 СЛЕДУЮЩЕГО СЛОВА) ЕГО ИСПОЛНЕНИЕ КЛАДЕТ PFA НА СТЕК CREATE# A НАЧАЛО ИСПОЛНИТЕЛЬНОЙ ЧАСТИ "VARIABLE" 3 Экран номер 3 ( 09.09.86 ДОПОЛНИТЕЛЬНЫЕ ВХОДЫ В АДРЕСНЫЙ ИНТЕРПРЕТАТОР) A: CREATE# RW1 14 LR, ( ПОМЕСТИТЬ РFA СТАТЬИ) M: PUSHRW1 RSTACK RTWO SR, ( ПОМЕСТИТЬ ЗНАЧЕНИЕ ИЗ RW1) M: PUTRW1 RW1 PUT, RNEXT BR, ( ЗАМЕНИТЬ ВЕРХНЕЕ) Экран номер 36 ( 09.09.86 CREATE DOES> ) : CREATE ( ->) 100 ?GAP ALIGNH -FIND SWAP DROP IF HERE ID. ." УЖЕ ЕСТЬ " THEN HERE DUP С@ WIDTH AND 2+ ALLOT ALIGNH HERE OVER - 2- OVER C! LATEST , CURRENT @ ! LIT [ CREATE# ] , ;
Определение слова CREATE в FORTH ИТЭФ:
HEAD 206Q,'CREAT',305Q,GREAT,$COL ; CREATE DW DFIND,ZBRAN,CRE-$,DROP,TWOP,NFA,IDDOT DW LIT,4,MESS CRE: DW HERE,DUBL,CAT,$WIDTH,AT,MIN,ONEP,ALLOT DW DUBL,LIT,240Q,TOGL,HERE,ONEM DW LIT,200Q,TOGL,LATES,COMMA,CURR,AT,STORE DW HERE,TWOP,COMMA,SEMI
Ссылки[править]
- Исходный текст слова CREATE в Каллисто Классик 1.0
- Слово CREATE и комментарий к нему в стандарте ANS Forth (англ.)
- Слово CREATE и комментарий к нему в черновике Forth 200x (англ.)
- ПЕРЕМЕННЫЕ, КОНСТАНТЫ И МАССИВЫ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Variables, Constants, and Arrays в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |