Comments 22
Напомнило молодость, МК-61 и FORT :)
К сожалению, автор пошел по стопам Дениса Попова и тупо содрал чужие исходники. Когда афера раскрылась, он потерялся для общества.
Очень жаль. Мне казалось, он подает большие надежды.
Очень жаль. Мне казалось, он подает большие надежды.
Opcode::SubAssign(n) => {
let mut value = self.pop();
value += n;
self.stack.push(value);
}
У тебя тут баг
Что будет, если в стеке не окажется нужного количества значений?
> let value = self.pop() — self.pop();
А в Rust так можно? Если мне не изменяет память, в C++ порядок вычисления аргументов был неопределён, так что результат мог оказаться с противоположным знаком.
А в Rust так можно? Если мне не изменяет память, в C++ порядок вычисления аргументов был неопределён, так что результат мог оказаться с противоположным знаком.
Как насчет примера реализации цикла? К примеру, для вычисления факториала или чисел фибоначчи?
Олег, если нужна скорость, почему Rust, а не Си?
ча и ща пишем через а.
Я бы порекомендовал реализовать примитивные базовые (не пересекающиеся между собой) операции, необходимые для написания любого интерпретатора (ну хотя бы тот же брейнфак). Так, операции AddAssign и SubAssign являются лишними, но не хватает операции Assign.
Далее, как уже было замечено, сильно не хватает операций ветвления (условия, переходы), чтобы можно было написать нелинейный код. Конечно, для этого потребуется понятие адресации (абсолютной и\или относительной, возможно, меток) — интересно, какой подход выбрали (бы) Вы.
И последнее: всё описанное с легкостью реализуется на любом ЯП, не только Rust, но и C\C++, Java\C#, Python\Ruby etc.
Далее, как уже было замечено, сильно не хватает операций ветвления (условия, переходы), чтобы можно было написать нелинейный код. Конечно, для этого потребуется понятие адресации (абсолютной и\или относительной, возможно, меток) — интересно, какой подход выбрали (бы) Вы.
И последнее: всё описанное с легкостью реализуется на любом ЯП, не только Rust, но и C\C++, Java\C#, Python\Ruby etc.
И еще, по поводу интерпретаторов: виртуальная машина — только первый шаг, потребуется также реализовать парсер+лексер для выбранной грамматики — что по себе очень серьезная задача, особенно если писать самостоятельно (и чем дальше от семантики ассемблера, тем сложнее).
Поэтому зачастую проще взять существующую ВМ, сторонний парсер+интерпретатор, и только написать для этого парсера понятную ему грамматику.
Либо (если похожий язык есть, но нужно его расширить\изменить) — можно написать транспилер в целевой язык и положиться на свойства платформы этого языка. Этот способ привлекателен тем, что сам транспилер не обязан быть быстрым, многие конструкции просто перенести 1:1, и реализовать его можно хоть налюбимых регулярках.
Для языка Си как основы вообще может оказаться достаточным применение макросов и его препроцессора
Поэтому зачастую проще взять существующую ВМ, сторонний парсер+интерпретатор, и только написать для этого парсера понятную ему грамматику.
Либо (если похожий язык есть, но нужно его расширить\изменить) — можно написать транспилер в целевой язык и положиться на свойства платформы этого языка. Этот способ привлекателен тем, что сам транспилер не обязан быть быстрым, многие конструкции просто перенести 1:1, и реализовать его можно хоть на
Для языка Си как основы вообще может оказаться достаточным применение макросов и его препроцессора
Решил в рамках разминки слегка добавить коду из статьи идиоматичности, и в итоге так увлёкся, что аж жалко стало выбрасывать. Поэтому предлагаю вашему вниманию несколько альтернативную имплементацию ровно той же машины, что описал автор:
https://gist.github.com/mexus/0dbdf5af2367719c00bb70c5288d9cc9
P.S.
Дабы запихнуть всё в один файл нагородил mod
'ов, в реальной жизни всё их содержимое конечно ушло бы в отдельные файлы.
«ча и ща пишем через а.»
Можно просто так минусовать и ничего за это не будет?
Спрашиваю для самообразования.
Можно просто так минусовать и ничего за это не будет?
Спрашиваю для самообразования.
Sign up to leave a comment.
Пишем стэковую виртуальную машину на Rust'e