Редактирование:
CREATE
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == Создающая часть слова CREATE является высокоуровневой. Для ускорения исполнения создаваемых слов исполняющая часть слова CREATE написана на [[ЯМК|языке МК]]. <pre> 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 ; Созданные слова размещаются в области двоичных данных </pre> Реализации из SP-Forth 4.20: <pre> 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, ; </pre> <pre> 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 ; </pre> === Советская реализация === Юрий Семёнов приводит следующее определение слова CREATE (стр. 139): <PRE> : 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) </PRE> Описание и определение слова CREATE в ядре ФОРТ-ЕС: <PRE> 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# ] , ; </PRE> Определение слова CREATE в FORTH ИТЭФ: <PRE> 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 </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице