В чем разница между непримитивным и примитивным в реализации виртуальной машины?

Я вижу кое-что в статье Threaded Code< /эм>:

Традиционно Forth реализуется с использованием непрямых потоков. Таким образом, реализации Forth с прямыми потоками имеют много общего с реализациями с непрямыми потоками: Не-примитивы имеют поле кода, но теперь оно содержит переход к коду вместо его адреса. На большинстве процессоров этот переход требует больше времени, чем дополнительная нагрузка косвенной обработки, поэтому прямая обработка окупается только тогда, когда выполняются примитивы. Результирующее ускорение составляет 2%-8% на 486.

Итак, в чем разница между непримитивным и примитивным, о которых говорится в приведенном выше тексте?


person YHSPY    schedule 24.08.2020    source источник
comment
Со связанной страницы: Код виртуальной машины теперь представлен последовательностью адресов полей кода, а не адресов кода. Простые инструкции виртуальной машины (примитивы) обычно представляются так:   -  person user7860670    schedule 25.08.2020


Ответы (2)


Непримитивы определяются в терминах других слов Форта. Примитивы находятся в собственном коде для целевой платформы.

Традиционно у большинства целевых платформ не было проблем с смешиванием кода и данных, поэтому словарь Forth представлял собой единую структуру данных, начинающуюся с примитивов вверху, тогда как более поздние слова определялись как непримитивы.

Типичное определение слова будет иметь заголовок, содержащее название слова, ссылку на предыдущее слово в словаре (создание связанного списка), за которым следует поле кода и фактическое определение.

Посетите http://www.forth.org/fig-forth/contents.html для нескольких примеров.

Из определения 6502 -, начиная с поля кода:

.WORD DOCOL
.WORD MINUS
.WORD PLUS
.WORD SEMIS

Это буквально компиляция части кода : - MINUS + ;

А это определение примитива MINUS:

.WORD *+2
SEC
TYA
SBC 0,X
STA 0,X
TYA
SBC 1,X
STA l , X
JMP NEXT

Первый начинается с адреса DOCOL, а следующий просто ссылается на собственный код на 2 байта выше.

В этом случае MINUS является примитивом, но он по-прежнему включает косвенный переход по адресу в первых двух байтах. Поточный интерпретатор присутствует в виде DOCOL и SEMIS.

person Henk Langeveld    schedule 25.08.2020

Согласно упомянутой статье, примитив — это простая инструкция виртуальной машины. Но недостаточно ясно: какая инструкция простая, а какая нет.

Согласно определениям терминов, определение Форта – это процедура выполнения Форта. собраны в словарь. Итак, под термином определение мы подразумеваем определение Форта.

Для простоты далее будем рассматривать только те определения, которые идентифицируются токеном выполнения.

Концептуально описание такого определения в словаре имеет заголовок (возможно, пустой) и тело. Тело описывает семантику выполнения в некотором формате двоичного кода (т. е. на двоичном языке). Заголовок (если есть) может определять формат кода тела, когда используется несколько форматов.

Варианты потокового кода являются примерами формата двоичного кода.

Обычно определение описывается через другие определения (и литералы). Но таким образом невозможно описать все определения в системе Forth. Некоторые определения неизбежно будут описаны без каких-либо ссылок на другие определения. Эти определения описаны в двоичном коде базовой машины или ЦП.

Итак, примитив — это определение, описанное в коде базовой машины.

Обратите внимание, что примитивы могут использовать другие определения, но только примитивы могут быть описаны даже без других определений.

В некоторых реализациях Форт-системы все определения в этом смысле являются примитивными — например, когда используется код с подпрограммами с нитями (на самом деле этот код является квазипоточным).

person ruvim    schedule 25.08.2020