Редактирование: CREATE

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 1: Строка 1:
'''CREATE''' (создать) — стандартное слово [[Каллисто]].
'''CREATE''' (создать) — стандартное слово [[Каллисто]].
CREATE        ( −− )                              Создать начало статьи (до PFA) для следующего слова.
 
Фраза CREATE XXX формирует слово с именем XXX (заголовок и [[CFA]]), оставляя его [[поле параметров]] пустым. При исполнении такое слово кладёт на [[Стек данных|стек]] [[PFA|адрес своего поля данных]].
Формирует слово с именем XXX (заголовок и [[CFA]]), оставляя его поле параметров пустым.


== Ввод слова CREATE ==
== Ввод слова CREATE ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] {{ШГ←}} [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша ШГ влево|{{Чёрная клавиша|ШГ←}}]] [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
 
== Детали реализации ==
Создающая часть слова CREATE является высокоуровневой. Для ускорения исполнения создаваемых слов исполняющая часть слова CREATE написана на [[ЯМК|языке МК]].


== CREATE в стандарте ANS Forth ==
== CREATE в стандарте ANS Forth ==
<pre>
  6.1.1000  CREATE                                                          CORE
  6.1.1000  CREATE                                                          CORE
             ( "<spaces>name" -- )
             ( "<spaces>name" -- )
Строка 30: Строка 32:
  Типичное использование:
  Типичное использование:
         ... CREATE SOMETHING ...
         ... CREATE SOMETHING ...
</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&gt;]] — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить слово CREATE на [[⟨BUILDS|слово &lt;BUILDS]]


Английское слово [http://www.lingvo-online.ru/ru/Translate/en-ru/create create] означает «создать».
== CREATE в предыдущем стандарте Forth-83 (англ.) ==
 
=== CREATE в предыдущем стандарте Forth-83 (англ.) ===
       CREATE      --                            M,79
       CREATE      --                            M,79
           A defining word executed in the form:
           A defining word executed in the form:
Строка 62: Строка 44:
           not allocate space in <name>'s parameter field.
           not allocate space in <name>'s parameter field.


=== CREATE в стандарте Forth-79 (англ.) ===
== CREATE в стандарте Forth-79 (англ.) ==
  CREATE                                      239
  CREATE                                      239
     A defining word used in the form:
     A defining word used in the form:
Строка 71: Строка 53:
     field is left on the stack.
     field is left on the stack.


=== CREATE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
== CREATE в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
  CREATE
  CREATE
         A defining word used in the form:
         A defining word used in the form:
Строка 79: Строка 61:
         parameter field. The new word is created in the CURRENT vocabulary.
         parameter field. The new word is created in the CURRENT vocabulary.


== Реализация ==
== Реализация CREATE ==
Создающая часть слова CREATE является высокоуровневой. Для ускорения исполнения создаваемых слов исполняющая часть слова CREATE написана на [[ЯМК|языке МК]].
Юрий Семёнов приводит следующее описание слова CREATE (стр. 139):
<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                      ( поиск слова в словаре)
   : CREATE  FINDN                      ( поиск слова в словаре)
             IF                              ( если оно найдено)
             IF                              ( если оно найдено)
Строка 205: Строка 76:
             1+ ALLOT            ( выделение нужного числа байт)
             1+ ALLOT            ( выделение нужного числа байт)
             ?ALIGN    ( выравнивание выделенного числа байт на
             ?ALIGN    ( выравнивание выделенного числа байт на
                           чётную границу, что важно для ЭВМ типа
                           чётную границу, что важно для ЭКВМ типа
                           СМ)
                           СМ)
             ↑ $A0 TOGGLE               ( коррекция байта имени)
             ↑ '240 TOGGLE             ( коррекция байта имени)
             HERE 1- $80 TOGGLE     ( коррекция последнего байта
             HERE 1- '200 TOGGLE   ( коррекция последнего байта
                                       имени)
                                       имени)
             LAST ,                    ( формирование поля LFA)
             LAST ,                    ( формирование поля LFA)
             CURRENT @ !          ( коррекция значения CURRENT)
             CURRENT @ !          ( коррекция значения CURRENT)
             HERE 2+ , ;                  ( заполнение поля CFA)
             HERE 2+ , ;                  ( заполнение поля CFA)
</PRE>
Описание и определение слова CREATE в ядре ФОРТ-ЕС:
<PRE>
CREATE    -> СОЗДАТЬ НАЧАЛО СТАТЬИ (ДО PFA) ДЛЯ                36
          СЛЕДУЮЩЕГО СЛОВА)
          ЕГО ИСПОЛНЕНИЕ КЛАДЕТ PFA НА СТЕК
CREATE#  A  НАЧАЛО ИСПОЛНИТЕЛЬНОЙ ЧАСТИ "VARIABLE"            3


                      Экран номер 3
== История ==
(  09.09.86 ДОПОЛНИТЕЛЬНЫЕ ВХОДЫ  В АДРЕСНЫЙ ИНТЕРПРЕТАТОР)
Если CREATE используется, как часть конструкции CREATE…[[DOES〉|DOES&gt;]] — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить [[CREATE]] на [[〈BUILDS|&lt;BUILDS]]
 
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>


== Ссылки ==
== Ссылки ==
* {{Исходник|CREATE|CREATE}}
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1000 CREATE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1000 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1000 CREATE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1000 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/CREATE CREATE] и [http://forth-standard.org/standard/rationale#rat:core:CREATE комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/core/CREATE.html CREATE] и [http://www.forth200x.org/documents/html3/rationale.html#rat:core:CREATE комментарий к нему] в черновике Forth 200x ''(англ.)''
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\08.PEREMENNYE,%20KONSTANTY%20I%20MASSIWY ПЕРЕМЕННЫЕ, КОНСТАНТЫ И МАССИВЫ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* [http://www.forth.com/starting-forth/sf8/sf8.html Variables, Constants, and Arrays] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




Строка 262: Строка 98:
[[Категория:Слова высокого уровня]]
[[Категория:Слова высокого уровня]]
[[Категория:Порождающие слова Каллисто]]
[[Категория:Порождающие слова Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)