Текущая версия |
Ваш текст |
Строка 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]]
| |