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

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
'''DOES>''' (исполнить, исполняет) фортовское слово [[Каллисто]].
'''DOES>''' — стандартное слово [[Каллисто]].
DOES>          ( −− a )                            Начало обработчика в порождающем слове.
[[Файл:CallistoBuildsDoes.png|thumb|right|264px|Пример работы слова DOES>]]
Начало обработчика (исполняющей части) в порождающем слове (''англ.'' defining word).
 
Обычно слово DOES> используется внутри [[Слово :|определения через двоеточие]] после слова [[⟨BUILDS|<BUILDS]], с которого начинается определяющая часть порождающего слова. Слово DOES> завершает определяющую часть и начинает определение обработчика — той части слова, которая общая у всех слов, созданных порождающим словом.
 
== Ввод слова DOES> ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 1|{{Серая клавиша|1}}]]   [[Клавиша P|{{Синяя клавиша|P}}]] [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
 
Эти нажатия оставляют клавиатуру в [[Режим NUM|режиме NUM]].
 
== DOES> в стандарте ANS Forth ==
<PRE>
6.1.1250  DOES>                              "does"                      CORE
        Интерпретация: Семантика интерпретации для этого слова не определена.
 
        Компиляция: ( C: colon-sys1 -- colon-sys2 )
            Добавляет семантику времени-выполнения ниже к текущему определению.
            В любом случае текущее определение представленное находимым в
            словаре при компиляции DOES> - определенное реализацией. Потребляет
            colon-sys1 и производит colon-sys2. Добавляет семантику
            инициирования, данную ниже к текущему определению.
 
        Время-выполнения: ( -- ) ( R: nest-sys1 -- )
            Заменяет семантику выполнения самого последнего определения,
            упоминаемого как name, семантикой выполнения имени данной ниже.
            Возвращает управление на вызывающее определение, определенное nest-
            sys1. Неопределенная ситуация существует если name не было
            определено CREATE, или определенным пользователем словом которое
            вызывает CREATE.
 
        Инициирование: ( i*x -- i*x a-addr )  ( R:  -- nest-sys2 )
            Сохраняет зависящую-от-реализации информацию nest-sys2 о вызывающем
            определении. Размещает адрес поля данных name на стеке. Состояние
            стека i*x представляет параметры name.
 
        name Выполнение: ( i*x -- j*x )
            Выполняет часть определения, которая начинается с семантики
            инициирования добавленной изменившим name DOES>. Состояния стека
            i*x и j*x представляют параметры, и результаты name,
            соответственно.
 
        См.: 6.1.1000 CREATE.
 
A.6.1.1250  DOES>
Типичное использование:
        : X ... DOES> ... ;
 
Относительно DOES>, Стандартная Программа не может делать какие-либо
предположения относительно способности  находить имя определения содержащего
DOES> или любое предыдущее определение чье имя может быть скрыто этим. DOES>
эффективно заканчивает одно определение и начинает другое насколько
заинтересованы переменные local и структуры потока управления. Поведение
компиляции проясняет, что пользователь не имеет право помещать DOES> внутри
любых структур потока управления.
</PRE>
 
== Совместимость ==
Слово DOES&gt; в [[Каллисто]] работает только в паре со словом [[⟨BUILDS|&lt;BUILDS]]. При переносе DOES&gt; с Форта найдите слово [[CREATE]], ему соответствующее, и замените его на [[⟨BUILDS|&lt;BUILDS]]. В большинстве случаев этого достаточно.
 
== История ==
Впервые слово DOES&gt; появилось под именем ;: в 1971-73 годах, когда Чак Мур перенёс Форт на DEC PDP-11 в [https://en.wikipedia.org/wiki/National_Radio_Astronomy_Observatory National Radio Astronomy Observatory] (''англ.'', [https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D1%80%D0%BB%D0%BE%D1%82%D1%81%D0%B2%D0%B8%D0%BB%D0%BB_%28%D0%92%D0%B8%D1%80%D0%B3%D0%B8%D0%BD%D0%B8%D1%8F%29 Шарлотсвилл]) и с тех пор оно применяется в подавляющем числе различных реализаций Форта.
 
Как ;CODE , оно определяло класс слов, указывая как интерпретировать описание, когда на слово ссылались. Чак Мур писал, что его было сложно изобрести, но оно оказалось особенно полезным для определения кодов операций.
 
В 1976 году на microFORTH появилась первая версия целевого компилятора. Примерно в это время была реализована улучшенная версия CREATE … DOES&gt; , которая экономила 2 байта на каждом порождённом слове. Эта разработка заняла 3 года.
 
=== DOES&gt; в предыдущем стандарте Forth-83 (англ.) ===
<PRE>
      DOES>        -- addr                      C,I,83          "does"
                  --  (compiling)
          Defines the execution-time action of a word created by a
          high-level defining word.  Used in the form:
                  : <namex> ... <create> ... DOES> ... ;
          and then
                  <namex> <name>
          where <create> is CREATE or any user defined word which
          executes CREATE .
 
          Marks the termination of the defining part of the defining
          word <namex> and then begins the definition of the
          execution-time action for words that will later be defined
          by <namex>.  When <name> is later executed, the address of
          <name>'s parameter field is placed on the stack and then the
          sequence of words between DOES> and ; are executed.
</PRE>
 
=== DOES&gt; в стандарте Forth-79 (англ.) ===
DOES>                                        I,C,168        "does"
    Define  the run-time action of a word created by a  high-level
    defining word.  Used in the form:
          :  <name> ... CREATE ... DOES> ... ;
          and then  <namex>  <name>
    Marks  the  termination of the defining part of  the  defining
    word <name> and begins the defining of the run-time action for
    words  that will later be defined by <name>.  On execution of
    <namex>  the  sequence  of  words  between  DOES>  and  ;  are
    executed, with the address of <namex>'s parameter field on the
    stack.
 
=== DOES> в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
DOES>                                          L0
        A word which defines the run-time action within a high-level
        defining word. DOES> alters the code field and first parameter of
        the new word to execute the sequence of compiled word addresses
        following DOES>. Used in combination with <BUILDS. When the DOES>
        part executes it begins with the address of the first parameter of
        the new word on the stack. This allows interpretation using this
        area or its contents. Typical uses include the Forth assembler,
        multidimensional arrays, and compiler generation.
 
== Реализация ==
Основная часть слова DOES&gt; является высокоуровневой. Для ускорения исполнения порождаемых слов исполняющая часть слова DOES&gt; написана на [[ЯМК|языке МК]].
 
Также в [[поле данных]] слова DOES&gt; присутствует вторая исполняющая часть — для порождающего слова [[VOCABULARY]], высокоуровневая исполняющая часть которого находится в [[Память программ|памяти программ]].
<pre>
2596 ;#DOES
2597 ; DOES>            ( −− a )                            Начало обработчика в порождающем слове.
2598 ; Все слова, определённые через DOES> находятся в памяти данных
2599 ; DOES> переводится с Форта на русский как "исполняется".
2600 ; Слово присутствует во всех фортах, но начиная с Форта−83 его реализация сильно отличается из−за отсутствия в этих языках слова <BUILDS
2601 LDOES:          .DB    5
2602                .TEXT  "DOES>"                ; ( −− pfa)
2603                .DW    LDEFER
2604 DOESD:          .DW CALL, FROMR, LITP
2605                .DB 39,16                      ; 10000
2606                .DW SUB, LATES,N2PFA,STORE, PSCOD
2607                ;∗∗ CALL по адресу из @PFA с засылкой в стек PFA+2
2608 SDOED:                                          ; Обработчик в памяти данных, обычный случай
2609                KGSBC                          ; RPUSH RI; RX := W
2610                2 + M7 M5                      ; W указывало на SDOED, а теперь указывает на xt (CFA) обработчика
2611                10002 + KM3                    ; PUSH W+2      ; PFA+2 с трансляцией адресов
2612                KRM7 RME ∗ KRM5 +              ; CFA всегда считывается из памяти данных
2613                1 −                            ; RX := PFA−1, передаём в указатель шитого кода R6=RI
2614                PGOTO SETRIDAT                  ; Перейти на NEXT для области данных
2615
2616 DOESP:          .DW    CALL                    ; Сейчас используется только для слова VOCABULARY
2617                .DW FROMR,LATES,N2PFA,STORE,PSCOD
2618 SDOEP:                                          ; Обработчик в памяти программ, единичный случай
2619                KGSBC                          ; RPUSH RI; RX := W
2620                2 + M7 M5                      ; W указывало на SDOE, а теперь на xt (CFA) обработчика
2621                10002 + KM3                    ; PUSH W+2      ; PFA+2 с трансляцией адресов
2622                KRM7 RME ∗ KRM5 +              ; .NUM DOVOC
2623                PGOTO SETRIPRG                  ; Перейти на NEXT для области программ
</pre>
Реализация из SP-Forth 4.20:
<pre>
0  VALUE  DOES-CODE
' R>  VALUE  DOES-CODE
: (DOES1) \ та часть, которая работает одновременно с CREATE (обычно)
  R> DOES>A @ CFL + -
  DOES>A @ 1+ !
;
 
CODE (DOES2)
  LEA  EBP, -4 [EBP]
  MOV  [EBP], EAX
  MOV  EAX, 4 [ESP]
  MOV  EBX, [ESP]
  LEA  ESP, 8 [ESP]
  JMP  EBX
END-CODE
 
' (DOES2) ' DOES-CODE TC-VECT!
 
: DOES>  \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: clon-sys1 -- colon-sys2 )
\ Добавить семантику времени выполнения, данную ниже, к текущему
\ определению. Будет или нет текущее определение сделано видимо
\ для поиска в словаре при компиляции DOES>, зависит от реализации.
\ Поглощает colon-sys1 и производит colon-sys2. Добавляет семантику
\ инициализации, данную ниже, к текущему определению.
\ Время выполнения: ( -- ) ( R: nest-sys1 -- )
\ Заменить семантику выполнения последнего определения name, на семантику
\ выполнения name, данную ниже. Возвратить управление в вызывающее опреде-
\ ление, заданное nest-sys1. Неопределенная ситуация возникает, если name
\ не было определено через CREATE или определенное пользователем слово,
\ вызывающее CREATE.
\ Инициализация: ( i*x -- i*x a-addr ) ( R: -- nest-sys2 )
\ Сохранить зависящую от реализации информацию nest-sys2 о вызывающем
\ определении. Положить адрес поля данных name на стек. Элементы стека
\ i*x представляют аргументы name.
\ name Выполнение: ( i*x -- j*x )
\ Выполнить часть определения, которая начинается с семантики инициализации,
\ добавленной DOES>, которое модифицировало name. Элементы стека i*x и j*x
\ представляют аргументы и результаты слова name, соответственно.
  ['] (DOES1) COMPILE,
  ['] (DOES2) COMPILE,
; IMMEDIATE
</pre>
 
=== Советская реализация ===
Описание и определение слова DOES&gt; в ядре ФОРТ-ЕС:
<PRE>
DOES>  HK -> НАЧАЛО "ИСПОЛНЕНИЯ" В ОПРЕДЕЛЯЮЩЕМ СЛОВЕ          34
DOES#  M  ПОДПРОГРАММА - НАЧАЛО РАСШИРЕНИЯ "DOES>"              3
 
                      Экран номер 3
(  09.09.86 ДОПОЛНИТЕЛЬНЫЕ ВХОДЫ  В АДРЕСНЫЙ ИНТЕРПРЕТАТОР)
 
M: DOES# RI  RPUSH,  RI 4 (,  15  LA,  RI RFORTH  SR,
A: CREATE#  RW1 14 LR,            (  ПОМЕСТИТЬ  РFA СТАТЬИ)
M: PUSHRW1  RSTACK  RTWO  SR,    ( ПОМЕСТИТЬ ЗНАЧЕНИЕ ИЗ RW1)
M: PUTRW1    RW1 PUT,  RNEXT BR, (  ЗАМЕНИТЬ  ВЕРХНЕЕ)
 
                    Экран номер 36
( 09.09.86  CREATE  DOES> )
 
: DOES>  ( ->)  COMPILE (;CODE) 2LIT
  [ DOES#  B, ] , , ; IMMEDIATE
</PRE>
Определение слова DOES&gt; в FORTH ИТЭФ:
<PRE>
            HEAD    205Q,'DOES',276Q,DOES,$COL          ; DOES>
            DW  FROMR,LATES,PFA,STORE,PSCOD
  $DOE    LABEL  FAR
            SUB  BP,  2
            ADD  BX, 2
            MOV  [BP],  SI
            MOV  SI, [BX]
            ADD  BX, 2
            PUSH BX
            NEXT
</PRE>
 
== Ссылки ==
* {{Исходник|DOES|DOES&gt;}}
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1250 DOES&gt;] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1250 комментарии к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/DOES DOES&gt;] и [http://forth-standard.org/standard/rationale#rat:core:DOES комментарий к нему] в черновике Forth 200x ''(англ.)''
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\11.RASSIRENIE%20KOMPILATORA:%20OPREDELAUSIE%20I%20KOMPILIRUUSIE%20SLOWA РАСШИРЕНИЕ КОМПИЛЯТОРА: ОПРЕДЕЛЯЮЩИЕ И КОМПИЛИРУЮЩИЕ СЛОВА] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* [http://www.forth.com/starting-forth/sf11/sf11.html Extending the Compiler] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
 


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

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

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