Трах мозгов
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Парадигма | Эзотерический , императивный , структурированный |
---|---|
Разработано | Урбан Мюллер |
Впервые появился | сентябрь 1993 г. |
Дисциплина набора текста | Бестиповый |
Расширения имен файлов | .б, .бф |
Под влиянием | |
П'' , ЛОЖЬ | |
Под влиянием | |
Мальбольге |
Brainfuck — это эзотерический язык программирования, созданный в 1993 году швейцарским студентом-физиком Урбаном Мюллером. [1] Разработанный как предельно минималистичный, язык состоит всего из восьми простых команд, указателя данных и указателя инструкций . [2]
Brainfuck — это пример так называемой « тарпита Тьюринга» : его можно использовать для написания любой программы, но это непрактично, поскольку он обеспечивает так мало абстракции, что программы становятся очень длинными или сложными. Хотя Brainfuck полностью по Тьюрингу завершен , он предназначен не для практического использования, а для того, чтобы бросать вызов и развлекать программистов . [3] [4] Brainfuck требует от человека разбивать команды на микроскопические шаги.
Язык получил свое название от жаргонного термина Brainfuck , который относится к вещам настолько сложным или необычным, что они выходят за пределы человеческого понимания, поскольку он не был предназначен или создан для разработки настоящего программного обеспечения, а для того, чтобы бросить вызов границам компьютерного программирования .
Поскольку название языка содержит ненормативную лексику , используется множество заменителей, таких как Brainfsck, Branflakes, Brainoof, Brainfrick, BrainF и BF. [5]
История
[ редактировать ]Мюллер разработал Brainfuck с целью реализовать минимально возможный компилятор . [6] вдохновлен 1024- байтовым компилятором языка программирования FALSE . [7] Оригинальный компилятор Мюллера был реализован на машинном языке и скомпилирован в двоичный файл размером 296 байт. Он загрузил первый компилятор Brainfuck в Aminet в 1993 году. К программе прилагался файл «Readme» , в котором кратко описывался язык, и бросался вызов читателю: «Кто может запрограммировать на нем что-нибудь полезное? :)». Мюллер также включил переводчика и несколько примеров. Вторая версия компилятора использовала всего 240 байт. [8]
Языковой дизайн
[ редактировать ]Язык состоит из восьми команд . Программа Brainfuck представляет собой последовательность этих команд, возможно, с вкраплениями других символов (которые игнорируются). Команды выполняются последовательно, за некоторыми исключениями: указатель инструкции начинается с первой команды, и каждая команда, на которую он указывает, выполняется, после чего он обычно переходит к следующей команде. Программа завершается, когда указатель инструкции перемещается за последнюю команду.
Язык Brainfuck использует простую машинную модель, состоящую из указателя программы и инструкции, а также одномерного массива, состоящего как минимум из 30 000 байтовых ячеек, инициализированных нулем; подвижный указатель данных (инициализированный так, чтобы указывать на самый левый байт массива); и два потока байтов для ввода и вывода (чаще всего подключаются к клавиатуре и монитору соответственно и используют ASCII кодировку символов ).
Каждая из восьми языковых команд состоит из одного символа:
Характер | Значение |
---|---|
>
|
Увеличьте указатель данных на единицу (чтобы он указывал на следующую ячейку справа). |
<
|
Уменьшите указатель данных на единицу (чтобы указать на следующую ячейку слева). |
+
|
Увеличивает байт указателя данных на единицу. |
-
|
Уменьшите байт в указателе данных на единицу. |
.
|
Выведите байт по указателю данных. |
,
|
Примите один байт входных данных, сохранив его значение в байте указателя данных. |
[
|
Если байт в указателе данных равен нулю, то вместо перемещения указателя инструкции вперед к следующей команде переместите его вперед к команде после совпадения. ] команда.
|
]
|
Если байт в указателе данных не равен нулю, то вместо перемещения указателя инструкции вперед к следующей команде перейдете обратно к команде после совпадения. [ команда. [а]
|
[
и ]
совпадают, как это обычно делают круглые скобки: каждый [
соответствует ровно одному ]
и наоборот, [
на первом месте, и не может быть бесподобных [
или ]
между ними двумя.
Программы Brainfuck обычно сложны для понимания. Частично это связано с тем, что любая задача средней сложности требует длинной последовательности команд, а частично потому, что текст программы не дает прямых указаний о состоянии программы . Это, а также неэффективность Brainfuck и его ограниченные возможности ввода/вывода, являются одними из причин, по которым он не используется для серьезного программирования. Тем не менее, как и любой полный по Тьюрингу язык, Brainfuck теоретически способен вычислять любую вычислимую функцию или моделировать любую другую вычислительную модель, если ему предоставлен доступ к неограниченному объему памяти. [9] Было написано множество программ Brainfuck. [10] Хотя программы Brainfuck, особенно сложные, сложно писать, написать интерпретатор Brainfuck на более типичном языке, таком как C, из-за его простоты довольно тривиально. Также существуют интерпретаторы Brainfuck, написанные на самом языке Brainfuck. [11] [12]
Примеры
[ редактировать ]Добавление двух значений
[ редактировать ]В качестве первого простого примера следующий фрагмент кода добавит значение текущей ячейки к следующей ячейке: каждый раз, когда выполняется цикл, текущая ячейка уменьшается, указатель данных перемещается вправо, следующая ячейка увеличивается и указатель данных снова перемещается влево. Эта последовательность повторяется до тех пор, пока начальная ячейка не станет 0.
[->+<]
Это можно включить в простую программу сложения следующим образом:
++ Cell c0 = 2
> +++++ Cell c1 = 5
[ Start your loops with your cell pointer on the loop counter (c1 in our case)
< + Add 1 to c0
> - Subtract 1 from c1
] End your loops with the cell pointer on the loop counter
At this point our program has added 5 to 2 leaving 7 in c0 and 0 in c1
but we cannot output this value to the terminal since it is not ASCII encoded
To display the ASCII character "7" we must add 48 to the value 7
We use a loop to compute 48 = 6 * 8
++++ ++++ c1 = 8 and this will be our loop counter again
[
< +++ +++ Add 6 to c0
> - Subtract 1 from c1
]
< . Print out c0 which has the value 55 which translates to "7"!
Привет, мир!
[ редактировать ]Следующая программа печатает «Hello World!» и новая строка на экране:
[ This program prints "Hello World!" and a newline to the screen; its
length is 106 active command characters. [It is not the shortest.]
This loop is an "initial comment loop", a simple way of adding a comment
to a BF program such that you don't have to worry about any command
characters. Any ".", ",", "+", "-", "<" and ">" characters are simply
ignored, the "[" and "]" characters just have to be balanced. This
loop and the commands it contains are ignored because the current cell
defaults to a value of 0; the 0 value causes this loop to be skipped.
]
++++++++ Set Cell #0 to 8
[
>++++ Add 4 to Cell #1; this will always set Cell #1 to 4
[ as the cell will be cleared by the loop
>++ Add 2 to Cell #2
>+++ Add 3 to Cell #3
>+++ Add 3 to Cell #4
>+ Add 1 to Cell #5
<<<<- Decrement the loop counter in Cell #1
] Loop until Cell #1 is zero; number of iterations is 4
>+ Add 1 to Cell #2
>+ Add 1 to Cell #3
>- Subtract 1 from Cell #4
>>+ Add 1 to Cell #6
[<] Move back to the first zero cell you find; this will
be Cell #1 which was cleared by the previous loop
<- Decrement the loop Counter in Cell #0
] Loop until Cell #0 is zero; number of iterations is 8
The result of this is:
Cell no : 0 1 2 3 4 5 6
Contents: 0 0 72 104 88 32 8
Pointer : ^
>>. Cell #2 has value 72 which is 'H'
>---. Subtract 3 from Cell #3 to get 101 which is 'e'
+++++++..+++. Likewise for 'llo' from Cell #3
>>. Cell #5 is 32 for the space
<-. Subtract 1 from Cell #4 for 87 to give a 'W'
<. Cell #3 was set to 'o' from the end of 'Hello'
+++.------.--------. Cell #3 for 'rl' and 'd'
>>+. Add 1 to Cell #5 gives us an exclamation point
>++. And finally a newline from Cell #6
Для удобства чтения этот код разбит на множество строк, добавлены пробелы и комментарии. Brainfuck игнорирует все символы, кроме восьми команд. +-<>[],.
поэтому специальный синтаксис для комментариев не требуется (пока комментарии не содержат командные символы). С таким же успехом код можно было бы написать так:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
РОТ13
[ редактировать ]Эта программа шифрует вводимые данные с помощью шифра ROT13 . Для этого он должен сопоставить символы AM ( ASCII 65–77) с NZ (78–90) и наоборот. Также он должен сопоставить am (97-109) с nz (110-122) и наоборот. Он должен сопоставить все остальные символы с собой; он считывает символы по одному и выводит их зашифрованные эквиваленты, пока не прочитает EOF (здесь предполагается, что он представлен как -1 или «без изменений»), после чего программа завершается.
-,+[ Read first character and start outer character reading loop
-[ Skip forward if character is 0
>>++++[>++++++++<-] Set up divisor (32) for division loop
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
<+<-[ Set up dividend (x minus 1) and enter division loop
>+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
<[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
<<<<<- Decrement dividend
] End division loop
]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
>--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
++++++++++++<[ If flag then set up divisor (13) for second division loop
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
>-[>+>>] Reduce divisor; Normal case: increase remainder
>[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
<<<<<- Decrease dividend
] End division loop
>>[<+>-] Add remainder back to divisor to get a useful 13
>[ Skip forward if quotient was 0
-[ Decrement quotient and skip forward if quotient was 1
-<<[-]>> Zero quotient and divisor if quotient was 2
]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
<[-] Clear remainder from first division if second division was skipped
<.[-] Output ROT13ed character from copy and clear it
<-,+ Read next character
] End character reading loop
Моделирование абиогенеза
[ редактировать ]В 2024 году исследовательский проект Google использовал Brainfuck в качестве основы искусственной цифровой среды. Они обнаружили, что в этой среде репликаторы возникают естественным путем и конкурируют друг с другом за доминирование в окружающей среде. Блез Агуэра-и-Аркас; Алакуйала, Юрки; Эванс, Джеймс; Лори, Бен; Мордвинцев Александр; Никлассон, Эйвинд; Рандаццо, Этторе; Версари, Лука (2024). «Вычислительная жизнь: как хорошо сформированные самовоспроизводящиеся программы возникают из простого взаимодействия». arXiv : 2406.19108 [ cs.NE ].
См. также
[ редактировать ]- JSFuck — эзотерическое подмножество языка программирования JavaScript с очень ограниченным набором символов.
Примечания
[ редактировать ]- ^ Альтернативно,
]
вместо этого команда может быть переведена как безусловный переход к соответствующему[
команда или наоборот; программы будут вести себя так же, но будут работать медленнее из-за ненужного двойного поиска.
Ссылки
[ редактировать ]- ^ Пасха, Брэнди (2 апреля 2020 г.). «Полностью человек, полностью машина: риторика цифрового развоплощения в программировании». Риторический обзор . 39 (2): 202–215. дои : 10.1080/07350198.2020.1727096 . ISSN 0735-0198 . S2CID 219665562 .
- ^ Темкин, Даниэль (01 сентября 2017 г.). «Язык без кода: намеренно непригодные для использования, невычислимые или концептуальные языки программирования» . Журнал науки и технологий искусств . 9 (3): 83–91. дои : 10.7559/citarj.v9i3.432 . ISSN 2183-0088 . Архивировано из оригинала 9 июля 2024 г. Проверено 11 февраля 2024 г.
- ^ Хаупт, Майкл. «Реализация Brainfuck в COLA».
- ^ Кокс, Джефф и Алекс Маклин. «Не просто для развлечения». Блумсбери Академик, 2014. 157–173.
- ^ "мозготрах - Эсоланг" . esolangs.org . Архивировано из оригинала 23 октября 2018 г. Проверено 7 февраля 2024 г.
- ^ «Язык программирования Brainfuck» . Muppetlabs.com. Архивировано из оригинала 3 мая 2023 г. Проверено 30 апреля 2023 г.
- ^ «ЛОЖНЫЙ язык программирования — Воутер ван Оортмерссен» . Strlen.com. 03.08.2013. Архивировано из оригинала 30 апреля 2023 г. Проверено 30 апреля 2023 г.
- ^ "Aminet - dev/lang/brainfuck-2.lha" . Аминет. Архивировано из оригинала 30 апреля 2023 г. Проверено 30 апреля 2023 г.
- ^ «BF полна по Тьюрингу» . Iwriteiam.nl. Архивировано из оригинала 23 мая 2023 г. Проверено 30 апреля 2023 г.
- ^ «Индекс /esoteric/brainfuck/bf-source/prog» . sange.fi. 22 января 2002 г. Архивировано из оригинала 30 апреля 2023 г. Проверено 30 апреля 2023 г.
- ^ «Интерпретатор BF, написанный на BF» . Iwriteiam.nl . Проверено 30 апреля 2023 г.
- ^ "переводчик-мозговик" . Дэниел Б. Кристофани.