Интерпретатор Brainfuck на Bash

    В последнее время популярность эзотерического языка Brainfuck набирает обороты. Количество приложений, написанных на Brainfuck увеличивается не в арифметической, а даже в геометрической прогрессии. Очень похожая ситуация с Android.

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

    Выход оставался один — написать интерпретатор самому. Из софта были только Bash и системные утилиты.

    $ cat bf.sh
    #!/bin/bash
    C="s[0]=0; p=0;"
    while read -n1 c; do case $c in
    	\+) C="$C s[\$p]=\$((\${s[\$p]}+1));";;
    	\-) C="$C s[\$p]=\$((\${s[\$p]}-1));";;
    	\>) C="$C p=\$((\$p+1));";;
    	\<) C="$C p=\$((\$p-1));";;
    	\.) C="$C printf \\\\\$(printf '%03o' \${s[\$p]});";;
    	\,) C="$C read -n1 c; s[\$p]=\`printf '%d' \"'\$c\"\`;";;
    	\[) C="$C while [[ \${s[\$p]} > 0 ]]; do ";;
    	\]) C="$C done;";;
    esac; done < $1; 
    eval $C
    
    $ cat hello.b
    ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
    .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
    ------.--------.>+.>.
    
    $ ./bf.sh hello.b
    Hello World!
    
    Поделиться публикацией

    Комментарии 37

      +1
      От же жесть… Спасибо!!!
      Пригодится на парах… %)
        +11
        Мсье знает толк… :)
          –12
          в извращениях.
            +3
            Капитан Очевидность должен сделать в своей жизни три вещи: первую, вторую и третью. ©
          +3
          Понеслась…
          • НЛО прилетело и опубликовало эту надпись здесь
              +22
              Прирост брейнфака увеличен на 50%? =3
              • НЛО прилетело и опубликовало эту надпись здесь
                  +11
                  Слава Богу, не во всех блогах…
                  +2
                  Скорее всего Брейнфана
                +15
                Мдемс… Ну, кто напишет первый интерпретатор брейнфака на CSS? :)
                  0
                  Ну что ж вы ниже пояса бьёте. Вот DSSSL и XSL ещё имеют шансы.
                  +11
                  А можно комментарии, к скрипту?
                    +14
                    В классическим brainfuck'е можно написать brainfuck на brainfuck'e?
                      +10
                      тогда это будет реальный брейнфак О_о
                        +6
                        Да, можно. Есть готовые интерпретаторы brainfuck написанные на brainfuck.
                          +8
                          Блин, я только хотел сесть поломать голову а тут такой облом =(
                            0
                            Согласно философии, мозг надо не ломать, а «иметь».
                              +6
                              С чем Brainfuck удачно справляется! :)
                          +3
                          Да, я лично писал.
                            +2
                            Есть даже оптимизирующий компилятор awib
                              +5
                              А можно написать на брейнфаке интерпретатор баша, а дальше понятно что сделать…
                              +3
                                +1
                                Ой спасибо за линк на сайт. Иногда подобного не хватает чтобы мозг разгрузить.
                                Еще юзаю fucking-great-advice.ru/ :)
                                0
                                Все-таки код немного вирвиглаз…
                                (я про баш)
                                  +4
                                  а я-то уж подумал что про брейнфак
                                  +2
                                  Интересно, написал ли кто-нибудь оптимизатор лучше, чем придумал когда-то я:

                                    +1
                                      +1
                                      Внимание! Ссылка на почту.ру, которая свою рекламу подсовывает и почему-то загружает яву. Я когда-то так делал: http://tronix286.pochta.ru/brainfk/
                                        0
                                        Что? О чём вы вообще?
                                          +1
                                          Это он не про вашу ссылку, а про свою )
                                            0
                                            У вас оптимизации очень простые и их мало, а я спрашивал написал ли кто-то лучше.
                                        +1
                                        «Brainf*ck» :)
                                      –3
                                      Я в брейнфаках не силен, но интерпретатор выглядит симпотично.
                                        +3
                                        От слова «потный»?
                                        0
                                        Чтобы полностью соответствовать «классическому» Brainfuck'у по части переменных (возможные значения — 0..255, по остатку от 256) надо сделать примерно так:
                                        #!/bin/bash

                                        C="s[0]=0; p=0;"
                                        while read -n1 c; do case $c in
                                        \+) C="$C s[\$p]=\$((\${s[\$p]}+1));";
                                        C="$C if [ \${s[\$p]} -eq 256 ];then s[\$p]=0;fi;";;
                                        \-) C="$C s[\$p]=\$((\${s[\$p]}-1));";
                                        C="$C if [ \${s[\$p]} -eq -1 ];then s[\$p]=255;fi;";;
                                        \>) C="$C p=\$((\$p+1));";;
                                        \<) C="$C p=\$((\$p-1));";;
                                        \.) C="$C printf \\\\\$(printf '%03o' \${s[\$p]});";;
                                        \,) C="$C read -n1 c; s[\$p]=\`printf '%d' \"'\$c\"\`;";;
                                        \[) C="$C while [[ \${s[\$p]} > 0 ]]; do ";;
                                        \]) C="$C done;";;
                                        esac; done < $1;
                                        eval $C
                                          0
                                          еще и номера ячеек. их 3000, поэтому нумерация от 0 до 2999:
                                          #!/bin/bash

                                          C="s[0]=0; p=0;"
                                          while read -n1 c; do case $c in
                                          \+) C="$C s[\$p]=\$((\${s[\$p]}+1));";
                                          C="$C if [ \${s[\$p]} -eq 256 ];then s[\$p]=0;fi;";;
                                          \-) C="$C s[\$p]=\$((\${s[\$p]}-1));";
                                          C="$C if [ \${s[\$p]} -eq -1 ];then s[\$p]=255;fi;";;
                                          \>) C="$C if [ \$p -eq 2999 ];then p=-1;fi;";
                                          C="$C p=\$((\$p+1));";;
                                          \<) C="$C if [ \$p -eq 0 ];then p=3000;fi;";
                                          C="$C p=\$((\$p-1));";;
                                          \.) C="$C printf \\\\\$(printf '%03o' \${s[\$p]});";;
                                          \,) C="$C read -n1 c; s[\$p]=\`printf '%d' \"'\$c\"\`;";;
                                          \[) C="$C while [[ \${s[\$p]} > 0 ]]; do ";;
                                          \]) C="$C done;";;
                                          esac; done < $1;
                                          eval $C


                                          простите мою «кривоту», но в sh не мастер.

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое