Jump to content

Трах мозгов

Трах мозгов
Парадигма Эзотерический , императивный , структурированный
Разработано Урбан Мюллер
Впервые появился сентябрь 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 игнорирует все символы, кроме восьми команд. +-<>[],. поэтому специальный синтаксис для комментариев не требуется (пока комментарии не содержат командные символы). С таким же успехом код можно было бы написать так:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

Эта программа шифрует вводимые данные с помощью шифра 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 ].

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Альтернативно, ] вместо этого команда может быть переведена как безусловный переход к соответствующему [ команда или наоборот; программы будут вести себя так же, но будут работать медленнее из-за ненужного двойного поиска.
  1. ^ Пасха, Брэнди (2 апреля 2020 г.). «Полностью человек, полностью машина: риторика цифрового развоплощения в программировании». Риторический обзор . 39 (2): 202–215. дои : 10.1080/07350198.2020.1727096 . ISSN   0735-0198 . S2CID   219665562 .
  2. ^ Темкин, Даниэль (01 сентября 2017 г.). «Язык без кода: намеренно непригодные для использования, невычислимые или концептуальные языки программирования» . Журнал науки и технологий искусств . 9 (3): 83–91. дои : 10.7559/citarj.v9i3.432 . ISSN   2183-0088 . Архивировано из оригинала 9 июля 2024 г. Проверено 11 февраля 2024 г.
  3. ^ Хаупт, Майкл. «Реализация Brainfuck в COLA».
  4. ^ Кокс, Джефф и Алекс Маклин. «Не просто для развлечения». Блумсбери Академик, 2014. 157–173.
  5. ^ "мозготрах - Эсоланг" . esolangs.org . Архивировано из оригинала 23 октября 2018 г. Проверено 7 февраля 2024 г.
  6. ^ «Язык программирования Brainfuck» . Muppetlabs.com. Архивировано из оригинала 3 мая 2023 г. Проверено 30 апреля 2023 г.
  7. ^ «ЛОЖНЫЙ язык программирования — Воутер ван Оортмерссен» . Strlen.com. 03.08.2013. Архивировано из оригинала 30 апреля 2023 г. Проверено 30 апреля 2023 г.
  8. ^ "Aminet - dev/lang/brainfuck-2.lha" . Аминет. Архивировано из оригинала 30 апреля 2023 г. Проверено 30 апреля 2023 г.
  9. ^ «BF полна по Тьюрингу» . Iwriteiam.nl. Архивировано из оригинала 23 мая 2023 г. Проверено 30 апреля 2023 г.
  10. ^ «Индекс /esoteric/brainfuck/bf-source/prog» . sange.fi. 22 января 2002 г. Архивировано из оригинала 30 апреля 2023 г. Проверено 30 апреля 2023 г.
  11. ^ «Интерпретатор BF, написанный на BF» . Iwriteiam.nl . Проверено 30 апреля 2023 г.
  12. ^ "переводчик-мозговик" . Дэниел Б. Кристофани.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 3935fa71c9b3f4923a0e61f72b38a9bd__1721377140
URL1:https://arc.ask3.ru/arc/aa/39/bd/3935fa71c9b3f4923a0e61f72b38a9bd.html
Заголовок, (Title) документа по адресу, URL1:
Brainfuck - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)