Digs - Персональная территория

Авторский проект Артема Глазкова
? 
        Версия для печати (цвет)  

Brainfuck Labs

  Документация

Язык BFLabs является расширением языка Brainfuck.

Brainfuck
    Имеется упорядоченный набор ячеек, размер ячейки один байт. Brainfuck состоит из восьми команд, каждая из которых записывается одним символом. Исходный код представляет собой последовательность этих символов, без какого-либо дополнительного синтаксиса.

Команды

  > перейти к следующей ячейке
  < перейти к предыдущей ячейке
  + увеличить значение в текущей ячейке на 1
  - уменьшить значение в текущей ячейке на 1
  . напечатать символ с кодом из текущей ячейки
  , запросить извне символ и сохранить его код в текущей ячейке
  [ если значение текущей ячейки нуль, перейти вперёд по тексту программы на команду, следующую за соответствующей «]» (с учётом вложенности)
  ] если значение текущей ячейки не нуль, перейти назад по тексту программы на команду, следующую за соответствующей «[» (с учётом вложенности)

    Любые другие символы не считаются ошибкой синтаксиса, а просто игнорируются.
    Более подробно можно почитать здесь.

Brainfuck Labs
    Имеется двухмерное неограниченное поле, состоящее из клеток. Новая команда «#» предназначена для прогрызания прохода в этом поле на один шаг в определенном направлении. Чтобы между лежащими рядом проходами существовала стенка, один шаг равен двум клеткам.
    В BFLabs сделана двухпоточность. Т.е. на самом деле составляются две программы, которые выполняются параллельно. Команда из первого потока, команда из второго, потом опять из первого и так далее. За каждым потоком закреплен вектор, в направлении которого происходит прогрызание. Изначально для первого потока вектор (1,0), для второго (0,1). Т.е. следующая программа построит лесенку.

1: ####
2: ####

    Если в каком-то потоке закончились операторы, то выполнение становится однопоточным. Это значит, что программа может быть изначально составлена только для одного потока.
    Помимо «#» есть еще две команды, которые управляют направлением прогрызания.

  @ разворачивает оба вектора на 90 градусов против часовой стрелки
  | команда, данная из одного потока, разворачивает вектор другого потока на 180 градусов

    Еще две команды, это фигурные скобки («{» и «}»). Это своеобразная глобальная критическая секция. Открытая фигурная скобка заставляет остановиться другой поток и ждать, пока в текущем потоке не появится закрывающая фигурная скобка.
    В заключение следует сказать, что у каждого потока свой указатель ячеек. Т.е. в один и тот же момент потоки могут работать с разными ячейками.
    Вот и весь язык.

Пример (расческа)

1: {###++++}[#-]
2: [{##@@##@@}]

    Вначале первый поток блокирует второй, затем сдвигается на три шага и увеличивает первую ячейку на четыре. Так как, оба потока используют одну область ячеек, цикл во втором потоке будет выполняться, пока не закончится выполнение цикла в первом. Первый делает четыре шага вперед. За каждый шаг второй, путем блокирования, сдвигается на два шага в своем направлении и возвращается на исходную позицию.

Немного о среде программирования
    Основная часть окна разделена на два блока. Слева вводятся команды, справа видим результат. Блок команд имеет для каждого потока поле ввода команд и поле ввода данных, подаваемых команде «,».
    Блок результатов содержит две закладки: лабиринт и консоль.

Хранение программы
    В кругу писателей интерпретаторов для Brianfuck принято использовать символ «!» для разделения программы и данных для оператора «,». Например:

,[.,]!Hello world!

    Это один поток. Он записывается в файл как есть. Если потока два, то перед каждым потоком ставится его номер и двоеточие.


© 2005-16, Powered By Digs (Написать письмо, vk)