Codebits
that rock!

Jan 18, 2013

Befunge: first steps

posted by varnie • Tags: • Show comments

Буду краток. Поковырялся с ужасным эзотерическим языком Befunge, в итоге разродился простой программкой, выводящей числа от 1 до 10 (да-да, это не так просто сделать, как кажется!). Фантастика, но это работает.

Программка:

1: v     : <

   5
   2
   *
   `
@  _ :.:1+ ^

Вывод: <p class="terminal"> 1 2 3 4 5 6 7 8 9 10 </p>

>updated: Теперь перепишем то же самое, но немного усложним - величину, до которой выводить значения, будем запрашивать у юзера. Реализация:

&11p  1: v   :   <
         1
         1
         g
         
         `       
      @  _ :.:1+ ^

Вывод: <p class="terminal"> Befunge-93 Interpreter/Debugger v2.23 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 </p>

Т.е запросили выводить до 20; вывод корректный.

Теперь затрону такую офигенную фишку Befunge как возможность самомодификации, которая встроена в сам язык(!). Это реализуется командами p и g. Первая пушит в код программы по указанным на стеке координатам x и y ASCII значение (пример использования: “101p” - пишет ASCII символ, соответствующий единице по координатам x=0, y=1.). Вторая инструкция получает значение по координатам и пушит его на вершину стека.

А вот простенький пример самомодификации на Befunge:

52*5*80p1.@

Несмотря на то что в коде явно прописано вывести на экран 1, выведется 50. Разберем подробнее:

Сначала на стек ложится 5 и 2. Берутся эти числа, перемножаются, и результат ложится на вершину стека. Имеем 10.

На вершину стека ложится 5. Далее опять перемножение (уже 10 и 5), что дает 50; результат опять ложится на вершину стека. Имеем 50.

Далее на стек ложатся последовательно 8 и затем 0. Имеем 50, 8, 0.

Далее команда p пишет ASCII значение 50 (т.е двойку) на место инструкции с координатами (0,8) затирая собой находящуюся там единичку:)

Далее значение лежащее на стеке выводится на экран и программа завершает свою работу. В итоге выводится 2, а не 1!

Начало положено, далее что-нибудь еще напишу в свободное время.


blog comments powered by Disqus
Fork me on GitHub