(;CODE)
(;CODE) — фортовское слово Каллисто, лишённое заголовка. Завершает высокоуровневую определяющую часть и начинает обработчик на входном языке МК.
(;CODE) ( −− ) Записать в поле кода LAST следующий адрес и EXIT (слово без заголовка).
Записать в поле кода последней статьи следующий адрес и завершить определение.
Слово (;CODE) используется только в порождающих словах, хранящихся в памяти программ. Оно позволяет писать исполняющую часть на языке МК, что сильно ускоряет работу дочерних (создаваемых) слов.
Такая возможность — одна из сильных сторон Форта. В Каллисто 1.0 слово (;CODE) используется в стандартных порождающих словах :, CONSTANT, VALUE и DOES>.
История[править]
Обычно в Форте слово (;CODE) не используется напрямую, а компилируется словом ;CODE — которое также переключает контекст на специальный язык форт-ассемблера, отсутствующий в Каллисто 1.0.
В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем IBM 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт).
В первом FORTH вместе со словом CODE появился важный класс слов. Машинные инструкции следовали в поле параметров. Таким образом могло быть определено любое слово в пределах возможностей компьютера. ;CODE указывало код, который должен быть исполнен для нового класса слов, и ввело то, что сейчас называется объектами.
Вся эта роскошь доступна сегодня тем, кто берётся самостоятельно компилировать Каллисто на компьютере. Начинающим разработчикам придётся обходиться механизмом <BUILDS…DOES>.
(;CODE) в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
(;CODE) C The run-time proceedure, compiled by ;CODE, that rewrites the code field of the most recently defined word to point to the following machine code sequence. See ;CODE.
Реализация[править]
Слово (;CODE) лишено заголовка, так как его заведомо невозможно использовать в новых словах. Действительно, ведь после токена (;CODE) должен идти низкоуровневый код, а ЭКВМ не в состоянии исполнять код ЯМК из области данных. Также отсутствие заголовка экономит место в памяти программ.
Отсутствие заголовка у каллистянского (;CODE) компенсируется возможностью писать удобные высокоуровневые обработчики с помощью механизма <BUILDS…DOES>.
3072 ;#xSemiCODE 3073 ; (;CODE) ( −− ) Записать в поле кода LAST следующий адрес и EXIT (слово без заголовка). 3074 ; Слово (;CODE) невозможно использовать в приложениях, т.к. код ЯМК выполняется лишь из памяти программ. 3075 ; Для экономии места слово (;CODE) лишено заголовка. 3076 ; 3077 ; Записать в поле кода последней статьи следующий адрес и закончить определение. 3078 ;LPSCOD: .DB 7 3079 ; .TEXT "(" ; "(;CODE)" 3080 ; .DB 3BH 3081 ; .TEXT "CODE)" 3082 ; .DW LSMUG ; >R LAST NAME> ! 3083 PSCOD: .DW CALL, FROMR, LATES,N2CFA, STORE, EXIT
Реализации из SP-Forth 4.20:
: CODE-ORIG HEADER HIDE !CSP INIT-ASM ; … : CODE TRUE StartColonHelp [T] CODE-ORIG CONTEXT @ PREVIOUS CONTEXT ! ; : CODE1 \ для словаря не TC-WL CODE-ORIG ;
: (;CODE) R> LATEST 5 - ! ; … : _CODE ( START A NATIVE CODE DEFINITION ) HEADER HIDE !CSP INIT-ASM ; : _;CODE ( CREATE THE [;CODE] PART OF A LOW LEVEL DEFINING WORD ) ?CSP !CSP COMPILE (;CODE) POSTPONE [ INIT-ASM ; … ' _CODE IS CODE ' _;CODE IS ;CODE
: _END-CODE2 EndColonHelp _END-CODE [I] ALSO TC ; ' _END-CODE2 IS END-CODE
( END CODE DEFINITIONS ) IN-ASM : END-ASM A; PREVIOUS ; IN-HIDDEN : _END-CODE ( END A CODE DEFINITION ) END-ASM ?FINISHED ?UNRES ?CSP REVEAL RESTORE-CURRENT CODE-ALIGN EXIT-ASSEMBLER ; IN-ASM DEFER END-CODE ' _END-CODE IS END-CODE DEFER ;C ' _END-CODE IS ;C
Советская реализация[править]
У Баранова-Ноздрунова определение слова (;CODE) выглядит так (стр. 68):
: (;CODE) ( ---> ) R> LAST NAME> ! ;
Определение слова (;CODE) в ядре ФОРТ-ЕС:
(;CODE) *К -> ЗАПИСАТЬ В ПОЛЕ КОДА ПОСЛЕДНЕЙ СТАТЬИ 31 СЛЕДУЮЩИЙ АДРЕС И ЗАКОНЧИТЬ ОПРЕДЕЛЕНИЕ Экран номер 31 ( 31.03.86 LATEST DEFINITIONS SMUDGE UNSMUDGE IMMEDIATE ID.) : (;CODE) ( ->) R> LATEST NAME> ! ;
Определение слов (;CODE) и ;CODE в FORTH ИТЭФ:
HEAD 207Q,'(;CODE',251Q,PSCOD,$COL ; (;CODE) DW FROMR,LATES,PFA,CFA,STORE,SEMI ... HEAD 305Q,';COD',305Q,SEMIC,$COL ; ;CODE DW QCSP,COMP,PSCOD,LBRAC,SMUG,SEMI
Ссылки[править]
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |