Меню
Главная
Случайная статья
Настройки
|
Эта статья тематически связана с вики-проектом «Информационные технологии», цель которого — создание и улучшение статей по темам, связанным с информационными технологиями. Вы можете её отредактировать, а также присоединиться к проекту, принять участие в его обсуждении и поработать над требуемыми статьями.
Содержание
интерпрититор+исчерпывающая документация по языку
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-машины являются эмуляторами»- Что это значит?
- Как насчёт интерпретируемых языков типа 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 ('')
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;
}
|
|