Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 20:47

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 00:58 
Старожил

Зарегистрирован: 27 апр 2013, 13:53
Сообщения: 1018
PRC писал(а):
Сделать эмулятор МК-61)))) И просто и команд достаточно много. На нем даже почти шашки делать умудрялись)))

Сейчас уже есть MK-151 :) а для него Калисто (диалект Форт языка поверх штатного языка)
но для HP50G, например, сделан проект NewRPL языка, но там ARM 200МГц процессор.

P.S. Сейчас уже доступен швейцарский калькулятор DM42 совместимый с ПО HP42S и эмулятором Free42.
Железо в нём на базе STM32L476 контроллера на частоте 48/24 МГц (от USB|батареек) и экономичный ч.б экран 400x272.
Цена, правда, для российского потребителя получается не очень гуманной на данный кальк. Для Европы, наверное, нормальная.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 01:46 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Так нужно простое решение, а не всякие бейсики и форты. Вот система команд у МК как раз простая и вполне достаточная. Если нужно всегда можно добавить всякие print & plot.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 02:08 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
aamonster писал(а):
Reflector, напротив, реализация получается предельно простая: каждая функция просто запрашивает сколько ей надо аргументов - используя для этого ту же функцию, что вычисляет внешнее выражение.
Код:
eval: case get_token()
  '+': return eval()+eval()
  '*': return eval()*eval()
  number: return number_value()

Это не совсем то, о чем я думал, но согласен, сама реализация тоже простая, хоть и рекурсивная, но в случае с обратной нотацией мы сразу получаем такой-же порядок, который будет использоваться при исполнении кода. Допустим у нас было выражение a + b которое превратилось в ab+, а соответствующий ему код выглядит как:
Код:
push a
push b
add

Вероятно при твоем подходе можно получить такой-же байт-код, вопрос скорее в том насколько просто из исходного выражения получить прямую и обратную польские нотации. А выражения могут быть сложными, у меня было 15 групп операций с разными приоритетами, а еще есть ассоциативность... Чтобы точно сказать насколько это сложно провернуть с прямой нотацией нужно было иметь с ней дело, тем более алгоритм сортировочной станции Дейкстры, который часто используют для обратной, там не работает, а рекурсивный спуск для большого количества операций становится сильно запутанным...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 02:40 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2619
Откуда: Санкт-Петербург
Ну да. Прямая польская запись - рекурсия во время выполнения. С использованием аппаратного стека - дёшево. Плюс предельно простой и прозрачный код.

Обратная - итеративное выполнение, но стек придётся делать свой, что минус. На си почти наверняка получится медленнее, чем обратная (из-за расходов на свой стек), на асме не уверен (там можно схитрить, как в некоторых реализациях forth, поменяв местами стек возвратов и стек данных), "в железе" (verilog) - явно проще и быстрее.
Да, ещё в форте обратная запись тянет за собой двухстековую архитектуру - за всё надо платить.

Компиляция выражений с приоритетами и ассоциативностью в прямую и обратную запись одинаково тривиальна. Строго тот же рекурсивный спуск, только для прямой записи вначале пишете функцию, потом аргументы, а для обратной вначале аргументы, потом функцию. AST одно и то же, просто "печатается" в другом порядке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 03:36 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
aamonster писал(а):
Ну да. Прямая польская запись - рекурсия во время выполнения. С использованием аппаратного стека - дёшево. Плюс предельно простой и прозрачный код.

Рекурсивный код по определению не может быть более простым и прозрачным, особенно если есть полтора десятка приоритетов и соответственно полтора-два десятка функций рекурсивно вызывающих друг друга в нужном порядке. Получил на вход число и побежал по цепочка до самого конца, потому что функция отдающая число находится именно там, потом выбрал '+', а сложение ближе к началу цепочки, начинаем движение в обратную сторону... А алгоритмы на основе стека линейны, там скорее всего будет большой switch, причем приоритет операций тоже будет задаваться через switch или таблицу. На PC у меня алгоритм сортировочной станции работал быстрее рекурсивного спуска и он значительно нагляднее, а для Pingvin явно в приоритете должна быть простота, потому что когда люди берутся писать компиляторы шансы довести это дело до чего-то осязаемого изначально не очень высоки :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 07:10 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Спасибо всем за интересную дискуссию и информацию!
Решил начать с простого - с интерпретатора.
Вроде должно получиться.

Писать будут скрипты для обработчиков различных событий: нажатие на ту или иную кнопку, изменение статуса блютус соединения, прием по ИК каналу "выстрела", команды от пульта и прочее.

События могут иметь параметры: содержимое ИК пакета, команды пульта, новый статус соединения и пр.
Необходимые параметры будут доступны соответствующим скриптам-обработчикам.

Есть так же глобальные переменные, отвечающие за игровой процесс: уровень здоровья, количество патронов в обойме, остаток обойм, наносимый оружием урон (мощность оружия) и т.д.
Они так же будут видны.

Будут доступны таймеры с возможностью их настройки из скриптов - направление отсчета, интервал отсчета.

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

Будут команды сравнения.
Будет группировка блока команд фигурными скобками.
#- это комментарии, строки будут игнорироваться

Пока вроде всё, по ходу дела видно будет, чего добавить.


С разделителями команд не определился.
Проще, конечно: одна строка - одна команда.
Но может сделаю разделителем команд точку с запятой.

Например, нужно не чаще чем раз в две минуты выдавать две обоймы любому, кто выстрелит в устройство.

Примерный вариант скрипта - обработчика полученного "выстрела".
Цитата:
таймеру_считать_вниз_до 0
интервал_отсчета_таймера 1
LOOP:

если_таймер_обнулен
{
отправить_ИК_сообщение_выдать_обоймы 2
задать_значение_таймера 120
воспроизвести_звук_удачного_завершения_операции
выйти_из_обработчика
}
воспроизвести_звук_ошибки

ENDLOOP



Выдавать обоймы только своим
Цитата:
таймеру_считать_вниз_до 0
интервал_отсчета_таймера 1
LOOP:

если_таймер_обнулен
{
если_равны цвет_команды_стрелявшего, цвет_команды_нашего_игрока
{
отправить_ИК_сообщение_выдать_обоймы 2
задать_значение_таймера 120
воспроизвести_звук_удачного_завершения_операции
выйти_из_обработчика
}
воспроизвести_звук_ошибки
выйти_из_обработчика
}
воспроизвести_звук_ошибки

ENDLOOP


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 09:21 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
А как создать генератор на базе mBlock (Scratch 2.0 )?


Последний раз редактировалось Pingvin 29 авг 2017, 09:34, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 09:33 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Создание модификации Скретч 2.0
https://scratch.mit.edu/discuss/topic/40808/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 29 авг 2017, 16:18 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Я чего подумал....
Что нам мешает за первый проход получить индексы команд и значения параметров и загнать их в оперативку?
Второй и последующие проходы гнать уже из оперативы, файл можно закрыть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 ноя 2017, 11:59 
Только пришел

Зарегистрирован: 28 янв 2016, 14:42
Сообщения: 11
Не увидел тут ссылки, пишу, может кто не знал о существовании полностью рабочего и относительно хорошо задокументированного forth для STM/ARM. С проектами и исходниками
Show Mecrisp-stellaris
Фаст-старт: прошиваем плату - раз, ставим только Folie (ну и Cmder для винды) - два, немного доп инфы по usb - три по usart, rs232 там же в архиве
В последней версии Folie команда заливки "!send ./1608-forth/flib/mecrisp/disassembler-m0.fs" прекрасно работает и цепляет инклюды других файлов, msend'ы picocom'ы макросы для виндового teraterm более не нужны.

В usb-common.bin есть основные HAL, заливку либ пока пропускаем
eraseflash - стирает все кроме консоли + ядра mecrisp
compiletoflash - перкл заливку на флеш
compiletoram - на рамдиск, чтобы не жечь флеш экспериментами, и есть мнение что скачки по некешированному коду будут быстрее. НО даже на рамдиске излишние джампы по адрес-спейсу сильно тормозят выполнение кода, джампы проверяем командой дизасса see %name%
reset - кудаж без него
Важно переназначать все функции где есть вызов переназначенной, адрес может изменится(если изменился размер) у вас будет вызываться старая функция
Ctrl+S Alt+Tab Up>(!send) Enter или сборочный скрипт с макросом перезальет все сразу, тока в Folie жмите Alt Alt+Tab, по Alt врубается какой-то режим ввода для хакеров.

Читаем README по ссылкам выше, учимся работать с консольными данными(в этом его главная, да и не последняя фишка, порой проще углубиться в суть и за час написать код на forth, чем лопатить библиотеки и кубойдные примеры из интернета, тем-более умение писать код на forth только помогает раскатывать исходники на сях), тренируемся с отладкой, правим проекты, не забываем проглядывать свою писанину через see.
Show Стек-машина в ядре


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 ноя 2017, 14:15 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 2471
Reflector писал(а):
aamonster писал(а):
Ну да. Прямая польская запись - рекурсия во время выполнения. С использованием аппаратного стека - дёшево. Плюс предельно простой и прозрачный код.

Рекурсивный код по определению не может быть более простым и прозрачным, особенно если есть полтора десятка приоритетов и соответственно полтора-два десятка функций рекурсивно вызывающих друг друга в нужном порядке. Получил на вход число и побежал по цепочка до самого конца, потому что функция отдающая число находится именно там, потом выбрал '+', а сложение ближе к началу цепочки, начинаем движение в обратную сторону... А алгоритмы на основе стека линейны, там скорее всего будет большой switch, причем приоритет операций тоже будет задаваться через switch или таблицу. На PC у меня алгоритм сортировочной станции работал быстрее рекурсивного спуска и он значительно нагляднее, а для Pingvin явно в приоритете должна быть простота, потому что когда люди берутся писать компиляторы шансы довести это дело до чего-то осязаемого изначально не очень высоки :)

Тут стоит разделить этапы разбора и выполнения. Разбор удобнее делать рекурсивным спуском (а еще лучше - просто взять компилятор компиляторов, типа antlr или bison). Построенное абстрактное синтаксическое дерево можно преобразовать в любой подходящий формат и уже его выполнять. Собственно, формирование формата выполнения по абстрактному синтаксическому дереву штука предельно простая, легко получить хоть прямую, хоть обратную польскую записи (собственно, они отличаются только порядком записи промежуточного формата при обходе дерева), причем приоритеры операций уже учтены.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 17:18 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Переписал машинку так, чтобы можно было несколько экземпляров запускать одновременно в разных потоках.

Общие -

Show только функции выполняющие оптокод (с указателем на экэкмпляр виртуальной маштнки в аргументах)


и константный список адресов глобальных переменных.
Всё остальное (стек,указатели на вершину стека, счетчики команд и т.п) составляет контент экземпляра виртуальной машины.


Код:
class VM
{
public:
     std::map <int, tVariableDescription> VariableDescriptionMap;
    static const MyMap SystemVariableDescriptionMap;
    static const tFuncDef LSL_funcList[] ;
    VM();
    tpFuncToCall pF;


    uint32_t CP;//указатель на текущую позицию в байт коде
    uint32_t SP;//указатель на вершину стека
    uint32_t stack[1024];
    uint32_t STATUS_REGISTER;

    void exec_optocod(tOptpCode);
    void push(uint32_t data);
    uint32_t pop(void);
    void removeAllVariables(void);

};







Show Запустил два экзкмпляра в друх разных потоках - вроде работает.




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



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


Последний раз редактировалось Pingvin 05 авг 2019, 17:28, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 17:27 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
И ещё такая идея - для строковых значений сделать отдельный стек и хранить там строки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 17:50 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
Ломаю голову как организовать вызов функций с передачей аргументов и возврат значений.
наверное регистры добавлю, при вызове функции их содержимое сохранять в стеке.

Аргументы передаются через стек, будет типа такого:
Код:
push a, b, c
call func
SP += 3

Допустим внутри функции нужно добавить 5 к 'b':
Код:
push 5
push [SP+1]
add

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 17:54 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
А если из функции нужно вызвать другую функцию?
Допустим - второй оперант - это результат работы другой функции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 17:57 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
А если из функции нужно вызвать другую функцию?
Допустим - второй оперант - это результат работы другой функции.

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


Последний раз редактировалось Reflector 05 авг 2019, 18:00, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:00 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Пока планирую передавать параметры через стек.
Завести регистры для работы с данными.
Забираем из стека параметры и кладём в регистры.
Для возврата результата либо специальный регистр, лмбо все же через стек.
Если нужно вызвать функцию из функции - сохраняем значения регистрыов в стеке, вызываем функцию, после востанавливаем регистры из стека.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:03 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Reflector писал(а):
Pingvin писал(а):
А если из функции нужно вызвать другую функцию?
Допустим - второй оперант - это результат работы другой функции.

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

Да нет, просто не получается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:09 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
Пока планирую передавать параметры через стек.
Завести регистры для работы с данными.
Забираем из стека параметры и кладём в регистры.

Еще раз... Передал ты данные через стек, по адресу [SP+1] находится нужная тебе переменная, чтобы что-то с ней сделать ее придется перекинуть на вершину стека и это делается одной командой. Или можно сохранить значение [SP+1] в регистр, но стековая машина с регистрами не работает, т.е. при необходимости опять придется из переменной копировать на стек. И зачем эта лишняя прослойка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:12 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
Да нет, просто не получается.

Никто не говорил, что все просто, но оно работает у меня в реальных компиляторах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:15 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Надо на примере рассмотреть, для наглядности.

А если внутри функции обзявляем переменные - тоже в стеке создавать?


Последний раз редактировалось Pingvin 05 авг 2019, 18:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:15 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Reflector писал(а):
Pingvin писал(а):
Да нет, просто не получается.

Никто не говорил, что все просто, но оно работает у меня в реальных компиляторах.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:17 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
Чисто стековая машина, без регистров?

Да.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:19 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
А промежуточные значения где хранить?

Есть глобальные переменные, есть локальные переменные, все остальное хранится на стеке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 05 авг 2019, 18:20 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Reflector писал(а):
Pingvin писал(а):
Чисто стековая машина, без регистров?

Да.

Попробую...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: meykj


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB