Обсуждение:Brainfuck
30 июля — 1 августа 2005 года сведения из статьи «Brainfuck» появлялись на заглавной странице в колонке «Знаете ли вы». В колонке был представлен текст: «Язык программирования 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:portmaneauen: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)
- Однозначно, не однозначно... Уважаемый Ramir, а Вы современные книжки по программированию читаете? Давным давно называния языков пишутся по-английски: Java, Delphi, Visual Basic и т.д. Была такая тенденция в 60/70-х годах переводить всё на русский. У меня советская книжка сохранилась, где переводчики даже операторы по-русски записали. Но сейчас такое выглядит старомодно и просто неумно. Это как в медицинской книжке транскрибировать латынь. --evgop 23:48, 31 июля 2005 (UTC)
- Я сделал неправильно: название языка следует (покуда произношение однозначно) заменить на транскрипцию везде, кроме введения. Ramir
гг, пишите 'взрыв мозга' >_< --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-машины являются эмуляторами»
править- Что это значит?
- Как насчёт интерпретируемых языков типа Perl и Python?
- А как насчёт Forth?
- И компиляторы есть.
- Даже про 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 ('')
Ещё один интерпретатор 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;
}