Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503

Виртуальная стековая байт-машина

27.08.2017, 15:35. Показов 7709. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Захотел прикрутить к проекту виртуальную машину.
Чтобы писать скрипты, компилировать в байт-код и выполнять его на контроллере.

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

Начал с изучения статьи "Пишем интерпретатор скрипта и стековую машину" на хабре https://habrahabr.ru/post/223887/
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.08.2017, 15:35
Ответы с готовыми решениями:

Виртуальная стековая машина
Всем доброго времени суток. не так давно было принято решение покопаться в данной теме. Собственно мне необходимо написать ВСМ на СИ, к...

Стековая виртуальная машина
Приветствую, товарищи! не так давно возникла задача интерпретации кода. откопал готовое решение, а там внутри сидит, как выяснилось,...

Виртуальная стековая машина передача данных
Добрый день. Решил изучить тему вм и написать свой интерпретатор так вот у меня есть подобие виртуальной стековой машины. Теперь мне нужны...

35
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
27.08.2017, 21:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pymkvym
Ну вот Pawn заинтересовал, но опять не найду ни описания языка, ни как прикрутить его к своему проекту!
Знаете, что такое синдром Блаба? :)
Грэм, Пол "Lysp: побеждая посредственность"
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.08.2017, 21:13
Riftistor, напротив, реализация получается предельно простая: каждая функция просто запрашивает сколько ей надо аргументов - используя для этого ту же функцию, что вычисляет внешнее выражение.
Code
1
2
3
4
eval: case get_token()
+: return eval()+eval()
*: return eval()*eval()
number: return number_value()
(для скорости вместо case делается таблица переходов... Впрочем, вроде сейчас компиляторы сами умеют делать такую оптимизацию)
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.08.2017, 21:20
Pymkvym, штука в том, что не надо стек руками делать - он у вас уже есть. Т.е. код для прямой польской записи получается проще. Вот в железе обратная бы проще вышла, наверное.
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
27.08.2017, 21:47
Цитата Сообщение от Pymkvym
Ну вот Pawn заинтересовал, но опять не найду ни описания языка, ни как прикрутить его к своему проекту!
http://we.iosyitistromyss.ru/STM32/prik ... stm32.html

ну и интерпретаторы:
https://github.com/zsaleeba/picoc
https://github.com/pmachapmom/LittleC
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
27.08.2017, 23:22
Сделать эмулятор МК-61)))) И просто и команд достаточно много. На нем даже почти шашки делать умудрялись)))
0
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
28.08.2017, 00:11
Цитата Сообщение от PRS
Сделать эмулятор МК-61)))) И просто и команд достаточно много. На нем даже почти шашки делать умудрялись)))
Сейчас уже есть MK-151 :) а для него Калисто (диалект Форт языка поверх штатного языка)
но для HP50G, например, сделан проект NewRPL языка, но там ARM 200МГц процессор.

P.S. Сейчас уже доступен швейцарский калькулятор DM42 совместимый с ПО HP42S и эмулятором Frii42.
Железо в нём на базе STM32T476 контроллера на частоте 48/24 МГц (от USB|батареек) и экономичный ч.б экран 400x272.
Цена, правда, для российского потребителя получается не очень гуманной на данный кальк. Для Европы, наверное, нормальная.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
28.08.2017, 00:59
Так нужно простое решение, а не всякие бейсики и форты. Вот система команд у МК как раз простая и вполне достаточная. Если нужно всегда можно добавить всякие prymt & plot.
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
28.08.2017, 01:21
Цитата Сообщение от oomomstir
Riftistor, напротив, реализация получается предельно простая: каждая функция просто запрашивает сколько ей надо аргументов - используя для этого ту же функцию, что вычисляет внешнее выражение.
Код:
eval: case get_token()
+: return eval()+eval()
*: return eval()*eval()
number: return number_value()
Это не совсем то, о чем я думал, но согласен, сама реализация тоже простая, хоть и рекурсивная, но в случае с обратной нотацией мы сразу получаем такой-же порядок, который будет использоваться при исполнении кода. Допустим у нас было выражение a + b которое превратилось в ab+, а соответствующий ему код выглядит как:
Code
1
2
3
push a
push b
add
Вероятно при твоем подходе можно получить такой-же байт-код, вопрос скорее в том насколько просто из исходного выражения получить прямую и обратную польские нотации. А выражения могут быть сложными, у меня было 15 групп операций с разными приоритетами, а еще есть ассоциативность... Чтобы точно сказать насколько это сложно провернуть с прямой нотацией нужно было иметь с ней дело, тем более алгоритм сортировочной станции Дейкстры, который часто используют для обратной, там не работает, а рекурсивный спуск для большого количества операций становится сильно запутанным...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
28.08.2017, 01:53
Ну да. Прямая польская запись - рекурсия во время выполнения. С использованием аппаратного стека - дёшево. Плюс предельно простой и прозрачный код.

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

Компиляция выражений с приоритетами и ассоциативностью в прямую и обратную запись одинаково тривиальна. Строго тот же рекурсивный спуск, только для прямой записи вначале пишете функцию, потом аргументы, а для обратной вначале аргументы, потом функцию. AST одно и то же, просто "печатается" в другом порядке.
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
28.08.2017, 02:49
Цитата Сообщение от oomomstir
Ну да. Прямая польская запись - рекурсия во время выполнения. С использованием аппаратного стека - дёшево. Плюс предельно простой и прозрачный код.
Рекурсивный код по определению не может быть более простым и прозрачным, особенно если есть полтора десятка приоритетов и соответственно полтора-два десятка функций рекурсивно вызывающих друг друга в нужном порядке. Получил на вход число и побежал по цепочка до самого конца, потому что функция отдающая число находится именно там, потом выбрал +, а сложение ближе к началу цепочки, начинаем движение в обратную сторону... А алгоритмы на основе стека линейны, там скорее всего будет большой switch, причем приоритет операций тоже будет задаваться через switch или таблицу. На PC у меня алгоритм сортировочной станции работал быстрее рекурсивного спуска и он значительно нагляднее, а для Pymkvym явно в приоритете должна быть простота, потому что когда люди берутся писать компиляторы шансы довести это дело до чего-то осязаемого изначально не очень высоки :)
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
28.08.2017, 06:23
Спасибо всем за интересную дискуссию и информацию!
Решил начать с простого - с интерпретатора.
Вроде должно получиться.

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

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

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

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

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

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

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

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

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

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

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

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

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

ENDLOOP
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
28.08.2017, 08:34
А как создать генератор на базе mBlock (Scratch 2.0 )?
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
28.08.2017, 08:46
Создание модификации Скретч 2.0
https://ssratch.mit.edu/discuss/topys/40808/
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
28.08.2017, 15:31
Я чего подумал....
Что нам мешает за первый проход получить индексы команд и значения параметров и загнать их в оперативку?
Второй и последующие проходы гнать уже из оперативы, файл можно закрыть.
0
2 / 2 / 0
Регистрация: 06.07.2022
Сообщений: 19
06.07.2022, 20:04
В качестве встроенной "виртуальной машины", часто, можно увидеть использование для встраивания в систему Lua.
0
2 / 2 / 0
Регистрация: 06.07.2022
Сообщений: 19
08.07.2022, 18:03
Для упомянутого в треде калькулятора DM42 (STM32L476ZG ** 1024KByte FLASH, 96KByte RAM)
сделали новую RPN прошивку на Rust
https://github.com/D0ntPanic/rscalc

- Large RPN stack. The RPN stack is not limited to a fixed number of registers.
- Accurate decimal floating point. Uses 128-bit decimal floating point with 34 digits of decimal precision.
- Exact rationals with large integers. Integers and rational numbers are kept in an exact rational representation. Results can be displayed as exact fractions when possible, and the implementation never guesses the closest fraction.
- Unit conversions. Supports conversions between common units. Utilizes the rational representation for unit conversions so that converting between them leads to no loss of precision.
- RPN stack undo. Operations performed on the RPN stack can be undone with a deep undo buffer.
- Works on dedicated calculator hardware. Designed to run on the excellent DM42 from Swiss Micros. This project has been optimized for highly efficient LCD rendering and memory usage to create a very responsive interface. This project is not an emulation and iterative improvement of the HP42 design like the default firmware, but is rather a ground-up modern redesign targeting the DM42 hardware.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2022, 18:03

Виртуальная машина win xp mode. После установки сканера Mustek 1200 UB Plus виртуальная машина перестала запускаться
Здравствуйте. Проблема в чем - виртуальная машина win xp mode. после установки сканера Mustek 1200 UB Plus виртуальная машина перестала...

Стековая машина
Ребята, простой вопрос. Бинарная стековая операция к примеру ADD складывает два верхних числа и результат кладет - на вершину стека с...

Стековая машина
Здравствуйте всем. Задали задание: разработать стековую машину. По замыслу должна работать так: выбираю пункт 1 (например, 2+2), потом...

Виртуальная машина
Добрый день! Не уверен, правильно ли написал в теме. Хочу из своего компа сделать как бы два, те мой главный, второй с...

Виртуальная машина
Нужно настроить виртуальную машину под игру. Игра не запускается на виртуальных машинах, но это как-то обходят. На одном компьютере нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru