Текущая версия |
Ваш текст |
Строка 6: |
Строка 6: |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] {{ШГ←}} [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] | | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] {{ШГ←}} [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] |
|
| |
|
| == CREATE в стандарте ANS Forth == | | == Детали реализации == |
| | Создающая часть слова CREATE является высокоуровневой. Для ускорения исполнения создаваемых слов исполняющая часть слова CREATE написана на [[ЯМК|языке МК]]. |
| | |
| | == История == |
| | Слово присутствует в Форте−79 и последующих, но имеет небольшие отличия из−за принятия на себя функций <BUILDS |
| | |
| | В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York Amsterdam NY], ''англ.''). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово CREATE под именем ENTER |
| | |
| | CREATE создавал классическую [[Словарная статья|словарную статью]]: |
| | ссылка на предыдущую запись |
| | счётчик и 3 символа |
| | код для выполнения |
| | параметры |
| | |
| | [[Поле кода]] было важной инновацией, так как косвенный переход был единственным накладным расходом, как только слово было найдено. Про ценность счётчика для различения слов Чак Мур узнал от писателей компиляторов из Стэнфорда. |
| | |
| | В 1970 году Чак Мур, создатель Форта, называл слова, кладущие на стек значение или адрес своего [[поле данных|поля данных]] «существительными» (''англ.'' noun). |
| | |
| | Если CREATE используется, как часть современной конструкции CREATE…[[DOES⟩|DOES>]] — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить слово CREATE на [[⟨BUILDS|слово <BUILDS]] |
| | |
| | Английское слово [http://www.lingvo-online.ru/ru/Translate/en-ru/create create] означает «создать». |
| | |
| | === CREATE в стандарте ANS Forth === |
| <pre> | | <pre> |
| 6.1.1000 CREATE CORE | | 6.1.1000 CREATE CORE |
Строка 31: |
Строка 53: |
| ... CREATE SOMETHING ... | | ... CREATE SOMETHING ... |
| </pre> | | </pre> |
|
| |
| == История ==
| |
| Слово присутствует в Форте−79 и последующих, но имеет небольшие отличия из−за принятия на себя функций <BUILDS
| |
|
| |
| В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York Amsterdam NY], ''англ.''). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово CREATE под именем ENTER
| |
|
| |
| CREATE создавал классическую [[Словарная статья|словарную статью]]:
| |
| ссылка на предыдущую запись
| |
| счётчик и 3 символа
| |
| код для выполнения
| |
| параметры
| |
|
| |
| [[Поле кода]] было важной инновацией, так как косвенный переход был единственным накладным расходом, как только слово было найдено. Про ценность счётчика для различения слов Чак Мур узнал от писателей компиляторов из Стэнфорда.
| |
|
| |
| В 1970 году Чак Мур, создатель Форта, называл слова, кладущие на стек значение или адрес своего [[поле данных|поля данных]] «существительными» (''англ.'' noun).
| |
|
| |
| Если CREATE используется, как часть современной конструкции CREATE…[[DOES⟩|DOES>]] — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить слово CREATE на [[⟨BUILDS|слово <BUILDS]]
| |
|
| |
| Английское слово [http://www.lingvo-online.ru/ru/Translate/en-ru/create create] означает «создать».
| |
|
| |
|
| === CREATE в предыдущем стандарте Forth-83 (англ.) === | | === CREATE в предыдущем стандарте Forth-83 (англ.) === |
Строка 80: |
Строка 83: |
|
| |
|
| == Реализация == | | == Реализация == |
| Создающая часть слова 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): | | Юрий Семёнов приводит следующее определение слова CREATE (стр. 139): |
| <PRE> | | <PRE> |