powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Виртуальный ассемблер для виртуальной стековой машины.
25 сообщений из 98, страница 2 из 4
Виртуальный ассемблер для виртуальной стековой машины.
    #39148454
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronEolt,
мне тоже сразу на память пришла реализация ФОРТА. Ты пока этот совет упорно игнорируеш. Посмотри на язык - очень интересная и мощная штука. Говорять есть даже реализации на уровне железа.

Я уже посмотрел форт. Язык очень похож на MSIL и байткод JVM. Но я не нашел реализации в исходниках на Си, а если ее нет.
То встроить в свой проект форт не получится.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148566
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltЧего то совсем не ясно. Что даже два числа не можем сложить? Можем ведь. И никаких инструкций касающхся аккумулятора нет.

Код: plaintext
1.
2.
3.
4.
PUSH 1 ; кладем 1 на вершину стека
PUSH 2 ; кладем 2  на вершину стека
ADD ; команда снимает две константы со стека и кладе результ на стек
POP ; снимает результат со стека. Стек чист


Ты что, не понял, что ты в команде ADD выполнил доступ ко ВТОРОМУ значению стека на момент исполнения команды? Хотя я говорил - доступ имеется только к вершине.
Если есть доступ к элементу НЕ на вершине - это ни хрена не стек.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148571
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaТы что, не понял, что ты в команде ADD выполнил доступ ко ВТОРОМУ значению стека на момент исполнения команды?

С какого бодуна это я получил доступ ко второму элемента стека?
Команда ADD это по сути макрос из 2 команд POP и команды PUSH
На псевдоязыке выгляди так:

ADD{
int var1=Stack.Pop;
int var2=Stack.Pop;
Stack.Push (p1 + p2);
}
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148572
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На гитхабе нашел пару виртуальных ассемблеров:

https://github.com/nkottary/vm
https://github.com/niccaluim/tinyvm

думаю на основе их вполне можно сделать что-то свое, так что видимо вопрос закрыт)
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148574
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C ошибкой написал пример, но думаю все равно понятно:

Код: plaintext
1.
2.
3.
4.
5.
ADD{
   int var1=Stack.Pop; 
   int var2=Stack.Pop;
   Stack.Push (var1+ var2);
}
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148595
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltЯ уже посмотрел форт. Язык очень похож на MSIL и байткод JVM. Но я не нашел реализации в исходниках на Си, а если ее нет.
То встроить в свой проект форт не получится.
На C нормальные люди Forth не делают. Т.к. это по сути среда выполнения совмешенная с компилятором. Слова (процедуры) низкого уровня реализуют на Asm и уже через них, реализуют все остальные слова языка. Фактически определяют на Asm слово : и ; и базовые Asm'инструкции. После чего, все остальные элементы языка уже реализуют на Forth.

Делать Forth компилятор на C банально НЕ удобно.

Можно посмотреть любую реализацию на Asm и подумать, как добавить интеграцию со своим проектом. В первую очередь - обеспечить безопасную среду исполнения.

Но не очень понятно, желание иметь стеково-подобный язык. Проще, найти библиотеку более-менее нормального скриптового языка. IMHO
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148628
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНо не очень понятно, желание иметь стеково-подобный язык.

Высокая скорость работы байт-кода. При правильной реализации всего на 15-20% медленнее чем машинный x86-64 код.
А если архитектура процессора поддерживает аппаратные стеки, то и на уровне машинного.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148638
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНо не очень понятно, желание иметь стеково-подобный язык. Проще, найти библиотеку более-менее нормального скриптового языка. IMHO
Насколько я понимаю, интерес автора чисто академический. И возможности он заказывает
минимальные.

Как другая крайность - 8 элеметарных команд и лента символов. Тьюринг-полная машина.

Или Кнут-овский гипотетический процессор со своим ассемблером.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148640
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltAkinaТы что, не понял, что ты в команде ADD выполнил доступ ко ВТОРОМУ значению стека на момент исполнения команды?

С какого бодуна это я получил доступ ко второму элемента стека?
Команда ADD это по сути макрос из 2 команд POP и команды PUSH
На псевдоязыке выгляди так:

ADD{
int var1=Stack.Pop;
int var2=Stack.Pop;
Stack.Push (p1 + p2);
}

Зачем усложнять ?

Я вам выше уже пытался сказать , что с таким подходом
вы будете создавать пролемы себе и тем кто это будет читать, отлаживать рефакторить.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148641
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltLeonid KudryavtsevНо не очень понятно, желание иметь стеково-подобный язык.

Высокая скорость работы байт-кода. При правильной реализации всего на 15-20% медленнее чем машинный x86-64 код.
А если архитектура процессора поддерживает аппаратные стеки, то и на уровне машинного.

По сравнению с чем ?

ИМХО
Как только вы начнете работать с мутексами
многопоточностью и сетевыми сокетами
у вас все выровняется с кодом на С/С++ Java, erlаng...
разница будет на уровне статистической
погрешности.


зы Кстате может вы в сторону erlаng посмотирте ....
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148680
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему бы просто LLVM не задействовать?
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148739
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltКоманда ADD это по сути макрос из 2 команд POP и команды PUSH
Кто-то просил нижний уровень... значит, эта команда НЕ НУЖНА. Вообще. Потому что она реализуется последовательностью команд нижнего уровня.
EoltНа псевдоязыке выгляди так:

ADD{
int var1=Stack.Pop;
int var2=Stack.Pop;
Stack.Push (var1 + var2);
}
У тебя целых два аккумулятора - var1 и var2. А ты говорил - ни одного.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148770
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРЗачем усложнять ?


Я наоборот упрощаю.

Изопропилпочему бы просто LLVM не задействовать?

это что-то большое, сложное и требующее много времени на изучение

AkinaКто-то просил нижний уровень...

Просил нижний уровень виртуальной машины. С точки зрения ее логики это самая низкоуровневая команда, ниже ее она ничего не знает.

авторзначит, эта команда НЕ НУЖНА. Вообще. Потому что она реализуется последовательностью команд нижнего уровня.


Разумеется нужна. Иначе как ВМ будет складывать числа в стеке.

EoltУ тебя целых два аккумулятора - var1 и var2. А ты говорил - ни одного.

Нет здесь аккумуляторов. А есть виртуальный микрокод команды ADD. На х86 процах он будет один, на КР580 другой, а на каком-нибудь стековом FORTH_SHIP вообще заменится вызовом аппаратной команды процессора.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148774
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eoltэто что-то большое, сложное и требующее много времени на изучение
на коленке ваять стековую машину - быстро не выйдет.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148778
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После чтения документации по-стековым машинам и форту, удалось сформировать
вот такой минимальный список команд работы со стеком:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
PUSH   - поместить значение в стек
POP     - удалить значение с вершины стека
DUP     -  сделать копию верхнего элемента стека
SWAP    - обмен местами 2 верхних параметров в стеке
ROT     - циклически переставляет 3 верхних элемента в стеке по-часовой стрелке
OVER    - продублировать на вершину второй элемент стека
PICK    - дублирует n-ый элемент стека на вершину
ROLL    - циклически переставляет n-верхних элементов в стеке по-часовой стрелке
RVALUE - поместить в стек содержимое объекта, адрес которой лежит на вершине стека
LVALUE - поместить в стек адрес в памяти, по которому расположен объект лежащий на вершине стека
LET    - rvalue-значение на вершине стека размещено по адресу предоставленному lvalue- значением, следующим за ним в стеке



Этого более чем достаточно, чтобы реализовать все мыслимые операции со стеком.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148793
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltЭтого более чем достаточно, чтобы реализовать все мыслимые операции со стеком.
а что с типами данных?
что за адреса ?
как дела с очисткой стека при возврате и обработке исключений?
через какую задницу параметры предполагается извлекать?
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148841
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

нужны команды для арифметики в стеке, управление памятью, ветвления, вызовы нативных функций и т.д.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148865
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltПосле чтения документации по-стековым машинам и форту, удалось сформировать
вот такой минимальный список команд работы со стеком:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
PUSH   - поместить значение в стек
POP     - удалить значение с вершины стека
DUP     -  сделать копию верхнего элемента стека
SWAP    - обмен местами 2 верхних параметров в стеке
ROT     - циклически переставляет 3 верхних элемента в стеке по-часовой стрелке
OVER    - продублировать на вершину второй элемент стека
PICK    - дублирует n-ый элемент стека на вершину
ROLL    - циклически переставляет n-верхних элементов в стеке по-часовой стрелке
RVALUE - поместить в стек содержимое объекта, адрес которой лежит на вершине стека
LVALUE - поместить в стек адрес в памяти, по которому расположен объект лежащий на вершине стека
LET    - rvalue-значение на вершине стека размещено по адресу предоставленному lvalue- значением, следующим за ним в стеке



Этого более чем достаточно, чтобы реализовать все мыслимые операции со стеком.
Еще кину 5 копеек.

JVM Spec определяет еще несколько экзотических
2.11.6 Operand Stack Management Instructions
A number of instructions are provided for the direct manipulation of the operand
stack: pop, pop2, dup, dup2, dup_x1, dup2_x1, dup_x2, dup2_x2 , swap.
Например dup2_x2 :
Стек: (4,3,2,1)
После использования : (2,1,4,3,2,1)
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148870
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltНет здесь аккумуляторов. А есть виртуальный микрокод команды ADD.
На х86 процах он будет один, на КР580 другой, а
на каком-нибудь стековом FORTH_SHIP вообще заменится вызовом аппаратной команды
процессора.

Хочется внести фнудаментальную терминологическую ясность
и отделить мух от колет..

С унарными операторами все ясно.

Как быть с бинарными опрациями ?
x=y+z

и опционально с классическими С-шныму словиями вида ?: ?
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148872
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eoltуправление памятью
подробнее с этого места

PS диагноз - не взлетит
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148876
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltИзопропил,

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


В классическом случае стек памятью никак не управляет,
кроме указателя на вершину, которая лежит в специальном стековом регистре,
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148929
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonJVM Spec определяет еще несколько экзотических
2.11.6 Operand Stack Management Instructions
A number of instructions are provided for the direct manipulation of the operand
stack: pop, pop2, dup, dup2, dup_x1, dup2_x1, dup_x2, dup2_x2 , swap.
Например dup2_x2 :
Стек: (4,3,2,1)
После использования : (2,1,4,3,2,1)

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

Код: plaintext
1.
2.
pop
pop



он ее заменяет на

Код: plaintext
1.
pop2
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148937
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРКак быть с бинарными опрациями ?
x=y+z

и опционально с классическими С-шныму словиями вида ?: ?

Не понятен вопрос. В приниципе все по-тому же принципу:

x=y+z

1. кладем на стек адрес переменной z (нужно придумать команду для этой операции)
2. выполняем RVALUE (она снимает адрес с вершины стека и кладет на его место содержимое переменной z)
3. кладем на стек адрес переменной y
4. выполняем RVALUE
5. вызываем ADD (снимаются последовательно значения x,y и кладется на вершину их сумма)
6. кладем на стек адрес переменной x
7. снимаем с вершины адрес x и сумму (x+y) и копируем ее по адресу x
8. стек пуст
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39148939
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилEoltуправление памятью
подробнее с этого места

PS диагноз - не взлетит

Нужны команды запроса памяти у ОС - MEM_ALLOC
освобождение памяти - MEM_FREE
ну и копирования, со стека в память и с памяти в стек.
...
Рейтинг: 0 / 0
Виртуальный ассемблер для виртуальной стековой машины.
    #39149011
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

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

возьми за основу JVM - она достаточно простая, убери что кажется лишним
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 2 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Виртуальный ассемблер для виртуальной стековой машины.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]