Редактирование:
Слово :
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == Слово : содержит точку CALL адресного интерпретатора — обработчик слов высокого уровня, написанный на [[ЯМК|языке МК]]. Также в поле данных слова : содержится точка NEXT адресного интерпретатора, адрес которой записан в [[R9|регистре 9]]. Создающая часть слова : является высокоуровневой, то есть [[поле кода]] слова: содержит ссылку на точку CALL — ту самую, которая находится внутри [[Поле данных|поля данных]]. <pre> 179 ; Следующие две подпрограммы вызваются косвенно через RC (КППС) из : и DOES> 180 ; SETRIPRG и SETRIDAT внутри тела ":" содержат ссылки на RPUSHRIP и RPUSHRID 181 182 ; Начало CALL при вызове из памяти программ. 183 RPUSHRIP: 184 PPRM 9042 ; RX := RI ; Текущий указатель шитого кода 185 ENT RME / FANS <−> KINT M5 ∗ − KM2 RM5 KM2 ; RPUSH (RX) 186 RM7 RTN ; RX := W, оптимизация 187 188 ; 189 ; Начало CALL при вызове из памяти данных. 190 RPUSHRID: 191 RM6 10001 + ; RX := RI ; Текущий указатель шитого кода 192 ENT RME / FANS <−> KINT M5 ∗ − KM2 RM5 KM2 ; RPUSH (RX) 193 RM7 RTN ; RX := W, оптимизация … 2458 ; ∗∗ Управляющие слова ∗∗ 2459 ; 2460 ;#Colon 2461 ; : ( −− ) Начать определение слова через двоеточие. 2462 LCOLON: .DB 1 2463 .TEXT ":" ; ( "<пр>имя" −− ) 2464 .DW LX 2465 COLON: .DW CALL,QEXEC,SCSP,CREAT,SMUG 2466 .DW RBRAC,PSCOD 2467 CALLD: ;∗∗ CALL, когда управление передаётся в память данных 2468 KGSBC ; RPUSH RI ; RX := W, адрес поля кода нового слова 2469 1 + ; RX := PFA−1, передать в указатель шитого кода R6=RI−1 2470 SETRIDAT: 2471 M6 ; RI := RX 2472 SETDAT: .NUMT RPUSHRID 2473 MC ; RC := RPUSHRID ;∗∗ Следующий вызов −− из памяти данных 2474 .NUM NEXTD 2475 M9 ; R9 := NEXTD ;∗∗ 2476 NEXTD: ; NEXT для шитого кода из памяти данных. 2477 KRM6 RME ∗ KRM6 + M7 ; W := MEMW[RI++] считать шитый код 2478 1 EE 4 − FX>=0 NEXTPP ; Слово из памяти программ? 2479 NEXTDD: M7 M5 KRM7 RME ∗ KRM5 + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде 2480 M8 KGOTO8 ; передать управление на адрес, записанный в CFA … 2490 CALL: ;∗∗ CALL, когда управление передаётся в память программ 2491 KGSBC ; RPUSH RI ; RX := W, адрес поля кода нового слова 2492 2 + ; Теперь RX указывает на его тело 2493 SETRIPRG: 2494 PPM 9042 ; R9042 := RX 2495 SETPRG: .NUMT RPUSHRIP 2496 MC ; RC := RPUSHRIP ;∗∗ Следующий вызов −− из памяти программ 2497 .NUM NEXTP 2498 M9 ; R9 := NEXTP ;∗∗ 2499 NEXTP: ; NEXT для шитого кода из памяти программ. 2500 PPRM 9044 RME ∗ PPRM 9044 + 2501 DOEXECRX: M7 ; W := MEMW[RI++] считать шитый код 2502 1 EE 4 − FX<0 NEXTDD ; Слово из области двоичных данных? 2503 NEXTPP: RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде 2504 M8 KGOTO8 ; передать управление на адрес, записанный в CFA </pre> Реализации из SP-Forth 4.20: <pre> : : ( C: "<spaces>name" -- colon-sys ) \ 94 \ Пропустить ведущие разделители. Выделить имя, ограниченное пробелом. \ Создать определение для имени, называемое "определение через двоеточие". \ Установить состояние компиляции и начать текущее определение, получив \ colon-sys. Добавить семантику инициализации, описанную ниже, в текущее \ определение. Семантика выполнения будет определена словами, скомпилиро- \ ванными в тело определения. Текущее определение должно быть невидимо \ при поиске в словаре до тех пор, пока не будет завершено. \ Инициализация: ( i*x -- i*x ) ( R: -- nest-sys ) \ Сохранить информацию nest-sys о вызове определения. Состояние стека \ i*x представляет аргументы имени. \ Имя Выполнение: ( i*x -- j*x ) \ Выполнить определение имени. Состояния стека i*x и j*x представляют \ аргументы и результаты имени соответственно. HEADER ] HIDE ; </pre> <pre> : : [T] : ALSO TC-IMM ; ( Во время компиляции "двоеточечного" определения в ЦК порядок поиска представляет собой такой пирог: TC-IMM \ imm-слова управления, которые опасно переопределять TC-WL \ создаваемый целевой список слов, он же в CURRENT TC \ словарь определяющих слов ЦК - ":", CREATE, CONSTANT, etc FORTH \ основной словарь инструментальной форт-системы ) </pre> === Советская реализация === Юрий Семёнов приводит следующее определение слова : (стр. 138): : : ( второе ":" - имя слова) ?EXEC ( система в режиме исполнения? Если нет, то сообщение об ошибке) !CSP CURRENT @ CONTEXT ! ( CONTEXT = CURRENT) CREATE ( формирует имя нового слова и поле LFA) ] ( вход в режим компиляции) (;CODE) ; IMMEDIATE ( формирование поля CFA) Описание и определение слова : в ядре ФОРТ-ЕС: <PRE> : -> НАЧАТЬ ОПРЕДЕЛЕНИЕ СЛОВА ЧЕРЕЗ ДВОЕТОЧИЕ 32 Экран номер 32 ( 31.03.86 CONSTANT VARIABLE 2CONSTANT 2VARIABLE : ; ) : : ( -> ) !CSP CREATE ] SMUDGE ;CODE RI RPUSH, RI 14 LR, RNEXT BR, END-CODE </PRE> Определение слова : в FORTH ИТЭФ: <PRE> ; ** Управляющие слова ** HEAD 301Q,,272Q,COLON,$COL ; : DW QEXEC,SCSP,CURR,AT,CONT,STORE,CREAT DW RBRAC,PSCOD $COL LABEL FAR ADD BP, -2 ADD BX, 2 MOV [BP], SI MOV SI, BX NEXT </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице