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

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

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

Текущая версия Ваш текст
Строка 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 отмечает начало цикла. При компиляции его главное назначение — запись в [[Стек данных|стек]] текущего значения указателя [[HERE]], которое используют слова [[UNTIL]], [[REPEAT]] или [[AGAIN]], чтобы сформировать правильный адрес ветвления на начало цикла.
== Ввод слова BEGIN ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша БП|{{Чёрная клавиша|БП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 4|{{Серая клавиша|4}}]]
== BEGIN в стандарте ANS Forth ==
<pre>
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 ;
</pre>
== История ==
=== 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 (англ.) ===
<pre>
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.
</pre>
== Реализация ==
Слово BEGIN начинает свою работу с того, что с помощью [[?COMP]] убеждается — [[INTERPRET|текстовый интерпретатор]] находится в [[Слово ]|состоянии компиляции]]. Если нет, слово [[?COMP]] вызывает [[Авост приложения|авост]] с сообщением об ошибке №17.
Само слово BEGIN ничего не компилирует в [[шитый код]]. Оно лишь [[⟨MARK|запоминает в стеке текущий адрес]], чтобы в дальнейшем скомпилировать на него [[?BRANCH|условный]] (цикл BEGIN…[[UNTIL]]) или [[BRANCH|безусловный]] (циклы BEGIN…[[AGAIN]] и [[Цикл BEGIN-WHILE-REPEAT|BEGIN…WHILE…REPEAT]]) переход.
<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 выглядит так (стр. 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>


== Ссылки ==
== Ссылки ==
* {{Исходник|BEGIN|BEGIN}}
* [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 комментарии к нему] ''(англ.)''
* См. слова [[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] ''(англ.)''


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

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

Отменить Справка по редактированию (в новом окне)
Источник — https://pmk.the-hacker.ru/BEGIN