]]> ]]>

Hanoi Love

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

Этот интерпретатор является единственной реализацией языка Hanoi Love, написанной его автором и выпущенной 30 апреля 2001 года. Интерпретатор написан на QuickBASIC и распространяется в виде исходного кода. Интерпретатор читает код программы на Hanoi Love из файла, задаваемого в виде параметра, после чего обмен информацией с программой выполняется через потоки стандартного ввода-вывода программы-интерпретатора.

Примеры:

Hello, World!:

Пример для версий Hanoi Love

Этот пример является фактически переводом примера на Brainfuck. Все стеки пусты, и все вычисления проводятся в регистре. Стек A используется как источник константы 1: поскольку он пуст, примененная к нему операция pop возвращает значение 1. Таким образом, команды ; и backtick становятся командами “увеличить значение в регистре на 1” и “уменьшить значение в регистре на 1”, соответственно, и эквивалентны командам + и - на Brainfuck. Пара команд "' записывает содержимое регистра в стандартный поток вывода, и эквивалентна команде . на Brainfuck.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; "'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; "'
;;;;;;; "'
"'
;;; "'
``````````````````````````````````````````````````````````````````` "'
```````````` "'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; "'
;;;;;;;;;;;;;;;;;;;;;;;; "'
;;; "'
`````` "'
```````` "'
``````````````````````````````````````````````````````````````````` "'

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

Пример для версий Hanoi Love

В примере используется итеративное определение чисел Фибоначчи.

Стек A большую часть времени пуст и используется для получения константы 1; иногда используется для временного хранения значений (по тому же принципу, что и в оригинальной задаче о Ханойских башнях). Стек B содержит символы, выводимые на печать (запятую и пробел) и два последних числа Фибоначчи из вычисленных программой. Стек C содержит значение 1 для каждого числа Фибоначчи, которое нужно напечатать (в данном случае шесть единиц для печати 6 чисел).

На каждой итерации одно число извлекается из стека C. Если оно положительно (т.е. нужно вычислить и напечатать еще одно число Фибоначчи), верхнее число f2 из стека B извлекается, преобразуется в ASCII-код соответствующей цифры и выводится на печать вместе с запятой и пробелом. После этого следующее число f1 извлекается из стека B и прибавляется к числу f2. Наконец, числа f2 и f1+f2 возвращаются в стек B. Низкоуровневое описание примера приводится в комментариях.

Интерпретатор Hanoi Love использует переменные типа byte для хранения значений в регистре и стеках, поэтому принципиально возможно вычислить только первые 13 чисел Фибоначчи. В действительности пример выводит только первые 6 чисел Фибоначчи, чтобы не усложнять программу печатью двух- и трехзначных чисел (которая выполняется по тому же принципу, что и в Brainfuck, но сложнее).

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .'                   B (space) regr = ASCII for space
...;;;;;;;;;;;;.'                                     B (space comma) reg = ASCII for comma
...,                                                  A (empty) reg = 1
..''''''                                              C (6 ones for 6 numbers to print) reg = 1
..`.'...;.'                                           B (space comma 0 1) reg = 1
.,                                                    C (pop number to reg) reg = 1
.'...                                                 D (remembered this place)
:                                                     if this number is positive print top number in B and move to next Fibonacci number
...,                                                  B (space comma f1) reg = f2
.'                                                    C (f2) reg = f2
..;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; "' A (empty) reg = f2 in ASCII (printed)
.,                                                    B (space comma) reg = f1
.'                                                    C (f2 f1) reg = f2
..., "'                                               B (space) reg = comma (printed)
.'                                                    C (f2 f1 comma) reg = comma
..., "' '                                             B (space) reg = space (printed)
.,...'                                                B (space comma) reg = comma
.,                                                    C (f2) reg = f1
..'                                                   A (f1) reg = f1
..,                                                   C (empty) reg = f2
...'                                                  B (space comma f2) reg = f2
...;                                                  A (empty) reg = f1+f2
.'                                                    B (space comma f2 f1+f2)
.,                                                    C (pop number to reg)
.,                                                    D (get previous command location)
!
...,,,...;; "' "' "'                                  pop everything from B and convert comma to point (printed three times)

Комментарии

]]>

blog comments powered by Disqus

]]>

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