Колба
Добро пожаловать на форум! rss 29 Апрель 2024, 03:23:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
На правах рекламы
   Начало   Линейки Помощь Войти Регистрация  
Органический скраб
Страниц: [1]
  Печать  
Автор Тема: Brainfuck  (Прочитано 7464 раз)
KnightMirko
Global Moderator
*****
Пол: Мужской
Сообщений: 200



« : 20 Февраль 2009, 14:01:19 »

А вы знали о таком языке программирования? Веселый

Brainfuck (англ. brain мозг + fuck) — один из известнейших эзотерических языков программирования, придуман Урбаном Мюллером (нем. Urban Müller) в 1993 году для забавы. Язык имеет восемь команд, каждая из которых записывается одним символом. Исходный код программы на Brainfuck представляет собой последовательность этих символов без какого-либо дополнительного синтаксиса.

Одним из мотивов Урбана Мюллера было создание языка с как можно меньшим компилятором. Отчасти он был вдохновлен языком FALSE, для которого существовал компилятор размера 1024 байта. Существуют компиляторы языка Brainfuck размера меньше 200 байт. Программы на языке Brainfuck писать сложно, за что его иногда называют языком для мазохистов. Но при этом важно отметить, что Brainfuck является вполне естественным, полным и простым языком и может использоваться при определении понятия вычислимости.

Машина, которой управляют команды Brainfuck, состоит из упорядоченного набора ячеек и указателя текущей ячейки, напоминая ленту и головку машины Тьюринга. Кроме того, подразумевается устройство общения с внешним миром (см. команды . и ,) через поток ввода и поток вывода.

Язык Brainfuck можно описать с помощью эквивалентов языка Си (предполагается, что переменная p объявлена как указатель на байт):

Команда Brainfuck
>
<
+
-
.
,
[
]
Эквивалент на Си
++p;
--p;
++*p;
--*p;
putchar(*p);
*p = getchar();
while (*p) {
}
Описание команды
перейти к следующей ячейке
перейти к предыдущей ячейке
увеличить значение в текущей ячейке на 1
уменьшить значение в текущей ячейке на 1
напечатать значение из текущей ячейки
ввести извне значение и сохранить в текущей ячейке
если значение текущей ячейки нуль, перейти вперёд по тексту программы на ячейку, следующую за соответствующей ] (с учётом вложенности)
если значение текущей ячейки не нуль, перейти назад по тексту программы на ячейку, следующую за соответствующей [ (с учётом вложенности)

Несмотря на внешнюю примитивность, Brainfuck с бесконечным набором ячеек имеет тьюринговскую полноту, а, следовательно, по потенциальным возможностям не уступает «настоящим» языкам, подобным Си, Паскалю или Java.

Brainfuck подходит для экспериментов по генетическому программированию из-за простоты синтаксиса, и, соответственно, генерации исходного кода.

В «классическом» Brainfuck, описанном Мюллером, размер ячейки — один байт, количество ячеек 30 000. В начальном состоянии указатель находится в крайней левой позиции, а все ячейки заполнены нулями. Увеличение/уменьшение значений ячеек происходит по модулю 256. Ввод/вывод также происходит побайтно, с учётом кодировки ASCII (то есть в результате операции ввода (,) символ 1 будет записан в текущую ячейку как число 0x31 (49), а операция вывода (.), совершённая над ячейкой, содержащей 0x41 (65), напечатает латинскую А). В других вариантах языка размер и количество ячеек может быть другим (бо́льшим). Есть версии, где значение ячеек не целочисленно (с плавающей точкой).

Пример программы

Программа на языке Brainfuck, печатающая «Hello World!»:

Код:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.

Разбор программы:

++++++++++
[
>+++++++
>++++++++++
>+++
>+
<<<<-
]
присваивание ячейке 0 (счетчику) значения 10
повторять, пока значение текущей ячейки (ячейки 0) больше нуля
приращение ячейки 1 на 7
приращение ячейки 2 на 10
приращение ячейки 3 на 3
приращение ячейки 4 на 1
возврат к ячейке 0 (счетчику), и его уменьшение на 1
вернуться к началу цикла

Получение кодов букв и их вывод:

>++.
>+.
+++++++..
+++.
>++.
<<+++++++++++++++.
>.
+++.
------.
--------.
>+.
>.
Вывод «Н». Получение кода «H» (72) из 70 в ячейке 1 и вывод
Вывод «e». Получение кода «e» (101) из 100 в ячейке 2 и вывод
Вывод «ll». Получение кода «l» (108) из 101 в ячейке 2 и вывод дважды
Вывод «o». Получение кода «o» (111) из 108 в ячейке 2 и вывод
Вывод пробела. Получение кода пробела (32) из 30 в ячейке 3 и вывод
Вывод «W». Получение кода «W» (87) из 72 в ячейке 1 и вывод
Вывод «o». Код «o» (111) уже находится в ячейке 2, просто его выводим
Вывод «r». Получение кода «r» (114) из 111 в ячейке 2 и вывод
Вывод «l». Получение кода «l» (108) из 114 в ячейке 2 и вывод
Вывод «d». Получение кода «d» (100) из 108 в ячейке 2 и вывод
Вывод «!». Получение кода «!» (33) из 32 в ячейке 3 и вывод
Вывод кода перевода строки (10) из ячейки 4

В принципе, печать «Hello World!» можно реализовать проще, но программа будет в три с лишним раза больше, чем приведённый выше оптимизированный вариант:

Код:
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+++++++++++++++++
++++++++++++.+++++++..+++.-------------------
---------------------------------------------
---------------.+++++++++++++++++++++++++++++
++++++++++++++++++++++++++.++++++++++++++++++
++++++.+++.------.--------.------------------
---------------------------------------------
----.-----------------------.

Программирование на языке Brainfuck

Каждый начинающий программировать на Brainfuck немедленно сталкивается со следующими проблемами:
  • отсутствие операции копирования значения
  • отсутствие промежуточной (аккумуляторной) памяти
  • отсутствие условных операторов в их привычном виде
  • отсутствие привычной арифметики, операций умножения и деления

Эти проблемы могут быть решены.

Код:
Обозначим за @(k) сдвиг на k ячеек вправо, если k>0, и влево, если k<0
 Соответственно, @(k) = >…k раз…> либо <…-k раз…< 
 zero(): обнуление текущей ячейки:
   [-]
   =
   [+]
 add(k): прибавление значения ячейки n (текущей) к значению ячейки n+k:
    [ — @(k)  + @(-k)  ]
 при этом значение ячейки n теряется (обнуляется).
 mov(k): копирование значения ячейки n (текущей) в ячейку n+k с потерей (обнулением) значения ячейки n:
   @(k) zero() @(-k) add(k)
   =
   @(k) [-] @(-k) [ — @(k)  + @(-k)  ]
 copy(k,t): копирование значения ячейки n (текущей) в ячейку n+k
 c использованием промежуточной ячейки n+k+t, благодаря чему значение ячейки n не теряется (сохраняется).
   @(k) zero() @(t) zero() @(-k-t) [ — @(k) + @(t) + @(-k-t) ] @(k+t) mov(-k-t)
   =
   @(k) [-] @(t) [-] @(-k-t) [ — @(k) + @(t) + @(-k-t) ] @(k+t) [ — @(-k-t) + @(k+t) ]
 ifelse(t): если текущая ячейка>0, то выполняется условие true
            если текущая ячейка=0, то выполняется условие false
            t-относительный номер вспомогательной ячейки:
   @(t+1)[-]+@(-t-1) устанавливаем флаг 1 для случая else
   [
    здесь действия ветки true
    @(t+1)[-]@(-t-1) устанавливаем флаг 0 для случая else
    [-] выход из цикла
    ]
   @(t+1)
   [
    здесь действия ветки false
    [-] выход из цикла
    ]
   @(-t-1)

Brainfuck почти не используется для практического программирования (за исключением работ отдельных энтузиастов), а используется преимущественно для головоломок и задач для соревнований.
KnightMirko
Global Moderator
*****
Пол: Мужской
Сообщений: 200



« Ответ #1 : 20 Февраль 2009, 21:09:27 »

А вы уже пытались написать что-то на этом языке? Улыбающийся
KnightMirko
Global Moderator
*****
Пол: Мужской
Сообщений: 200



« Ответ #2 : 20 Февраль 2009, 21:22:50 »

Воспринимать, как шутку:

Как самый известный из эзотерических языков программирования BrainFuck стал (нередко ошибочно, т.к. создавался для других целей, а для списка ниже есть примеры более целевых языков) синонимом:

  • Нечитаемости программ
  • Неудобства или непродуманности синтаксиса:
    Перл — это тот же brainfuck, только автор его, почему-то, воспринимает серьезно. Может, конечно, это он так издевается, и тащится от того, что мир подхватил его версию brainfuck и строчит на нем да фанатеет...
  • Неудобства инструмента разработки:
    — Нормальному программисту не важно на чем и под какую платформу писать...
    — Брейнфак под дос.
  • Мазохизма:
    —...если вы настоящий мазохист-извращенец, если вам нравится преодолевать непреодолимое и выполнять невыполнимое, то ваш выбор — это BAT-скрипты.
    — С машиной Тьюринга (или с BrainFuck, что почти то же самое) не сравнить...
  • Примера, чем чревато излишнее упрощение:
    — В российских школах будут преподавать программирование на Delphi и C++Builder.
    — ...слава богу, хоть не лисп...
    — Надо вообще на COBOL'е или на FORTRAN'е учить. Хотя, самый простой, конечно Brainfuck.
  • Мозгокрутных логических задач, не имеющих практической ценности:
    Brainfuck. Задача для детей дошкольного возраста. Забудь тому, чему тебя учили в школе. Детишки дошколята решают ее в среднем за 3 минуты. 8809=6; 7111=0; 2172=0; 6666=4; 1111=0; 3213=0; 7662=2; 9312=1; 0000=4; 2222=0; 3333=0; 5555=0; 8193=3; 8096=5; 7777=0; 9999=4; 7756=1; 6855=3; 9881=5; 5531=0.
    2581=?
  • Насмешки при сравнении языков программирования:
    — Пых-пых что-то достал, хочется чего-то нового, с большими возможностями... ...
    — Ну автору сабжа же нужно "что-то новое, с большими возможностями". Вот brainfuck ему как раз и подойдет. Утрамбует его моск немножко. Научиться яснее выражать свои мысли, и мы ему быстрее сможем помочь.

Кроме того:
  • Из-за практической бесполезности трансляторы брейнфака, байндинги для распространённых библиотек, модули для Apache и т. п. не получают распространения.
  • Из-за простоты языка писать их сравнительно легко.
  • Что делает написание подобных вещей полезным для тренировки и самоутверждения.
  • Существует ряд Brainfuck-based языков программирования, например, любители Терри Пратчетта оценят язык Ook
  • Поговаривают, что для bf был спаян процессор. И не врут.
Кочерыжкин
Неофит
*
Сообщений: 67


« Ответ #3 : 17 Октябрь 2018, 19:01:46 »

Жаль что не обрел должного внимания XD
Страниц: [1]
  Печать  
 
Перейти в:  


Rambler\'s Top100     Рейтинг@Mail.ru  
Powered by SMF 1.1.15 | SMF © 2006-2008, Simple Machines | Форум "Колба" © 2009-2010 | Сайт разработан L-Studio | Карта сайта
Страница сгенерирована за 0.159 секунд. Запросов: 22.