STATE: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
(не показано 25 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''STATE''' (состояние) — | '''STATE''' (состояние) — стандартная переменная [[Каллисто]]. Переменная, хранящая состояние [[INTERPRET|текстового интерпретатора]]. «Истина» (ненулевое значение) означает состояние компиляции, [[FALSE|«ложь» (ноль)]] — [[Слово [|исполнения]]. | ||
STATE ( | STATE ( −− a ) Переменная, состояние текстового интерпретатора. | ||
Слово STATE кладёт на стек a — адрес [[Ячейка (Каллисто)|ячейки]], содержащей текущее состояние [[INTERPRET|текстового интерпретатора]]. Значение [[FALSE|ноль («ложь»)]] означает состояние исполнения — [[INTERPRET|текстовый интерпретатор]] [[EXECUTE|исполняет]] слова сразу же после их нахождения в [[Словарь|словаре]]. | |||
В [[Каллисто]] значение 128 (не ноль) означает [[Слово ]|состояние компиляции]]. В [[Слово ]|состоянии компиляции]] [[INTERPRET|текстовый интерпретатор]] [[Слово ,|компилирует]] (записывает в [[словарь]]) [[CFA|токены]] найденных слов. [[Адресный интерпретатор]] исполнит эти слова позже, когда потребуется. | |||
Обращаться к STATE самостоятельно не рекомендуется. Для переключения в [[Слово [|состояние исполнения]] существует слово [[Слово [|[]], а в состояние компиляции [[INTERPRET|текстовый интерпретатор]] переключает слово [[Слово ]|]]]. Это два удобных, стандартных слова. Они устоялись, широко известны и переносимы на всевозможные варианты Форта. | |||
Обращаться к STATE самостоятельно не рекомендуется. Для переключения в | |||
== Ввод слова STATE == | == Ввод слова STATE == | ||
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша 1|{{Серая клавиша|1}}]] [[Клавиша 2|{{Серая клавиша|2}}]] | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша 1|{{Серая клавиша|1}}]] [[Клавиша 2|{{Серая клавиша|2}}]] {{ШГ←}} [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] | ||
== STATE в стандарте ANS Forth == | == STATE в стандарте ANS Forth == | ||
<PRE> | |||
6.1.2250 STATE CORE | 6.1.2250 STATE CORE | ||
( -- a-addr ) | ( -- a-addr ) | ||
Строка 69: | Строка 69: | ||
ABORT, 6.1.2050 QUIT, 6.1.2250 STATE, 6.1.2500 [, 6.1.2540 ], | ABORT, 6.1.2050 QUIT, 6.1.2250 STATE, 6.1.2500 [, 6.1.2540 ], | ||
6.2.0455 :NONAME, 15.6.2.0470 ;CODE. | 6.2.0455 :NONAME, 15.6.2.0470 ;CODE. | ||
</PRE> | |||
== История == | |||
В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York Amsterdam NY], ''англ.''). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово STATE | |||
== STATE в предыдущем стандарте Forth-83 (англ.) == | Слово STATE отличало компиляцию от исполнения. Во время компиляции счётчик и первые три символа слова компилировались для последующего исполнения. | ||
Устоявшееся слово STATE присутствует в ядре всех стандартов (''англ.'' CORE) со времён fig-Форта до Форта-2012. Хотя для хранения состояния [[INTERPRET|текстового интерпретатора]] достаточно одного байта, [[Каллисто]] идёт навстречу стандарту и отводит на эту переменную целую [[Ячейка (Каллисто)|ячейку]]. | |||
Все реализации Форта сходятся на том, что нулевое значение STATE означает исполнение — [[EXECUTE|выполнения]] слов, найденных в [[Словарь|словаре]]. Какое именно ненулевое значение STATE означает компиляцию, стандарт не задаёт и оно разнится от одной реализации Форта к другой. | |||
Слова, проверяющие значения STATE, называются ''словами, зависимыми от состояния''. Их использование часто приводит к непредсказуемым и труднообнаружимым ошибкам, что послужило темой серьёзной дискуссии в сообществе и сильно повлияло на стандарт Форта. Хорошая практика программирования включает советы, как избегать написания слов, зависящих от состояния. | |||
=== STATE в предыдущем стандарте Forth-83 (англ.) === | |||
STATE -- addr U,79 | STATE -- addr U,79 | ||
The address of a variable containing the compilation state. | The address of a variable containing the compilation state. | ||
Строка 77: | Строка 89: | ||
may not modify this variable. | may not modify this variable. | ||
== STATE в стандарте Forth-79 (англ.) == | === STATE в стандарте Forth-79 (англ.) === | ||
STATE -- addr U,164 | STATE -- addr U,164 | ||
Leave the address of the variable containing the compilation | Leave the address of the variable containing the compilation | ||
Строка 83: | Строка 95: | ||
but the value itself may be installation dependent. | but the value itself may be installation dependent. | ||
== STATE в fig-FORTH Release 1 glossary, май 1979 (англ.) == | === STATE в fig-FORTH Release 1 glossary, май 1979 (англ.) === | ||
STATE --- addr L0,U | STATE --- addr L0,U | ||
A user variable containing the compilation state. A non-zero value | A user variable containing the compilation state. A non-zero value | ||
Строка 89: | Строка 101: | ||
dependent. | dependent. | ||
== | == Реализация == | ||
<pre> | |||
96 rrSTATE .EQU 1108 ; 11108 STATE − STATE=0 − исполнение, STATE=128 − компиляция | |||
97 pSTATE .EQU 108 | |||
98 rlSTATE .EQU 1109 ; | |||
… | |||
2857 ;#STATE | |||
2858 ; STATE ( −− a ) Переменная, состояние текстового интерпретатора. | |||
2859 LSTATE: .DB 5 | |||
2860 .TEXT "STATE" | |||
2861 .DW LCURRENT | |||
2862 STATE: .DW SUSE | |||
2863 .DB pSTATE ; 0 => Исполнение | |||
</pre> | |||
=== Реализация в SP-Forth 4.20 === | |||
<pre> | |||
USER STATE ( -- a-addr ) \ 94 | |||
\ a-addr - адрес ячейки, содержащей флажок "состояние компиляции". | |||
\ STATE "истина" в режиме компиляции, иначе "ложь". | |||
\ Изменяют STATE только следующие стандартные слова: | |||
\ : ; [ ] ABORT QUIT :NONAME | |||
</pre> | |||
=== Советская реализация === | |||
Описание и определение переменной STATE в ядре ФОРТ-ЕС: | |||
<PRE> | |||
STATE П ->А ПЕРЕМЕННАЯ С СОСТОЯНИЕМ ТЕКСТОВОГО 8 | |||
ИНТЕРПРЕТАТОРА: "ИСТИНА" - КОМПИЛЯЦИЯ | |||
Экран номер 8 | |||
( 09.09.86 СИСТЕМНЫЕ ПЕРЕМЕННЫЕ - ОКОНЧАНИЕ) | |||
VARIABLE STATE ( СОСТОЯНИЕ ТЕКСТОВОГО ИНТЕРПРЕТАТОРА) | |||
</PRE> | |||
Определение переменной STATE в FORTH ИТЭФ: | |||
<PRE> | |||
HEAD 205Q,'STAT',3050,STATE,$USE ; STATE | |||
DW 54Q ;0=> Исполнение | |||
</PRE> | |||
== Ссылки == | == Ссылки == | ||
* См. слова [[Слово [|[]] [[Слово ]|]]] | * {{Исходник|STATE|STATE}} | ||
* См. слова [[INTERPRET]], [[IMMEDIATE]], [[Слово [|[]] и [[Слово ]|]]] | |||
* См. также слова [[?EXEC]] и [[?COMP]] | |||
* [http://www.complang.tuwien.ac.at/anton/euroforth/ef98/ertl98.pdf state — Why it is Evil and How to Exorcise it, by M. Anton Ertl, pdf] ''(англ.)'' — материал euroFORTH '98 | * [http://www.complang.tuwien.ac.at/anton/euroforth/ef98/ertl98.pdf state — Why it is Evil and How to Exorcise it, by M. Anton Ertl, pdf] ''(англ.)'' — материал euroFORTH '98 | ||
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2250 STATE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2250 комментарии к нему] в стандарте ANS Forth ''(англ.)'' | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2250 STATE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.2250 комментарии к нему] в стандарте ANS Forth ''(англ.)'' | ||
* Слово [http://forth.sourceforge.net/standard/dpans/dpans15.htm#15.6.2.2250 STATE] в стандарте ANS Forth, из расширения TOOLS EXT ''(англ.)'' | * Слово [http://forth.sourceforge.net/standard/dpans/dpans15.htm#15.6.2.2250 STATE] в стандарте ANS Forth, из расширения TOOLS EXT ''(англ.)'' | ||
* Слово [http:// | * Слово [http://forth-standard.org/standard/core/STATE STATE] и [http://forth-standard.org/standard/rationale#rat:core:STATE комментарий к нему] в черновике Forth 200x ''(англ.)'' | ||
* Слово [http:// | * Слово [http://forth-standard.org/standard/tools/STATE STATE] в черновике Forth 200x, из расширения TOOLS EXT ''(англ.)'' | ||
* [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://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 Л.Броуди «Начальный курс программирования на языке Форт»] | ||
Строка 114: | Строка 157: | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Переменные USER]] | [[Категория:Переменные USER]] | ||
[[Категория: | [[Категория:Встроенные переменные Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 CORE]] | |||
[[Категория:1994 TOOLS EXT]] | |||
[[Категория:2012 CORE]] | |||
[[Категория:2012 TOOLS EXT]] |
Текущая версия от 10:32, 17 июня 2020
STATE (состояние) — стандартная переменная Каллисто. Переменная, хранящая состояние текстового интерпретатора. «Истина» (ненулевое значение) означает состояние компиляции, «ложь» (ноль) — исполнения.
STATE ( −− a ) Переменная, состояние текстового интерпретатора.
Слово STATE кладёт на стек a — адрес ячейки, содержащей текущее состояние текстового интерпретатора. Значение ноль («ложь») означает состояние исполнения — текстовый интерпретатор исполняет слова сразу же после их нахождения в словаре.
В Каллисто значение 128 (не ноль) означает состояние компиляции. В состоянии компиляции текстовый интерпретатор компилирует (записывает в словарь) токены найденных слов. Адресный интерпретатор исполнит эти слова позже, когда потребуется.
Обращаться к STATE самостоятельно не рекомендуется. Для переключения в состояние исполнения существует слово [, а в состояние компиляции текстовый интерпретатор переключает слово ]. Это два удобных, стандартных слова. Они устоялись, широко известны и переносимы на всевозможные варианты Форта.
Ввод слова STATE[править]
В режиме ЛАТ последовательно нажмите клавиши 1 2 ШГ← 2 ИП
STATE в стандарте ANS Forth[править]
6.1.2250 STATE CORE ( -- a-addr ) a-addr - адрес ячейки, содержащей флаг состояния компиляции. STATE - true когда в состояния компиляции, иначе false. Значение true в STATE ненулевое, но - иначе определенное реализацией. Только следующие стандартные слова изменяют значение в STATE: : (двоеточие), ; (Точка с запятой), ABORT, QUIT, :NONAME, [ (левая скобка), и ] (правая скобка). Обратите внимание: Программа непосредственно не должна изменять содержание STATE. См.: 3.4 Интерпретатор текста Forth, 6.1.0450 :, 6.1.0460 ;, 6.1.0670 ABORT, 6.1.2050 QUIT, 6.1.2500 [, 6.1.2540 ], 6.2.0455 :NONAME, 15.6.2.2250 STATE. A.6.1.2250 STATE Хотя EVALUATE, LOAD, INCLUDE-FILE, и INCLUDED не перечислены как слова, которые изменяют STATE, текст, интерпретируемый любым из этих слов, может включать одно или более слов, которые явно изменяют STATE. EVALUATE, LOAD, INCLUDE-FILE, и INCLUDED сами не делают изменения в STATE. STATE не вложено при вложении текстового интерпретатора. Например, последовательность кода: : FOO S" ]" EVALUATE ; FOO оставит систему в состоянии компиляции. Точно так же после выполнения LOAD с блоком содержащим ], система будет в состоянии компиляции. Заметьте, что ] не затрагивает область анализа и что единственное влияние которое : оказывает на область анализа, это выделить слово. Это дает право программе использовать эти слова для установки состояния с известными побочными эффектами на область анализа. Например: : NOP : POSTPONE ; IMMEDIATE ; NOP ALIGN NOP ALIGNED Некоторые не-ANS Forth совместимые системы имеют ] вызывающее цикл компилятора в дополнение к установке STATE. Такая система неуместно пыталась бы компилировать второе использование NOP. Также заметьте, что ничто в Стандарте не мешает программе искать идентификаторы исполнения ] или [ и использовать их для изменения STATE. Эти факты предлагают, что реализации ] будут делать только установку STATE и единственный цикл интерпретатора/компилятора будет контролировать STATE. 15.6.2.2250 STATE TOOLS EXT ( -- a-addr ) Расширьте семантику 6.1.2250 STATE, чтобы позволить ;CODE, изменить значение в STATE. Программа непосредственно не должна изменять содержимое STATE. См.: 3.4 Интерпретатор текста Forth, 6.1.0450 :, 6.1.0460 ;, 6.1.0670 ABORT, 6.1.2050 QUIT, 6.1.2250 STATE, 6.1.2500 [, 6.1.2540 ], 6.2.0455 :NONAME, 15.6.2.0470 ;CODE.
История[править]
В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово STATE
Слово STATE отличало компиляцию от исполнения. Во время компиляции счётчик и первые три символа слова компилировались для последующего исполнения.
Устоявшееся слово STATE присутствует в ядре всех стандартов (англ. CORE) со времён fig-Форта до Форта-2012. Хотя для хранения состояния текстового интерпретатора достаточно одного байта, Каллисто идёт навстречу стандарту и отводит на эту переменную целую ячейку.
Все реализации Форта сходятся на том, что нулевое значение STATE означает исполнение — выполнения слов, найденных в словаре. Какое именно ненулевое значение STATE означает компиляцию, стандарт не задаёт и оно разнится от одной реализации Форта к другой.
Слова, проверяющие значения STATE, называются словами, зависимыми от состояния. Их использование часто приводит к непредсказуемым и труднообнаружимым ошибкам, что послужило темой серьёзной дискуссии в сообществе и сильно повлияло на стандарт Форта. Хорошая практика программирования включает советы, как избегать написания слов, зависящих от состояния.
STATE в предыдущем стандарте Forth-83 (англ.)[править]
STATE -- addr U,79 The address of a variable containing the compilation state. A non-zero content indicates compilation is occurring, but the value itself is system dependent. A Standard Program may not modify this variable.
STATE в стандарте Forth-79 (англ.)[править]
STATE -- addr U,164 Leave the address of the variable containing the compilation state. A non-zero content indicates compilation is occurring, but the value itself may be installation dependent.
STATE в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
STATE --- addr L0,U A user variable containing the compilation state. A non-zero value indicates compilation. The value itself may be implementation dependent.
Реализация[править]
96 rrSTATE .EQU 1108 ; 11108 STATE − STATE=0 − исполнение, STATE=128 − компиляция 97 pSTATE .EQU 108 98 rlSTATE .EQU 1109 ; … 2857 ;#STATE 2858 ; STATE ( −− a ) Переменная, состояние текстового интерпретатора. 2859 LSTATE: .DB 5 2860 .TEXT "STATE" 2861 .DW LCURRENT 2862 STATE: .DW SUSE 2863 .DB pSTATE ; 0 => Исполнение
Реализация в SP-Forth 4.20[править]
USER STATE ( -- a-addr ) \ 94 \ a-addr - адрес ячейки, содержащей флажок "состояние компиляции". \ STATE "истина" в режиме компиляции, иначе "ложь". \ Изменяют STATE только следующие стандартные слова: \ : ; [ ] ABORT QUIT :NONAME
Советская реализация[править]
Описание и определение переменной STATE в ядре ФОРТ-ЕС:
STATE П ->А ПЕРЕМЕННАЯ С СОСТОЯНИЕМ ТЕКСТОВОГО 8 ИНТЕРПРЕТАТОРА: "ИСТИНА" - КОМПИЛЯЦИЯ Экран номер 8 ( 09.09.86 СИСТЕМНЫЕ ПЕРЕМЕННЫЕ - ОКОНЧАНИЕ) VARIABLE STATE ( СОСТОЯНИЕ ТЕКСТОВОГО ИНТЕРПРЕТАТОРА)
Определение переменной STATE в FORTH ИТЭФ:
HEAD 205Q,'STAT',3050,STATE,$USE ; STATE DW 54Q ;0=> Исполнение
Ссылки[править]
- Исходный текст слова STATE в Каллисто Классик 1.0
- См. слова INTERPRET, IMMEDIATE, [ и ]
- См. также слова ?EXEC и ?COMP
- state — Why it is Evil and How to Exorcise it, by M. Anton Ertl, pdf (англ.) — материал euroFORTH '98
- Слово STATE и комментарии к нему в стандарте ANS Forth (англ.)
- Слово STATE в стандарте ANS Forth, из расширения TOOLS EXT (англ.)
- Слово STATE и комментарий к нему в черновике Forth 200x (англ.)
- Слово STATE в черновике Forth 200x, из расширения TOOLS EXT (англ.)
- РАСШИРЕНИЕ КОМПИЛЯТОРА: ОПРЕДЕЛЯЮЩИЕ И КОМПИЛИРУЮЩИЕ СЛОВА в книге Л.Броуди «Начальный курс программирования на языке Форт»
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |