Зміст

Написання модулів на 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. ] Якщо значення поточної комірки не дорівнює нулю, перейти назад за текстом програми до [ з урахуванням вкладеності