Редактирование: Адресный интерпретатор

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 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. Адрес точки NEXT хранится в [[R9]]. Содержимое [[R9]] различно и зависит от того, идёт исполнение шитого кода из [[Регистры байтовых данных|памяти данных]] или [[Память программ|памяти программ]]. В этих двух случаях адрес NEXT равен NEXTD и NEXTP соответственно.
 
[[RE|Регистр E]] содержит число 256. [[Токен]] очередного слова W считывается из [[Шитый код|шитого кода]] в [[R7|регистр 7]]. Регистр выглядит, как вспомогательный, но на самом деле содержимое [[R7]] повторно используется в подпрограммах RPUSHRIP / RPUSHRID. Обращение к ним происходит из CALL с помощью команды [[КППС]], но об этом чуть позже.
 
Считанный [[токен]] W указывает на [[поле кода]] слова, в котором содержится адрес обработчика этого слова. Именно этот трюк (указатель на адрес) делает применённый [[шитый код]] «косвенным». Этот адрес считывается в [[R8]] и команда [[КБП8]] передаёт управление на обработчик. Обработчик всегда написан на [[ЯМК|языке МК]] и содержится в [[Память программ|памяти программ]], но токен W может указывать как на [[Регистры байтовых данных|память данных]], так и на [[Память программ|память программ]].


Действие NEXT не следует путать с каллистянским словом [[NEXT]].
Действие NEXT не следует путать с каллистянским словом [[NEXT]].
Строка 40: Строка 34:
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: Строка 45:


=== 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: Строка 78:
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>


Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)