BEGIN: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 40 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''BEGIN''' — стандартное слово [[Каллисто]].
'''BEGIN''' (начать, начало) — стандартное слово [[Каллисто]]. Начать цикл.
BEGIN          ( −− )                              Отметить начало циклов BEGIN.
Два цикла с условием — [[Цикл BEGIN-WHILE-REPEAT|BEGIN…WHILE…REPEAT]] и [[Цикл BEGIN-UNTIL|BEGIN…UNTIL]] — а также «бесконечный» цикл BEGIN…[[AGAIN]] начинаются со слова BEGIN:
BEGIN условие WHILE тело-цикла REPEAT
BEGIN тело-цикла условие UNTIL
BEGIN тело-цикла AGAIN


Начало циклов "[[BEGIN]]".
Слово BEGIN отмечает начало цикла. При компиляции его главное назначение — запись в [[Стек данных|стек]] текущего значения указателя [[HERE]], которое используют слова [[UNTIL]], [[REPEAT]] или [[AGAIN]], чтобы сформировать правильный адрес ветвления на начало цикла.


== Ввод слова BEGIN ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша БП|{{Чёрная клавиша|БП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 4|{{Серая клавиша|4}}]]


== BEGIN в стандарте ANS Forth ==
== BEGIN в стандарте ANS Forth ==
<pre>
  6.1.0760  BEGIN                                                          CORE
  6.1.0760  BEGIN                                                          CORE
         Интерпретация: Семантика интерпретации для этого слова не определена.
         Интерпретация: Семантика интерпретации для этого слова не определена.
Строка 24: Строка 32:
  или
  или
         : X ... BEGIN ... test WHILE ... REPEAT ;
         : X ... BEGIN ... test WHILE ... REPEAT ;
</pre>


 
== История ==
== BEGIN в предыдущем стандарте Forth-83 (англ.) ==
=== BEGIN в предыдущем стандарте Forth-83 (англ.) ===
       BEGIN        --                            C,I,79
       BEGIN        --                            C,I,79
                   -- sys  (compiling)
                   -- sys  (compiling)
Строка 41: Строка 50:
           Structures"
           Structures"


 
=== BEGIN в стандарте Forth-79 (англ.) ===
== BEGIN в стандарте Forth-79 (англ.) ==
  BEGIN                                        I,C,147
  BEGIN                                        I,C,147
     Used in a colon-definition in the form:
     Used in a colon-definition in the form:
Строка 54: Строка 62:
     being tested.
     being tested.


 
=== BEGIN в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
== BEGIN в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
<pre>
  BEGIN        ---  addr  n  (compiling)    P,L0
  BEGIN        ---  addr  n  (compiling)    P,L0
         Occurs in a colon-definition in form:
         Occurs in a colon-definition in form:
Строка 69: Строка 77:
         At compile time BEGIN leaves its return address and n for compiler
         At compile time BEGIN leaves its return address and n for compiler
         error checking.
         error checking.
</pre>


== Реализация ==
Слово BEGIN начинает свою работу с того, что с помощью [[?COMP]] убеждается — [[INTERPRET|текстовый интерпретатор]] находится в [[Слово ]|состоянии компиляции]]. Если нет, слово [[?COMP]] вызывает [[Авост приложения|авост]] с сообщением об ошибке №17.


== Реализация BEGIN ==
Само слово BEGIN ничего не компилирует в [[шитый код]]. Оно лишь [[⟨MARK|запоминает в стеке текущий адрес]], чтобы в дальнейшем скомпилировать на него [[?BRANCH|условный]] (цикл BEGIN…[[UNTIL]]) или [[BRANCH|безусловный]] (циклы BEGIN…[[AGAIN]] и [[Цикл BEGIN-WHILE-REPEAT|BEGIN…WHILE…REPEAT]]) переход.
Юрий Семёнов приводит следующее описание слова BEGIN (стр. 64):
<pre>
3677 ;#BEGIN
3678 ; BEGIN          I ( −− )                              Начало циклов "BEGIN".
3679 LBEGIN:        .DB    85H
3680                .TEXT  "BEGIN"
3681                .DW    LAGAIN
3682 BEGIN:          .DW CALL, QCOMP, LMARK, ONE, EXIT
</pre>
Реализации из SP-Forth 4.20:
<pre>
: BEGIN \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: -- dest )
\ Положить следующую позицию передачи управления, dest, на управляющий стек.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Время выполнения: ( -- )
\ Продолжить выполнение.
  ?COMP
  ALIGN-BYTES @ ALIGN-NOP
\  HERE TO :-SET
  <MARK 3
; IMMEDIATE
</pre>
<pre>
: BEGIN  POSTPONE BEGIN  DP @ TO :-SET  ; IMMEDIATE
</pre>
 
=== Советская реализация ===
Юрий Семёнов приводит следующее определение слова BEGIN (стр. 64):
   : BEGIN  ?COMP HERE 1 ; IMMEDIATE
   : BEGIN  ?COMP HERE 1 ; IMMEDIATE


У Баранова-Ноздрунова определение слова BEGIN выглядит так (стр. 58):
: BEGIN  ( ---> A,2 )  <MARK  2  ; IMMEDIATE
В 11-й главе [http://www.forth.com/starting-forth/sf11/sf11.html Starting FORTH] слово BEGIN определяется так:
  : BEGIN HERE ; IMMEDIATE
Описание слова BEGIN и определение циклов BEGIN в ядре ФОРТ-ЕС:
<pre>
BEGIN  HK->А,1 /КОМПИЛЯЦИЯ/ НАЧАЛО ЦИКЛА "BEGIN"              47
          -> /ИСПОЛНЕНИЕ/
                      Экран номер 47
( 31.03.86  СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
: BEGIN  ?COMP <MARK 1 ; IMMEDIATE
: UNTIL  1 ?PAIRS COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
: AGAIN  1 ?PAIRS COMPILE  BRANCH <RESOLVE ; IMMEDIATE
: WHILE  1 ?PAIRS 1 [COMPILE] IF ;          IMMEDIATE
: REPEAT  >R >R [COMPILE] AGAIN
          R> R> [COMPILE] THEN ;              IMMEDIATE
</pre>
Определение слова BEGIN в FORTH ИТЭФ:
<PRE>
            HEAD    305Q,'BEGI',316Q,BEGIN,$COL          ; BEGIN
            DW  QCOMP,HERE,ONE,SEMI
</PRE>


== Ссылки ==
== Ссылки ==
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0760 Слово BEGIN в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0760 комментарий к нему] ''(англ.)''
* {{Исходник|BEGIN|BEGIN}}
* [http://www.forth200x.org/documents/html/core.html#core:BEGIN Слово BEGIN в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:BEGIN комментарий к нему] ''(англ.)''
* См. слова [[WHILE]] и [[REPEAT]], [[UNTIL]] и [[AGAIN]]
* См. также цикл [[FOR]]…[[NEXT]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0760 BEGIN] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0760 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/BEGIN BEGIN] и [http://forth-standard.org/standard/rationale#rat:core:BEGIN комментарий к нему] в черновике Forth 200x ''(англ.)''
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\06.ZIKLITESKIE%20STRUKTURY ЦИКЛИЧЕСКИЕ СТРУКТУРЫ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* [https://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29 Цикл в Википедии]
* [https://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29 Цикл в Википедии]
* [http://www.forth.com/starting-forth/sf6/sf6.html Throw It For a Loop] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




Строка 85: Строка 154:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Слова высокого уровня]]
[[Категория:Слова с признаком IMMEDIATE]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Структуры управления Каллисто]]
[[Категория:Слова, способные вызывать авост приложения]]
[[Категория:Компилирующие слова]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]

Текущая версия от 19:23, 13 ноября 2017

BEGIN (начать, начало) — стандартное слово Каллисто. Начать цикл.

BEGIN          ( −− )                               Отметить начало циклов BEGIN.

Два цикла с условием — BEGIN…WHILE…REPEAT и BEGIN…UNTIL — а также «бесконечный» цикл BEGIN…AGAIN начинаются со слова BEGIN:

BEGIN условие WHILE тело-цикла REPEAT
BEGIN тело-цикла условие UNTIL
BEGIN тело-цикла AGAIN

Слово BEGIN отмечает начало цикла. При компиляции его главное назначение — запись в стек текущего значения указателя HERE, которое используют слова UNTIL, REPEAT или AGAIN, чтобы сформировать правильный адрес ветвления на начало цикла.

Ввод слова BEGIN[править]

В режиме ЛАТ последовательно нажмите клавиши  В/О   ИП   БП   7   4 

BEGIN в стандарте ANS Forth[править]

 6.1.0760   BEGIN                                                           CORE
        Интерпретация: Семантика интерпретации для этого слова не определена.

        Компиляция: ( C: -- dest )
            Помещает адрес следующей ячейки для передачи управления, dest, на 
            стек потока-управления. Добавляет семантику времени-выполнения, 
            данную ниже к текущему определению.

        Время-выполнения: ( -- )
            Продолжает выполнение.

        См.: 3.2.3.2 Стек потока-управления, 6.1.2140 REPEAT, 6.1.2390 UNTIL, 
            6.1.2430 WHILE.

 A.6.1.0760   BEGIN
 Типичное использование:
        : X ... BEGIN ... test UNTIL ;
 или
        : X ... BEGIN ... test WHILE ... REPEAT ;

История[править]

BEGIN в предыдущем стандарте Forth-83 (англ.)[править]

     BEGIN        --                            C,I,79
                  -- sys   (compiling)
          Used in the form:
                  BEGIN ... flag UNTIL
          or
                  BEGIN ... flag WHILE ... REPEAT
          BEGIN marks the start of a word sequence for repetitive
          execution.  A BEGIN-UNTIL loop will be repeated until flag
          is true.  A BEGIN-WHILE-REPEAT will be repeated until flag
          is false.  The words after UNTIL or REPEAT will be executed
          when either loop is finished.  sys is balanced with its
          corresponding UNTIL or WHILE .  See:  "9.9 Control
          Structures"

BEGIN в стандарте Forth-79 (англ.)[править]

BEGIN                                        I,C,147
    Used in a colon-definition in the form:
         BEGIN ... flag UNTIL   or
         BEGIN ... flag WHILE ... REPEAT
    BEGIN  marks  the  start of a  word  sequence  for  repetitive
    execution.   A BEGIN-UNTIL loop will be repeated until flag is
    true.   A  BEGIN-WHILE-REPEAT loop will be repeated until flag
    is  false.   The words after UNTIL or REPEAT will be  executed
    when  either loop is finished.   flag is always dropped  after
    being tested.

BEGIN в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

 BEGIN         ---  addr  n  (compiling)     P,L0
        Occurs in a colon-definition in form:
           BEGIN ... UNTIL
           BEGIN ... AGAIN
           BEGIN ... WHILE ... REPEAT
        At run-time, BEGIN marks the start of a sequence that may be
        repetitively executed. It serves as a return point from the
        corresponding UNTIL, AGAIN or REPEAT. When executing UNTIL, a return
        to BEGIN will occur if the top of the stack is false;
        for AGAIN and REPEAT a return to BEGIN always occurs.

        At compile time BEGIN leaves its return address and n for compiler
        error checking.

Реализация[править]

Слово BEGIN начинает свою работу с того, что с помощью ?COMP убеждается — текстовый интерпретатор находится в состоянии компиляции. Если нет, слово ?COMP вызывает авост с сообщением об ошибке №17.

Само слово BEGIN ничего не компилирует в шитый код. Оно лишь запоминает в стеке текущий адрес, чтобы в дальнейшем скомпилировать на него условный (цикл BEGIN…UNTIL) или безусловный (циклы BEGIN…AGAIN и BEGIN…WHILE…REPEAT) переход.

3677 ;#BEGIN
3678 ; BEGIN          I ( −− )                               Начало циклов "BEGIN".
3679 LBEGIN:         .DB     85H
3680                 .TEXT   "BEGIN"
3681                 .DW     LAGAIN
3682 BEGIN:          .DW CALL, QCOMP, LMARK, ONE, EXIT

Реализации из SP-Forth 4.20:

: BEGIN \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: -- dest )
\ Положить следующую позицию передачи управления, dest, на управляющий стек.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Время выполнения: ( -- )
\ Продолжить выполнение.
  ?COMP
  ALIGN-BYTES @ ALIGN-NOP
\  HERE TO :-SET
  <MARK 3
; IMMEDIATE
: BEGIN  POSTPONE BEGIN  DP @ TO :-SET  ; IMMEDIATE

Советская реализация[править]

Юрий Семёнов приводит следующее определение слова BEGIN (стр. 64):

 : BEGIN   ?COMP HERE 1 ; IMMEDIATE

У Баранова-Ноздрунова определение слова BEGIN выглядит так (стр. 58):

: BEGIN  ( ---> A,2 )   <MARK  2  ; IMMEDIATE

В 11-й главе Starting FORTH слово BEGIN определяется так:

  : BEGIN HERE ; IMMEDIATE

Описание слова BEGIN и определение циклов BEGIN в ядре ФОРТ-ЕС:

BEGIN   HK->А,1 /КОМПИЛЯЦИЯ/ НАЧАЛО ЦИКЛА "BEGIN"               47
          -> /ИСПОЛНЕНИЕ/

                      Экран номер 47
 ( 31.03.86   СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ )
 : BEGIN   ?COMP <MARK 1 ; IMMEDIATE
 : UNTIL   1 ?PAIRS COMPILE ?BRANCH <RESOLVE ; IMMEDIATE
 : AGAIN   1 ?PAIRS COMPILE  BRANCH <RESOLVE ; IMMEDIATE
 : WHILE   1 ?PAIRS 1 [COMPILE] IF ;           IMMEDIATE
 : REPEAT  >R >R [COMPILE] AGAIN
           R> R> [COMPILE] THEN ;              IMMEDIATE

Определение слова BEGIN в FORTH ИТЭФ:

             HEAD    305Q,'BEGI',316Q,BEGIN,$COL          ; BEGIN
             DW  QCOMP,HERE,ONE,SEMI

Ссылки[править]


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.