(;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 указывало код, который должен быть исполнен для нового класса слов, и ввело то, что сейчас называется объектами.

Вся эта роскошь доступна сегодня тем, кто берётся самостоятельно компилировать Каллисто на компьютере. Начинающим разработчикам придётся обходиться механизмом <BUILDSDOES>.

(;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) компенсируется возможностью писать удобные высокоуровневые обработчики с помощью механизма <BUILDSDOES>.

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

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


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


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