Обсуждение:Brainfuck

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

интерпрититор+исчерпывающая документация по языку[править код]

http://ideone.com/msTeU интерпрититор+исчерпывающая документация по языку --213.88.39.97 10:34, 21 января 2012 (UTC)[ответить]

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

Для Ramir: Предлагаю не переводить слово fuck так буквально, тем более, что Ваш перевод и не вполне верен. Кроме слова fuck, в статье о языке Brainfuck и в самом языке нет ничего оскорбительного. Это язык представляет немалый теоретический интерес; Brainfuck - не какое-то девиантное явление, он включён во многие учебники по программированию в качестве интересного объекта для всевозможных упражнений и традиционно является одним из языков, на которых разрешается писать участникам различных состязаний программистов. К тому же, указаний на оскорбительность нет в статьях о Brainfuck'е на других языках Википедии. Наилучший, на мой взгляд, вариант - вообще никак не разъяснять этимологию слова (как и было изначально). --evgop 12:17, 31 июля 2005 (UTC)[ответить]

Но перевод названия - важное в этом случае сведение, даёт понять отношение авторов языка к нему. Перевод дать нужно. Другое дело - что можно перевести пуританско-ханженским "как бы научным" способом, но это долго. Мой перевод верен вполне: язык назван простым составлением (en:portmaneau en:portmanteau) двух слов, и "мозгоёбка" здесь - самый подходящий перевод. Если же Вы просто хотите, чтобы на странице не было обидной лексики, то я возражу вот так: все образованные русские знают английский, ну и слово "fuck" тоже. Оно ничуть не менее оскорбительно слова "ёб", и поэтому либо Вы тут закрасите название звёздочками, либо мы ничего не теряем применяя мат в статье. Ramir
Во-первых, ещё раз отсылаю Вас к английской Википедии, где никаких звёздочек не наблюдается, равно как и предупреждения об оскорбительной лексике. Дело в том, что слово fuck, хотя и является ругательным, существенно мягче русского мата. Я вовсе не ханжа-пуританин, и хочу сообщить, что fuck можно перевести так же словами хуй, чёрт, жопа и так далее. Так что, давайте заполним википедию всевозможными вариациями на эту тему? Вот именно, что слово fuck в переводе не нуждается. Ваш же перевод сделал из статьи про программирование (не знаю, читали ли Вы её дальше первой строчки), fuck knows what. Кстати, в большинстве википедий на других языках термин Brainfuck никак не переводится. И не транскрибируется тоже. --evgop 23:48, 31 июля 2005 (UTC)[ответить]
1. Вы не правы, самый умный — я. 2. «...что я сделал из статьи про программирование» за довод вообще не принимается. 3. Как делают на других Википедиях — нам не устав. Есть другие критерии, более подходящиие. 3. «в большинстве» — тем более показывает несостоятельность Вашего аргумента. Ну ладно, см. моё последнее слово ниже. Ramir 09:06, 1 августа 2005 (UTC)[ответить]

И ещё для Ramir: я не понял, по какому принципу Вы заменили часть Brainfuck′ов на Брэйнфак′и, а часть - оставили. --evgop 12:24, 31 июля 2005 (UTC)[ответить]

Убрал «дословный» перевод, название языка править не стал, не знаю точно какие насчёт этого договорённости есть. Лий 13:26, 31 июля 2005 (UTC)[ответить]
Я сделал неправильно: название языка следует (покуда произношение однозначно) заменить на транскрипцию везде, кроме введения. Ramir
Однозначно, не однозначно... Уважаемый Ramir, а Вы современные книжки по программированию читаете? Давным давно называния языков пишутся по-английски: Java, Delphi, Visual Basic и т.д. Была такая тенденция в 60/70-х годах переводить всё на русский. У меня советская книжка сохранилась, где переводчики даже операторы по-русски записали. Но сейчас такое выглядит старомодно и просто неумно. Это как в медицинской книжке транскрибировать латынь. --evgop 23:48, 31 июля 2005 (UTC)[ответить]
Я почти что не читаю книг о программировании, особенно современных на русском языке. Но мой довод не в том, как пишут нынешние переводчики, а в том, как удобно русскому читателю. Однако... похоже, среди википедийцев столько очень современных программистов, что я не смогу всем восперечить. Пишите хоть на латыни, хоть на китайском. Брэйнфак-то останется мозгоёбкой. (отбой) Ramir 09:06, 1 августа 2005 (UTC)[ответить]

гг, пишите 'взрыв мозга' >_< --81.200.20.167 14:15, 24 июня 2008 (UTC)[ответить]

Уважаемый Ramir, согласно правилам русского языка названия и имена НЕ переводятся. Если вы хотите записать название или имя, вы должны написать его либо на оригинальном языке, либо в транслитированом варианте, без изменения звучания и произношения. "Brainfuck", он хоть на русском, хот ьна китайском будет писаться "Brainfuck"(в русском языке возможен вариант "Брэйнфак"). Господа, прежде, чем разводить дискуссию о правильном написании в русском разделе википедии, удосужитесь заглянуть в правила русского языка. Спасибо. --Hakujin 06:55, 24 марта 2010 (UTC)[ответить]

«Генетическое программирование»[править код]

Вопрос к 62.85.72.62 по поводу Brainfuck - идеальное средство для решения задач генетического программирования. Поясните, пожалуйста! --evgop 17:28, 10 августа 2005 (UTC)[ответить]

В принципе, довольно логично - синтаксис очень простой, правила "скрещивания" алгоритмов сформулировать легко, так что в экспериментах по "выращиванию" алгоритмов BF вполне может занять свою нишу. Но насчёт идеальности, на мой взгляд, товарищ несколько переборщил. ==Maxim Razin(talk) 17:48, 10 августа 2005 (UTC)[ответить]
По-моему, искусственный минимализм BF не позволяет программировать на нём что-либо реально полезное. Тем более, "идеально". А вообще, идея интересная, я как-то не задумывался. Но - только в качестве учебной задачи.
Замени "идеально" на "хорошо" :) ==Maxim Razin(talk) 19:18, 10 августа 2005 (UTC)[ответить]
Кстати, ты немного изменил текст, фактически заменил машину Тьюринга на полноту по Тьюрингу. А ведь несколько ниже про полноту по Тьюрингу уже есть. К тому же, машина, которой управляет BF - действительно машина Тьюринга :) --evgop 18:38, 10 августа 2005 (UTC)[ответить]
Принимаю. BF это МТ с дополнительными ограничениями. ==Maxim Razin(talk) 19:18, 10 августа 2005 (UTC)[ответить]
А с какими ограничениями? В абстрактном BF бесконечная лента и размер ячейки никак не декларируется. По-моему, МТ в чистом виде :) --evgop 19:31, 10 августа 2005 (UTC)[ответить]
У BF, по сравнению с МТ, сильно ограниченная система команд, и априори неясно, что они эквивалентны. ==Maxim Razin(talk) 20:08, 10 августа 2005 (UTC)[ответить]
Вообще говоря, наоборот :) В МТ нет таких сложных операций, как «+» и «-», тем более «[» и «]», не говоря уже о «.» и «,». С другой стороны, да, МТ - это не только лента, движущая головка и конечный алфавит. Ещё есть множество состояний, текущее состояние и таблица переходов. Но говоря, что BF - язык управления MT, я имел в виду, что "аппаратная часть" BF совпадает с "аппаратной частью" MT. Пожалуй, я сделал это не совсем корректно. --evgop 21:16, 10 августа 2005 (UTC)[ответить]

Интерпретация [][править код]

Моя правка делает определения [ и ] симметричными и позволяет уменьшить число проверок условия. Можно еще определить ] как безусловный переход к [, это уменьшит размер скомп. программы, но добавит лишние переходы, и этим снизит производительность. — Эта реплика добавлена с IP 80.82.187.33 (о) 09:29, 2 июня 2007 (UTC)[ответить]

«все существующие BF-машины являются эмуляторами»[править код]

  1. Что это значит?
  2. Как насчёт интерпретируемых языков типа Perl и Python?
    1. А как насчёт Forth?
  3. И компиляторы есть.
    1. Даже про hardware интерпретаторы пишут.

AVRS 11:03, 12 августа 2007 (UTC)[ответить]

Прошло 2 месяца с момента постановки {{fact}}. Удалил. --AVRS 22:19, 21 ноября 2007 (UTC)[ответить]

Оператор условия[править код]

На мой взгляд, можно чуууть улучшить

  @(t+1)[-]+@(-t-1) устанавливаем флаг 1 для случая else
  [
   здесь действия ветки true
   @(t+1)[-] устанавливаем флаг 0 для случая else, выход из цикла
   ]
  @(t+1)
  [
   здесь действия ветки false
   [-] выход из цикла
   ]
  @(-t-1)

Не согласен с этим. После цикла ветки if в данной версии мы можем оказаться как в @0 ячейке (если текущая ячейка - ноль), так и @(t+1) (если мы прошли по циклу), а это делает дальнейший алгоритм бессмысленным, т.к. переход из @(t+1) на @(t+1) приведёт к неизвестному результату (зависит от t). Worldalexey 20:49, 18 января 2011 (UTC)[ответить]

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. - так верней ;)[править код]

Уважаемые, у вас в исходник «Hello world!» закралась ошибка. Первый оператор '<' (17-й символ) явно лишний. 217.10.38.243 21:28, 23 ноября 2008 (UTC)speller[ответить]

Программы на brainfuck[править код]

Я считаю что создать на brainfuck генератор случайных чисел(без вмешательства юзера) невозможно. Кто-нибудь знает как на нём написать калькулятор? 95.58.7.74 15:13, 18 марта 2009 (UTC)[ответить]

Пожалйста, простейший калькулятор. Требует доработки и оптимизации :) состряпано на коленке.


						*******************								

* Ввод * *******************

, Читаем первое число > сдвигаемся , читаем второе число <

						*******************								

* Копирование * *******************

[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<< первое число [>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<<< второе число

[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<<< первое число [>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<<<<< второе число

[>>>>>>>>>>>+>+<<<<<<<<<<<<-]>>>>>>>>>>>> [<<<<<<<<<<<<+>>>>>>>>>>>>-]<<<<<<<<<<< первое число [>>>>>>>>>>>+>+<<<<<<<<<<<<-]>>>>>>>>>>>> [<<<<<<<<<<<<+>>>>>>>>>>>>-]<<<<<<<<<<<<< второе число

теперь у нас есть четыре пары чисел вида хх0хх0хх0хх0 указатель стоит в начале

						*******************								

* Сложение * *******************

++++++++++++++++++++++++++++++++++++++++++++++++.


печатаем первое число

>>+++++++++++++++++++++++++++++++++++++++++++. печатаем символ плюс <++++++++++++++++++++++++++++++++++++++++++++++++.


печатаем второе число

>++++++++++++++++++.[-] печатаем знак равно освобождаем ячейку

< [<+>-] складываем <++++++++++++++++++++++++++++++++++++++++++++++++. печатаем результат [-]+++++++++++++. делаем возврат каретки

>>> переходим к началу новой пары символов

						*******************								

* Вычитание * *******************

++++++++++++++++++++++++++++++++++++++++++++++++. печатаем первое число


>>+++++++++++++++++++++++++++++++++++++++++++++. печатаем знак минус <++++++++++++++++++++++++++++++++++++++++++++++++.

------------------------------------------------		печатаем второе число

>++++++++++++++++.[-] печатаем знак равно освобождаем ячейку <[<->-] <++++++++++++++++++++++++++++++++++++++++++++++++. [-]+++++++++++++. возврат каретки >>> к первому символу

						*******************								

* Умножение * *******************


++++++++++++++++++++++++++++++++++++++++++++++++. печатаем первое число


>>++++++++++++++++++++++++++++++++++++++++++. печатаем знак умножения <++++++++++++++++++++++++++++++++++++++++++++++++.

------------------------------------------------		печатаем второе число

>+++++++++++++++++++.[-] печатаем знак равно освобождаем ячейку << [> [>>+>+<<<-]>>>[<<<+>>>-]<<< сисходники взяли <-] а понимать кто будет >>> я то понял а теперь ++++++++++++++++++++++++++++++++++++++++++++++++. ваша очередь >[-]+++++++++++++.[-]

						*******************								

* Деление * ******************* > ставим указатель на первый символ

++++++++++++++++++++++++++++++++++++++++++++++++. печатаем первое число


>>+++++++++++++++++++++++++++++++++++++++++++++++. печатаем знак умножения <++++++++++++++++++++++++++++++++++++++++++++++++.

------------------------------------------------		печатаем второе число

>++++++++++++++.[-] печатаем знак равно освобождаем ячейку

<< встаем в обратный зад

 [
 >[->+>+<<]											копируем
 >[-<<-[>]>>>[<[>>>-<<<[-]]>>]<<] 						вычитаем и если ноль то 

выходим

 >>>+ 													счетчик
 <<[-<<+>>] 											копируем
 <<<													возвращаемся к делимому
 ]														конец деления
 >[-]>>>>[-<<<<<+>>>>>] 								привет тому кто дочитал
 <<<<<  												возврат к результату	


++++++++++++++++++++++++++++++++++++++++++++++++. Autor >[-]+++++++++++++..+++++++++++++++++++++++++++++ ASU 05 1 +++++++++++++++++++++++.++++++++++++++++++.++.-- Kovalyov V M


.+++.+++++

.--------.++++.[-]+++++++++++++.++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++.+ +++.+++++++.---------------------.+++++++++++.++ +++++++++++.----------.+++++++.

Manya g 23:58, 24 марта 2009 (UTC)Маня a-ka Monyag[ответить]

Я считаю что создать на brainfuck генератор случайных чисел(без вмешательства юзера) невозможно - думаю вполне можно если через brainfuck можно обратиться к дампу по адресу хранения времени(0040:006c) Advisors 14:18, 2 июня 2009 (UTC)[ответить]

Фатальные ошибки[править код]

предлагаю внести в статью информацию о том что можеть "убить" БФ машину. (ну или как это назвать?) например такой код

 ++[>++]

приведет к почти мгновенному переполнению буффера 78.111.145.29 16:27, 15 апреля 2010 (UTC)[ответить]

А можно не так жестоко? Например бесконечный цикл без переполнения буфера:

 ++[]

lohmatiyy 12:51, 18 августа 2010 (UTC)[ответить]

Зависит от реализации интерпретатора/компилятора. В IronBrainFuck лента и значения зациклены между 0 и MaxValue (=UInt16.MaxValue) и поэтому через некоторое время (пару секунд) код вернёт управление в ячейке с индексом 0, где все остальные будут равны MaxValue-2. Worldalexey 20:46, 14 января 2011 (UTC)[ответить]

Дополнение ссылок[править код]

К списку прилагаемых ссылок я бы добавил описание интерпретатора и компилятора Brainfuck, исходные тексты открыты.
Кстати, в статье написано о компиляторах размером в 200 байт, что кажется несерьезным. Почему нет соответствующих ссылок? --Ignizavr 18:23, 12 мая 2010 (UTC)[ответить]

тут исходный вариант в 240 байт, остальное еще искать надо.--AlexVinS 19:52, 18 августа 2010 (UTC)[ответить]
а вот тут исходник компилятора для Линукс размером 171 байт. Итого факт есть, но лучше конечно найти вторичный АИ на тему "самый маленький компилятор брейнфака", чтобы не превращать статью в каталок ссылок.--AlexVinS 20:04, 18 августа 2010 (UTC)[ответить]

Кстати, в разделе ссылок уже есть [1], откуда есть есть ссылка на исходник компилятора размером 166 байт.--AlexVinS 20:11, 18 августа 2010 (UTC)[ответить]

Я новый участник и хочу добавить исходный код интерпретатора BrainFuck на Python 3.x[править код]

Ниже приведён код интерпретатора Brainfuck'а, написанный на языке Python 3.x

import sys

str = ''
for line in sys.stdin:
    str += line.replace ( ' ', '')
cmdIndex = 0
cmd = ''
index = 0
memMap = []
memMap.append (0)
ceillSize = 256
loopsMap = []


while cmdIndex < len ( str ):
    cmd = str [cmdIndex]
    memMap [index] %= ceillSize
    if cmd == '<':
        index -= 1
        if index < 0:
            print ( 'Error index < 0')
            sys.exit ( - 1 )
    elif cmd == '>':
        index += 1
        if index == len ( memMap ):
            memMap.append ( 0 )
    elif cmd == '+':
        memMap [index] += 1
    elif cmd == '-':
        memMap [index] -= 1
    elif cmd == '.':
        sys.stdout.write ( chr ( memMap [index] ) )
    elif cmd == ',':
       memMap [index] = ord ( sys.stdin.read (1) )
    elif cmd == '[':
        loopsMap.append ( cmdIndex + 1 )
    elif cmd == ']':
        if memMap [index] == 0:
            loopsMap.pop ()
        else:
            cmdIndex = loopsMap [ len ( loopsMap ) - 1]
            continue
    cmdIndex += 1
print ('')

Sviridenkovalera 14:09, 25 мая 2013 (UTC)[ответить]

Ещё один интерпретатор Brainfuck[править код]

Реализованный на встроенном языке 1С предприятия: http://infostart.ru/public/198930/ 91.241.13.31 15:39, 27 августа 2013 (UTC)Илья[ответить]

Оформление интерпретатора[править код]

Скажите, кто и зачем так отформатировал код интерпретатора Brainfuck'а на Perl'е? — Kotolegokot 16:17, 26 июня 2014 (UTC)[ответить]

Реализация Brainfuck для Arduino[править код]

В статье на русском языке описывается реализация языка для платформы Arduino. Представлены тексты и работающие примеры. http://arduino.ru/forum/programmirovanie/razrabotka-sketchei-na-yazyke-brainfuck Asper321 06:27, 2 мая 2016 (UTC)[ответить]

else if (acc[i] == ']') { ... if (acc[i] == ']') - "масло масляное" ?[править код]

else if (acc[i] == ']') {
           if (!cpu[j])
               continue;
           else {
               if (acc[i] == ']') // думаю, это лишнее :)
                   brc++;
elsif ($code[$_] eq ']') {
   if (!$cpu[$i]) {
     next;
   } else {
     ++$brc if $code[$_] eq ']'; // аналогично

или я чего-то недопонимаю ? — поправьте, меня или текст :)

Интерпретатор на C#[править код]

Написал вот такой интерпретатор на C# Net6.0 Прекрасно справляется со своей задачей.

byte[] Excute(string code, int allocSize = 30000)
{
    byte[] bytes = new byte[allocSize];
    short pos = 0;
    Dictionary<char, Action> types = new(){
        {'>', new(() => pos++)}, {'<', new(() => pos--)},
        {'+', new(() => bytes[pos]++)}, {'-', new(() => bytes[pos]--)},
        {'.', new(() => Console.Write(bytes[pos]))}, {',', new(() => bytes[pos] = (byte)Console.ReadLine()[0])}
    };
    foreach (string z in code.Replace("[", "[|").Replace(']', '[').Split('['))
        if (z[0] == '|')
            while (bytes[pos] != 0)
                for (int i = 1; i < z.Length; i++)
                    types[z[i]]();
        else
            for (int i = 0; i < z.Length; i++)
                types[z[i]]();
    return bytes;
}