Easyelectronics.ru

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

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



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

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

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

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

Да, но это может быть другой стек и другая пара команд push/pop.


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

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

Пример, для наглядности:
Код:
| 0956 | push8 7         |
| 0958 | push8 91        |
| 095A | push16 197      |
| 095E | execOpcode 19   |
| 0960 | addSP 3         |
| 0962 | pushRet         |
| 0964 | pushBPAdd 1     |
| 0966 | eval (a | b)    |
| 0968 | push8 7         |
| 096A | push8 91        |
| 096C | push16 197      |
| 0970 | execOpcode 33   | SetRifFlag(197, 91, 7, QueryRifFlag(197, 91, 7) | arg1);
| 0972 | addSP 4         |

Это я когда-то писал декомпилятор для Toonstruck, тут видно, что после вызова QueryRifFlag() корректируется SP и вызывается pushRet, который кидает на вершину стека возвращаемое значение.


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Ночью не мог уснуть (башка работала) - вроде нашел решение.
Кроме того - решений даже два.
1. - сделать язык без функций, типа Бейсика. Все переменные - глобальны и GOTO/GOSUB вместо функций.
В таком случае компиляция, как писали выше - тривиальна. Можно даже интерпретатор реализовать.
2. - делать функции, тогда при вызове функции создаем таблицу под параметры и переменные функции, и для этих таблиц делаем стек. То есть вышли из функции - вернулись в предыдущую таблицу.
При вызове заполняем таблицу параметрами функции из стека.
При этом компиляция не сильно усложняется, так как можно ввести в оптокод такие команды как "взять переменную(параметр) №X из текущей таблицы и положить на вершину стека ", "значение на на вершине стека присвоить переменной №X", "присвоить переменной №X из текущей таблицы значение Y" и т.д.


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

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

Допустим SP равен 1000 и идет вызов функции f(10, 20), тогда перед вызовом пушим оба параметра, SP станет равен 998, 10 и 20 лежат по адресам [SP + 2] и [SP + 1] соответственно. Внутри функции есть локальная переменная, если переменные объявлять в начале, то можно посчитать их количество и следовательно размер на который стек дополнительно вырастет. В данном случае указатель стека станет равен 997, локальная переменная лежит по адресу [SP+1], а 10 и 20 будут доступны по адресам [SP + 3] и [SP + 2]. И к аргументам функции и к локальным переменным доступ идет через одну пару push/pop работающих со смещением относительно SP. При выходе из функции или сразу делаем SP += 3, или добавляем только 1, по числу локальных переменных, а 2 добавляем в месте вызова функции, как я показывал ранее. Никакие таблицы хранимые на стеке тут не нужны, это такое же усложнение как добавление регистров для хранения аргументов функций.


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

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

P.S. Я понял, кажется, почему у меня со стеком сложнее - у меня сразу после операций pop/push стекпоинтер меняется, а у Вас - в самом конце функции.
Мне после каждой операции со стеком относительный сдвиг (дельту) надо менять, у Вас - нет.

Только я не пойму тогда как у вас push/pop работает?


Цитата:
И к аргументам функции и к локальным переменным доступ идет через одну пару push/pop работающих со смещением относительно SP.


Тут не очень понятно.
То есть ещё какой то внутри функци стекпоинтер со смещением?
Мы же как то операции должны выполнять, стек поинтер же должен меняться.

У меня как - задвинул два значения в стек, вызвал операцию, значения удаляются на вершине остаётся результат.
А у Вас тогда как?
Ведь если внутри функции менять "главный" стекпоинтер до все эти относительные смещения до переменных и параметров летят к чертям.
Как у Вас реализовано?
Ещё какой то "вспомогательный" стекпоинтер?


execOpcode - он не трогает SP?
Как тогда там(в обработчике оптокода) выполняются вычисления?
Уже за рамками виртуальной машины (не средствами оптокода)?

Как функции из функций вызываются у Вас - вообще непонятно!


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

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


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

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

У тебя какое-то глобальное непонимание сути происходящего :) Берем такую функцию:
Код:
void f(int a, int b, int c, int d)
{
   int la, lb, lc;
   lc = b;
.....

Если оставить нюансы оптимизации под мк, то когда это парсишь добавляешь в таблицы имена параметров и локальных переменных. Итого там будут 'a', равное 0, 'b', равное 1 и т.д., а также, по аналогии, 'la' равное 0 и далее по списку. Когда встречаешь в коде обращение к 'lс', то ищешь имя в таблице, находишь и видишь, что с ним ассоциирована 2-ка, значит адрес переменной [SP + (3-2)], где 3 - это число локальных переменных. А при обращении к 'b', которая без локальных переменных находилась бы по адресу [SP+3], т.к. аргументы в стеке расположены в обратном порядке, будет находится в [SP + 3 + 3]. Итого будет сгенерировано две инструкции, первая берет значение из [SP+6] и кидает на вершину стека, вторая берет оттуда значение и сохраняет по адресу [SP+1]. Никаких хитрых расчетов тут нет и сложность не зависит от количества параметров, переменных, функций или операций.


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Да это я понимаю!
Но как операции выполняются без изменения SP?
Как отсюда вызвать другую функцию и полученный результат добавить к b, к примеру?
Рекурсия как будет работать?


Последний раз редактировалось Pingvin 06 авг 2019, 20:21, всего редактировалось 1 раз.

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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
У меня как - задвинул два значения в стек, вызвал операцию, значения удаляются на вершине остаётся результат.
А у Вас тогда как?
Ведь если внутри функции менять "главный" стекпоинтер до все эти относительные смещения до переменных и параметров летят к чертям.
Как у Вас реализовано?
Ещё какой то "вспомогательный" стекпоинтер?

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


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

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


А я разве не о том же?
Только не просто стек, а стек с контентами функций - более удобный механизм, ИМХО.
Хотя по сути - одно и то же.


Последний раз редактировалось Pingvin 06 авг 2019, 20:48, всего редактировалось 3 раз(а).

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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Классический пример - вычисление факториала.

Во что скомпилируется и как у Вас будет работать эта функция?


Код:
   


int factorial( int n)
{
    if (n == 0 || n == 1) return 1;
    return n * factorial(n - 1);
}



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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2619
Откуда: Санкт-Петербург
Жду, когда тут изобретут стекфреймы.
Хотя, конечно, жёсткой необходимости в них нет - можно считать адреса локальных переменных и аргументов функции от SP (учитывая при кодогенерации, как он меняется).
Но если всё же задействовать BP - кодогенерация и отладка становятся заметно проще.


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
Pingvin писал(а):
Рекурсия как будет работать?

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

Pingvin писал(а):
А я разве не о том же?
Только не стек, а контент функции - более удобный механизм, ИМХО.

Я уже не уверен говорим ли мы об одном и том же :) Аргументы и локальные переменные хранятся к другом стеке потому что стековая машина постоянно указатель стека меняет и с одним стеком не получится для доступа к переменным обойтись фиксированным смещением. И это должен быть именно стек и никак иначе.


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

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

Можно, но это значительно усложнит компиляцию...

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


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Цитата:
Сложно сказать, специально поддержку рекурсии я не делал


А она и не должна быть "специальной", ИМХО.
Если правильно организовать вызов функций, рекурсия будет работать "автоматом".


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2619
Откуда: Санкт-Петербург
Pingvin, на некоторых архитектурах "правильно организовать" дорого (например, если нет базовой адресации). Помнится, на 8080 пользовался я компилятором Паскаля, в котором рекурсию надо было разрешать прагмой компилятора.


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Reflector писал(а):
aamonster писал(а):
Хотя, конечно, жёсткой необходимости в них нет - можно считать адреса локальных переменных и аргументов функции от SP (учитывая при кодогенерации, как он меняется).

Можно, но это значительно усложнит компиляцию...


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

То есть в той же функции факториала параметр n будет всегда под одним и тем же индексом на любом уровне вложенности, и будет работать одна и та же инструкция оптокода для обращения к нему с одним и тем же параметром (индексом).

Различными будут только контенты, раположенные в стеке.
Контенты так же будут создаваться/удалятся посредством инструкций оптокода.
В каждом следующем эта самая n будет на единицу меньше.
То есть упрощенно стек (контентов) будет выглядеть так (считаем факториал 10)
10,
9,
8,
7,
6,
5,
4,
3,
2,
1


Последний раз редактировалось Pingvin 06 авг 2019, 21:50, всего редактировалось 7 раз(а).

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

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

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


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Так я и делаю стек!
Только переменные и параметры каждой функции будут хранится в специальной


Show структуре.



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


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

Зарегистрирован: 12 июн 2018, 15:04
Сообщения: 350
Билдил LUA на ARM'овые МК. Отличный декодер скриптов! Можно виртуальные компьютеры создавать с несуществующей архитектурой!

LUA очень C-подобен, часть лексем я доработал (типа ++ и другие). Вышло хорошо. Идеально для окучивания гарвардских контроллеров, коими являются ATmega. Коды программ держим на SD карте. API прийдётся сочинять (для взаимодействия с периферией). Всё как в пико-факе(pico-8) :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Виртуальная стековая байт-машина
СообщениеДобавлено: 16 авг 2019, 08:53 
Заглядывает иногда

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 199
Извините если что не так, рискну спросить: а почему не хотите реализовать машину для исполнения такого кода (страница 725)?
https://drive.google.com/open?id=16UB-x7x-T6-HmLRL4VBKyYhPKSgGI6rd


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

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1432
Pingvin, вот то, что ты хочешь - http://svn.clifford.at/embedvm/trunk/
И уже с компилятором
Но вообще, имхо, фигнёй оверинжинирингом маешься, два года уже и конца не видно )
Лучше б добавил для пользовательской программы отдельный маленький дешёвый мк с usb бутлоадером
https://www.youtube.com/watch?v=a3XSIRkeubE


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Наверно фигней маюсь, но явно не бесполезно.
Во первых - результат есть.
Виртуальная машинкa работает на МК и даже две запускал в разных потоках.
Уже сообразил как построить механизм вызова функций (будет работать и рекурсивный вызов).

Во вторых - это ещё вопрос самообразования.

Я честно пытался поднять LUA или PAWN, но пока не понял, как это сделать.
И главное - мне нужно взоимодействие с моей прошивкой, с моими функциями и переменными.
Вроде и в LUA и в PAWN это можно сделать, но тоже как то не очень просто.
А переписывать всю прошивку на скриптах - нафиг оно не надо!

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

Я бы разбил проблему на несколько задач.
1. движёк виртуальной машины (уже работает, готов на 90%).
2. определиться с оптокодом, какие операции нужны. У меня это происходит "по ходу..."
3. парсер и компилятор - самая сложная часть, ИМХО


Давайте замутим открытый движёк виртуальной машинки!
Я выложу код, если кому интересно, только сильно не пинайте!

А уж оптокодов можно напридумывать всяких и подключать их в виде библиотек.


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


Никаких 2 года я за виртуалькой не сидел, максимум потратил несколько дней.
Просто занимаюсь от случая к случаю, вот в отпуске вернулся к теме.


Последний раз редактировалось Pingvin 16 авг 2019, 16:24, всего редактировалось 2 раз(а).

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

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 199
Цитата:
2. определиться с оптокодом, какие операции нужны.

Я выше как раз тебе и предложил систему команд. Это команды ПЛК от Мицубиси, требующие стэк-ориетированной ВМ.
Цитата:
3. парсер и компилятор - самая сложная часть, ИМХО

Опять там же: начни с IL. Реализовать ассемблер для IL, по-моему, вполне решаемая задача.


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

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3287
Pingvin писал(а):
Я честно пытался поднять LUA или PAWN, но пока не понял, как это сделать.
И главное - мне нужно взоимодействие с моей прошивкой, с моими функциями и переменными.
Вроде и в LUA и в PAWN это можно сделать, но тоже как то не очень просто.

вот в луа это как раз делается самым простым образом, как добавление функций доступных скрипту, так и наоборот, доступ до состояния ВМ из основной программы.


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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