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

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

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

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


== Ввод слова 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 написана на [[ЯМК|языке МК]].
В 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
<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 создавал классическую [[Словарная статья|словарную статью]]:
    ссылка на предыдущую запись
    '  _CREATE-CODE  >VIRT VALUE CREATE-CODE
    счётчик и 3 символа
    код для выполнения
: 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 -- )
В 1970 году Чак Мур, создатель Форта, называл слова, кладущие на стек значение или адрес своего [[поле данных|поля данных]] «существительными» (''англ.'' noun).
  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
Если CREATE используется, как часть современной конструкции CREATE…[[DOES⟩|DOES&gt;]] — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить слово CREATE на [[⟨BUILDS|слово &lt;BUILDS]]
  ( сдвигаем указатель кода так, чтобы при компиляции переменных и векторов )
  ( следующая ячейка данных, находящаяся после 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>
Строка 237: Строка 124:
   HERE OVER - 2- OVER C! LATEST , CURRENT @ !
   HERE OVER - 2- OVER C! LATEST , CURRENT @ !
   LIT [ CREATE# ] , ;
   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>
</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://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] ''(англ.)''
* [http://www.forth.com/starting-forth/sf8/sf8.html Variables, Constants, and Arrays] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
Строка 262: Строка 138:
[[Категория:Слова высокого уровня]]
[[Категория:Слова высокого уровня]]
[[Категория:Порождающие слова Каллисто]]
[[Категория:Порождающие слова Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

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