0003: базовая система команд tinyVM
Прежде чем рассмотреть целевой компилятор, нужно коснуться вопроса о системе
команд tinyVM.
Как уже было описано в выпуске [0001], tinyVM использует два типа команд:
0op: <опкод> безоперандные команды и префиксы
1op: <опкод> <операнд> команды с одним операндом
Для рассмотрения ЦК достаточно взять следующие команды:
команда байт-код ЦК описание
==================================================================
команды передачи управления и циклов, используемые в лог.конструкциях
nop 00
jmp 01 addr 1234 jmp переход
?jmp 02 addr 5678 ?jmp ( flag -- ) переход если flag=0
call 03 addr 9182 call (R: -- retaddr ) вызов
ret 04 (R: retaddr -- ) возврат
lit 05 cell -189 lit ( -- cell ) префикс литерала
exec 06 ( addr -- ) вызов по адресу из D-стека
do 08 Nto Nfrom do начало цикла со счетчиком
loop 09 loop конец цикла
i 0A значение счетчика L[Lp-0]
j 0B значение счетчика L[Lp-1]
k 0C значение счетчика L[Lp-2]
С системой команд есть одна проблема: рассматриваемая технология
программирования очень простая, хост-систем (целевых платформ) существует не
один десяток, еще больше найдется тех, кому не понравится что-то в архитектуре
tinyVM (например в RU.JAVA была идея использовать гарвардскую архитектуру с
разделением кода и данных в разные адресные пространства), поэтому очень
вероятно появление множества клонов tinyVM, и в этом случае необходимо по
возможности обеспечить переносимость программ между tinyVM и ее клонами.
Традиционный подход -- жестко зарезервировать обязательный набор команд и ряда
расширений (графика, звук, сеть, доступ к файловой системе, компрессия и
т.п.).
Другой вариант (более гибкий, но и более сложный в использовании) -- обязать
авторов клонов tinyVM в обязательном порядке комплектовать пакет с исходниками
движка или его бинарниками модифицированной под клон версией целевого
компилятора с добавленными и переназначенными опкодами команд.
Эта проблема в намного большей степени относится к проекту Synergy
http://synergy.com.ua, так как его система команд завязана на глобальную
систему команд (глидов), что требует их жесткого определения.
Думаю, есть смысл (пока проблема не возникнет практически) пока использовать
вариант 2 определения системы команд, но в рамках Synergy создать систему
регистрации (можно свободную -- архитектура tinyVM дает 64K опкодов, но для
тощих встраиваемых систем может возникнуть ограничение не более 0x100 команд)
диапазонов команд с их подробной on-line спецификацией.
Для встраиваемых систем (системы управления на микроконтроллерах в пром.
оборудовании, кофеварках и пылесосах) наверняка возникнет клон с байтовой
адресацией и 8-битными опкодами (с диапазоном команд 0x00..0xFF) чтобы не
тратить время на дополнительные циклы чтения/записи памяти и особенно
поддержку 16-битных операций (из-за ограничений по скорости и объему кода
движка). Этот вариант может оказаться еще более несовместимым из-за другой
организации памяти и отличий в работе команд.
Полную спецификацию системы команд tinyVM (последняя версия) качать с
http://akps.ssau.ru/forth/tiny/doc/cmdset.html
================
http://akps.ssau.ruforth@km.ru
FidoNet SU.FORTH 2:5057/18.29
tel.: +7 8462 28 9910 (work), 15 4313 (home)