]]> ]]>

Miller's Hack VM (JavaScript)

Реализация языка программирования Hack VM

Один из двух существующих интерпретаторов Hack VM, написанный его автором Adam Miller. Написан на JavaScript, и, как утверждает автор, отличается от главной реализации на Python. Интерпретатор предоставляет трассировку выполнения программы — выполненные команды и состояние стека памяти после каждой из них.

JavaScript интерпретатор Hack VM
JavaScript интерпретатор Hack VM

Примеры:

Hello, World!:

Пример для версий Miller's Hack VM (JavaScript), Miller's Hack VM (Python)

Программа работает довольно очевидным образом — ASCII-коды символов сообщения вычисляются и выводятся один за другим. Вычислять их приходится из-за того, что сразу помещать в стек можно только числа от 0 до 9, большие числа приходится комбинировать из меньших. Единственным нетривиальным приемом является обработка символа l — когда его ASCII-код вычисляется, он утраивается в стеке командой 0^ и выводится на печать два раза сразу же и один раз позднее.

89*P 45*99*+P 39*99*+0^0^PP 56*99*+P 29+4*P 48*P 92+8*1-P 56*99*+0^P 3+P P 25*0^*P 56*3+P

Числа Фибоначчи:

Пример для версий Miller's Hack VM (JavaScript), Miller's Hack VM (Python)

Этот пример использует итерацию и работает так же, как в других эзотерических языках: ячейка памяти 0 хранит оставшееся количество чисел для вычисления, ячейки 1 и 2 хранят ASCII-коды запятой и пробела, ячейки 3 и 4 — два последних рассчитанных числа Фибоначчи. В цикле извлекаются значения ячеек 3 и 4, суммируются, новое значение выводится на печать, а ячейки памяти обновляются. После этого количество оставшихся чисел уменьшается на 1, и если оно становится 0, счетчик программы (эквивалент указателя инструкций в Brainfuck) перемещается на 6 символов вперед и выходит из цикла, в противном случае он возвращается обратно к началу цикла. Наконец, выводятся три точки.

27*0> 92+4*1> 84*2> 10^p3> 1<P 2<P 10^p4> 1<P 2<P 3< 4< + 0^p 4< 3> 4> 0< 1- 0> 0<  6? 67*c 58*6+0^0^PPP

Факториал:

Пример для версий Miller's Hack VM (JavaScript), Miller's Hack VM (Python)

Этот пример очень похож на вычисление чисел Фибоначчи, только в каждой итерации приходится выводить больше символов. Поскольку тип данных имеет размер 32 бита, 13! вызывает ошибку переполнения:

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
!ERROR: integer overflow

28*0> 56*3+1> 84*2> 78*5+3> 25*4> 05> 16> 5<p1<P2<P3<P2<P6<p4<P 5<1+5> 5<6<*6> 0<1-0> 0<6? 67*c 

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам