Написание модулей на Brainfuck

Начиная, с релиза Ubilling 0.8.5 Valhalla стало возможным использовать код на Brainfuck в своих модулях.

Зачем?

Язык Brainfuck известен своим минимализмом и кроме того является Тьюринг-полным языком. Наша команда разработчиков в свою очередь считает, что изящный и в это же время функциональный синтаксис Brainfuck как нельзя лучше подходит для разработки прикладных модулей для Ubilling, и максимально соответствует его идеологии. Также мы не приемлем дискриминацию в любых ее проявлениях, и считаем, что все имеют право разрабатывать модули для Ubilling, в независимости от пола, расы, религии, половой ориентации и взаимоотношений с тяжелыми наркотиками.

Немного примеров

Подключаем интерпретатор Brainfuck из соответствующей библиотеки.

require_once('api/vendor/bf/Brainfuck.php');
$bf=new dotzero\Brainfuck();

Просто выполнение кода:

$code = '++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++.+++++++++++++.>------.+++..---.+++++.<+++++.';
$bf->setCode($code);
show_window(__('Brainfuck code execution result'), $bf->run(true));

А если нам хочется передать какие-то входные данные? Все так же очень просто:

$bf->setCode('>,[>,]<[<]>[.>]');
$bf->setInput('this is input data');
show_window('input test', $bf->run(true));

Но возможно мы хотим инкапсулировать внутрь PHP код, работать с базой и делать другие крутые вещи, например показать список пользователей в виде красивой таблички? Да сколько влезет:

$code='++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>++++++.>>---.+++++++++++..<---------.<----.>>++++++++++++++.-----------------'
        . '-------.---.----------.++++++++++++++++++++++++++++++.--------------.+++++++++++++.<++++++++++.>-------------.++++++++'
        . '+++++++.<------.>--------..<++++++++++++++++++.>++++++++.<++++++++++++++.>--.<++++++.------.>++++++++.<++++.>--------.'
        . '<-------------------------.>---.--------.++.+++++.+++++.<<++++++++.+.>-----------------.<---------.>>.-----------.++++'
        . '+++.++++++++.------------------------.++++++++++++++++++++++++.--------------.+++++.----------.+++++++++++.++++++++.<<+'
        . '+++++++.>>------------------------..<<.-.>>----------.++++++++++++++++++++++++++++++.--------------.+++++++++++++.+.<<'
        . '-------.>>-------.---.++++++++++.+.<<+++++++.++.+++.------------..>>+++.------------------.---.---.----------.++++++++'
        . '++++++++++++++++++++++.--------------.+++++++++++++.<++++++.>..-----------------.++++++++++++++++++++++++.<++++++++++++'
        . '++++++.>-----------------.+++++++.++++++++.<++++++++++++++++++.>-----.<<++++++++.----.>----.>------..<<+++++..+++++++++'
        . '+++++++++.';
$bf->setCode($code);
$bf->execute();

Ну и собственно результат:

Памятка по синтаксису

Весь синтаксис, состоит аж из 8-ми операторов:

  1. > Перейти к следующей ячейке
  2. < Перейти к предыдущей ячейки
  3. + Увеличить значение в текущей ячейке на 1
  4. - уменьшить значение в текущей ячейке на 1
  5. . напечатать значение текущей ячейки
  6. , Ввести извне значение и сохранить в текущую ячейку
  7. [ Если значение текущей ячейки - ноль, перейти вперед по тексту программы к ] с учетом вложенности
  8. ] Если значение текущей ячейки не равен нулю, перейти назад по тексту программы с [ с учетом вложенности
brainfuck.txt · Последние изменения: 2017/09/22 18:33 — nightfly
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki