Редактирование:
DOES⟩
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == Основная часть слова DOES> является высокоуровневой. Для ускорения исполнения порождаемых слов исполняющая часть слова DOES> написана на [[ЯМК|языке МК]]. Также в [[поле данных]] слова DOES> присутствует вторая исполняющая часть — для порождающего слова [[VOCABULARY]], высокоуровневая исполняющая часть которого находится в [[Память программ|памяти программ]]. <pre> 2596 ;#DOES 2597 ; DOES> ( −− a ) Начало обработчика в порождающем слове. 2598 ; Все слова, определённые через DOES> находятся в памяти данных 2599 ; DOES> переводится с Форта на русский как "исполняется". 2600 ; Слово присутствует во всех фортах, но начиная с Форта−83 его реализация сильно отличается из−за отсутствия в этих языках слова <BUILDS 2601 LDOES: .DB 5 2602 .TEXT "DOES>" ; ( −− pfa) 2603 .DW LDEFER 2604 DOESD: .DW CALL, FROMR, LITP 2605 .DB 39,16 ; 10000 2606 .DW SUB, LATES,N2PFA,STORE, PSCOD 2607 ;∗∗ CALL по адресу из @PFA с засылкой в стек PFA+2 2608 SDOED: ; Обработчик в памяти данных, обычный случай 2609 KGSBC ; RPUSH RI; RX := W 2610 2 + M7 M5 ; W указывало на SDOED, а теперь указывает на xt (CFA) обработчика 2611 10002 + KM3 ; PUSH W+2 ; PFA+2 с трансляцией адресов 2612 KRM7 RME ∗ KRM5 + ; CFA всегда считывается из памяти данных 2613 1 − ; RX := PFA−1, передаём в указатель шитого кода R6=RI 2614 PGOTO SETRIDAT ; Перейти на NEXT для области данных 2615 2616 DOESP: .DW CALL ; Сейчас используется только для слова VOCABULARY 2617 .DW FROMR,LATES,N2PFA,STORE,PSCOD 2618 SDOEP: ; Обработчик в памяти программ, единичный случай 2619 KGSBC ; RPUSH RI; RX := W 2620 2 + M7 M5 ; W указывало на SDOE, а теперь на xt (CFA) обработчика 2621 10002 + KM3 ; PUSH W+2 ; PFA+2 с трансляцией адресов 2622 KRM7 RME ∗ KRM5 + ; .NUM DOVOC 2623 PGOTO SETRIPRG ; Перейти на NEXT для области программ </pre> Реализация из SP-Forth 4.20: <pre> 0 VALUE DOES-CODE … ' R> VALUE DOES-CODE … : (DOES1) \ та часть, которая работает одновременно с CREATE (обычно) R> DOES>A @ CFL + - DOES>A @ 1+ ! ; CODE (DOES2) LEA EBP, -4 [EBP] MOV [EBP], EAX MOV EAX, 4 [ESP] MOV EBX, [ESP] LEA ESP, 8 [ESP] JMP EBX END-CODE ' (DOES2) ' DOES-CODE TC-VECT! : DOES> \ 94 \ Интерпретация: семантика неопределена. \ Компиляция: ( C: clon-sys1 -- colon-sys2 ) \ Добавить семантику времени выполнения, данную ниже, к текущему \ определению. Будет или нет текущее определение сделано видимо \ для поиска в словаре при компиляции DOES>, зависит от реализации. \ Поглощает colon-sys1 и производит colon-sys2. Добавляет семантику \ инициализации, данную ниже, к текущему определению. \ Время выполнения: ( -- ) ( R: nest-sys1 -- ) \ Заменить семантику выполнения последнего определения name, на семантику \ выполнения name, данную ниже. Возвратить управление в вызывающее опреде- \ ление, заданное nest-sys1. Неопределенная ситуация возникает, если name \ не было определено через CREATE или определенное пользователем слово, \ вызывающее CREATE. \ Инициализация: ( i*x -- i*x a-addr ) ( R: -- nest-sys2 ) \ Сохранить зависящую от реализации информацию nest-sys2 о вызывающем \ определении. Положить адрес поля данных name на стек. Элементы стека \ i*x представляют аргументы name. \ name Выполнение: ( i*x -- j*x ) \ Выполнить часть определения, которая начинается с семантики инициализации, \ добавленной DOES>, которое модифицировало name. Элементы стека i*x и j*x \ представляют аргументы и результаты слова name, соответственно. ['] (DOES1) COMPILE, ['] (DOES2) COMPILE, ; IMMEDIATE </pre> === Советская реализация === Описание и определение слова DOES> в ядре ФОРТ-ЕС: <PRE> DOES> HK -> НАЧАЛО "ИСПОЛНЕНИЯ" В ОПРЕДЕЛЯЮЩЕМ СЛОВЕ 34 DOES# M ПОДПРОГРАММА - НАЧАЛО РАСШИРЕНИЯ "DOES>" 3 Экран номер 3 ( 09.09.86 ДОПОЛНИТЕЛЬНЫЕ ВХОДЫ В АДРЕСНЫЙ ИНТЕРПРЕТАТОР) M: DOES# RI RPUSH, RI 4 (, 15 LA, RI RFORTH SR, A: CREATE# RW1 14 LR, ( ПОМЕСТИТЬ РFA СТАТЬИ) M: PUSHRW1 RSTACK RTWO SR, ( ПОМЕСТИТЬ ЗНАЧЕНИЕ ИЗ RW1) M: PUTRW1 RW1 PUT, RNEXT BR, ( ЗАМЕНИТЬ ВЕРХНЕЕ) Экран номер 36 ( 09.09.86 CREATE DOES> ) : DOES> ( ->) COMPILE (;CODE) 2LIT [ DOES# B, ] , , ; IMMEDIATE </PRE> Определение слова DOES> в FORTH ИТЭФ: <PRE> HEAD 205Q,'DOES',276Q,DOES,$COL ; DOES> DW FROMR,LATES,PFA,STORE,PSCOD $DOE LABEL FAR SUB BP, 2 ADD BX, 2 MOV [BP], SI MOV SI, [BX] ADD BX, 2 PUSH BX NEXT </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице