Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''Адресный интерпретатор''' (''англ.'' address interpreter) — интерпретатор [[Шитый код|косвенного шитого кода]]. | | '''Адресный интерпретатор''' (''англ.'' address interpreter) — интерпретатор [[Шитый код|косвенного шитого кода]]. |
|
| |
|
| Если поток исполнения команд уподобить току крови, то ''адресный интерпретатор'' — сердце [[Каллисто]]. Каждая передача управления от одного [[примитив]]а к другому проходит через ''адресный интерпретатор''. Именно он «гонит кровь» через [[Слово :|определения высокого уровня]], «оживляя» [[шитый код]] и заставляя его [[EXECUTE|работать]].
| | ''Адресный интерпретатор'' [[Каллисто|Каллисто 1.0]] использует [[единое адресное пространство]], что позволяет исполнять [[шитый код]] как из [[Регистры байтовых данных|байтовой памяти]], так и из [[Память программ|памяти программ]]. |
|
| |
|
| ''Адресный интерпретатор'' [[Каллисто|Каллисто 1.0]] использует [[единое адресное пространство]], что позволяет исполнять [[шитый код]] как из [[Регистры байтовых данных|байтовой памяти]], так и из [[Память программ|памяти программ]]. Такой подход делает его в несколько раз сложней и медленней, чем принято в Форте. В Каллисто-2 планируется упростить адресный интерпретатор, запретив [[шитый код]] в [[Память программ|памяти программ]]. | | Если поток исполнения команд уподобить току крови, ''адресный интерпретатор'' — сердце [[Каллисто]]. Каждая передача управления от одного [[примитив]]а к другому проходит через ''адресный интерпретатор''. Именно он «гонит кровь» через [[Слово :|определения высокого уровня]], «оживляя» [[шитый код]] и заставляя его [[EXECUTE|работать]]. |
|
| |
|
| К сожалению, сейчас (по состоянию на январь 2018 года) ''адресный интерпретатор'' написан на [[ЯМК|языке МК]], что ещё сильней ограничивает быстродействие [[Каллисто]]. Оптимизация ''адресного интерпретатора'' по быстродействию, как и прошивка его в ПЗУ [[микроконтроллер]]а является задачей, важной для успеха [[Каллисто]]. | | К сожалению, сейчас (по состоянию на июнь 2016 года) ''адресный интерпретатор'' написан на [[ЯМК|языке МК]], что сильно ограничивает быстродействие [[Каллисто]]. Оптимизация ''адресного интерпретатора'' по быстродействию, как и прошивка его в ПЗУ [[микроконтроллер]]а является задачей, важной для успеха [[Каллисто]]. |
|
| |
|
| == История == | | == История == |
Строка 15: |
Строка 15: |
|
| |
|
| == Реализация == | | == Реализация == |
| В [[Каллисто|Каллисто 1.0]] адресный интерпретатор способен исполнять [[шитый код]] как из [[Регистры байтовых данных|памяти данных]], так и из [[Память программ|памяти программ]] [[МК-161|«Электроники МК-161»]]. Прежде, чем принять компактную и завершённую форму, он прошёл через множество эволюций и представляет собой произведение искусства — как вышивка или плетение. | | В [[Каллисто|Каллисто 1.0]] адресный интерпретатор способен исполнять [[шитый код]] как из [[Регистры байтовых данных|памяти данных]], так и из [[Память программ|памяти программ]] [[МК-161|«Электроники МК-161»]]. |
| | |
| В Каллисто-2 адресный интерпретатор существенно упростится, а его работа ускорится, т.к. для работоспособности транслятора достаточно уметь исполнять [[шитый код]] из [[Регистры байтовых данных|памяти данных]]. У рассматриваемого адресного интерпретатора сохранится важное преимущество — максимальный объём свободной [[Регистры байтовых данных|памяти данных]] облегчает разработчику создание крупных приложений.
| |
|
| |
|
| === NEXT === | | === NEXT === |
| Действие NEXT — основа адресного интерпретатора, передача управления от одного [[токен]]а в цепочке [[шитый код|шитого кода]] к следующему. Каллистянские [[примитив]]ы обычно завершаются командой [[КБП9]], так как актуальный адрес NEXT хранится в [[R9]]. Содержимое [[R9]] зависит от того, идёт исполнение [[Шитый код|шитого кода]] из [[Регистры байтовых данных|памяти данных]] или [[Память программ|памяти программ]]. В этих двух случаях адрес NEXT равен NEXTD и NEXTP соответственно. | | Действие NEXT — основное в адресном интерпретаторе, передача управления от одного токена в цепочке [[шитый код|шитого кода]] к следующему. Его не следует путать с каллистянским словом [[NEXT]]. |
| | |
| [[RE|Регистр E]] содержит число 256. [[Токен]] очередного слова W считывается из [[Шитый код|шитого кода]] в [[R7|регистр 7]]. Регистр выглядит, как вспомогательный, но на самом деле содержимое [[R7]] повторно используется в подпрограммах RPUSHRIP / RPUSHRID. Обращение к ним происходит из CALL с помощью команды [[КППС]], но об этом чуть позже.
| |
| | |
| Считанный [[токен]] W указывает на [[поле кода]] слова, в котором содержится адрес обработчика этого слова. Именно этот трюк (указатель на адрес) делает применённый [[шитый код]] «косвенным». Этот адрес считывается в [[R8]] и команда [[КБП8]] передаёт управление на обработчик. Обработчик всегда написан на [[ЯМК|языке МК]] и содержится в [[Память программ|памяти программ]], но токен W может указывать как на [[Регистры байтовых данных|память данных]], так и на [[Память программ|память программ]].
| |
| | |
| Действие NEXT не следует путать с каллистянским словом [[NEXT]].
| |
| <pre> | | <pre> |
| 2476 NEXTD: ; NEXT для шитого кода из памяти данных. | | 2476 NEXTD: ; NEXT для шитого кода из памяти данных. |
Строка 40: |
Строка 32: |
| 2503 NEXTPP: RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде | | 2503 NEXTPP: RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде |
| 2504 M8 KGOTO8 ; передать управление на адрес, записанный в CFA | | 2504 M8 KGOTO8 ; передать управление на адрес, записанный в CFA |
| 2505
| |
| </pre> | | </pre> |
|
| |
|
| === EXECUTE === | | === EXECUTE === |
| Слово [[EXECUTE]] считывает из [[Стек данных|стека]] [[CFA|токен]], после чего передаёт управление на его обработчик. Основную работу выполняет код, начиная с метки DOEXECRX — он приведён выше в описании NEXT. | | Слово [[EXECUTE]] считывает из [[Стек данных|стека]] [[CFA|токен]], после чего передаёт управление на его обработчик. Эту работу выполняет код, начиная с метки DOEXECRX — см. его выше, в описании NEXT. |
| <pre> | | <pre> |
| 2506 JEXEC: ; Обработчик EXECUTE | | 2506 JEXEC: ; Обработчик EXECUTE |
Строка 52: |
Строка 43: |
|
| |
|
| === CALL / RETURN === | | === CALL / RETURN === |
| Действия CALL и RETURN позволяют адресному интерпретатору исполнять не только последовательность [[примитив]]ов, но также использовать в [[шитый код|шитом коде]] слова высокого уровня — обеспечивая вложенность определений «через двоеточие». Этим двум действиям соответствуют каллистянские слова [[Слово :|:]] и [[EXIT]].
| | Действие CALL / RETURN позволяют шитому коду исполнять не только последовательность примитивов, но также использовать слова высокого уровня — образуя своего рода вложенность. Этим двум действиям соответствуют каллистянские слова [[Слово :|:]] и [[EXIT]]. |
| | |
| Сохранив в [[Стек возвратов Каллисто|стеке возвратов]] текущую позицию [[Шитый код|шитого кода]] (или считав её оттуда), действия CALL / RETURN передают управление на точки NEXTD / NEXTP (см. выше). Действие CALL в [[Каллисто|Каллисто 1.0]] реализовано дважды, начиная с меток CALLD и CALL. Это обработчики высокоуровневых слов в [[Регистры байтовых данных|памяти данных]] (слова разработчика) и [[Память программ|памяти программ]] (заранее откомпилированные) соответственно:
| |
| <pre> | | <pre> |
| 2467 CALLD: ;∗∗ CALL, когда управление передаётся в память данных | | 2467 CALLD: ;∗∗ CALL, когда управление передаётся в память данных |
Строка 87: |
Строка 76: |
| 2499 NEXTP: ; NEXT для шитого кода из памяти программ. | | 2499 NEXTP: ; NEXT для шитого кода из памяти программ. |
| … | | … |
| </pre>
| |
|
| |
| Реализации CALLD и CALL начинаются с команды [[КППС]], которая заносит в [[Стек возвратов Каллисто|стек возвратов]] текущую позицию в [[Шитый код|шитом коде]]. Эта команда производит обращение к одной из двух подпрограмм, которые ради оптимизации размещены в самом начале [[Каллисто|Каллисто 1.0]]. Выбор RPUSHRIP или RPUSHRID зависит от того, требуется сохранить позицию в [[Память программ|памяти программ]] или [[Регистры байтовых данных|данных]] соответственно:
| |
| <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, оптимизация
| |
| </pre> | | </pre> |
|
| |
|