А какое придумать название?
Ну, по смыслу же. Ты же пишешь, не я
http://en.wikipedia.org/wiki/Brainfuck
Character Meaning
> increment the data pointer (to point to the next cell to the right).
< decrement the data pointer (to point to the next cell to the left).
+ increment (increase by one) the byte at the data pointer.
- decrement (decrease by one) the byte at the data pointer.
. output a character, the ASCII value of which being the byte at the data pointer.
, accept one byte of input, storing its value in the byte at the data pointer.
[ if the byte at the data pointer is zero, then instead of moving the instruction pointer forward to the next command, jump it forward to the command after the matching ] command*.
] if the byte at the data pointer is nonzero, then instead of moving the instruction pointer forward to the next command, jump it back to the command after the matching [ command*.
Вот по meaning, и сокращай. Напр: [+] -- OP_PLUS, [-] -- OP_MINUS, [<] -- DEC_DP, етц.
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
Уряяяяяяяяяяяя!
"Hello World!" работает!
Ну, по смыслу же. Ты же пишешь, не я
Да не название переменных, название языка . Думая Brain-ня, потому-что основан на бреинфаке и няшен, хотя не очень нравится.
Неактивен
Babusha, "BrainFuck" переводится, как "мозгоёбство", так? Так же я уверен, что у большей части обитателей нашего форума ты лично ассоциируешься, как мозгоёб. Вот и назови язык в честь себя - Babasha. Ну или Babu-ня, или BabuFuck, или даже(экстримально) Fuck(With)Babu - F(W)B. Для большей няшности можешь добавить плюсов)))
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
Lord_Evil, Да ладно, лучше что-то посерьезнее и поприличнее .
Неактивен
testicula пишет:Ну Бабуша же делает интерпретатор конкретноно диалекта брэйнфака, а не "алгоритм любой сложности".
А что - брейнфак не имеет всех этих логических конструкций?
Естественно имеет, раз он Turing Complete
Ну и что?
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
Естественно имеет, раз он Turing Complete
Ну и что?
Ой, точно, это же получается что на моем няшном языке теоретически можно реализовать алгоритм любой сложности .
Неактивен
Да не название переменных, название языка . Думая Brain-ня, потому-что основан на бреинфаке и няшен, хотя не очень нравится.
Соглашусь с LordEvil. Для поднятия твоего ЧСВ, а также исходя из капитанской логики, назови его BBF (BabushaBrainFuck).
Добавлено спустя 01 мин 29 с:
Ой, точно, это же получается что на моем няшном языке теоретически можно реализовать алгоритм любой сложности .
Так точно, Кэп! Любой няшности.
Моё предложение написать на нём движок NewSLOR остаётся в силе.
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
Соглашусь с LordEvil. Для поднятия твоего ЧСВ, а также исходя из капитанской логики, назови его BBF (BabushaBrainFuck).
Да черт, без слова "fuck"
Неактивен
Babusha молодец, кстати. Хороший кодер
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
testicula, спасибо .
А в шарпике есть оператор next в циклах?
Неактивен
testicula, спасибо
.
А в шарпике есть оператор next в циклах?
А нафиг он тут?
for (int i=0; i<10; i++) {
if (i == 4)
continue;
Console.WriteLine(i);
if (i == 8)
break;
}
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
А нафиг он тут?
Секундочку, оператор continue переходит к следующей итерации или продолжает выполнение текущей?
Редактировался Babusha (06-10-11 23:44:43)
Неактивен
Babusha пишет:Секундочку, оператор continue переходит к следующей итерации или продолжает выполнение текущей?
Да, именно так. Он используется внутри операторных скобок.
Вообще-то Babusha спросил что делает оператор "continue". То что он находится внутри "операторных скобок", по моему, очевидно
А "continue" да, переходит к следующей итерации, а если точнее то к точке где происходит "i++". (затем просиходит проверка "i < 10" и исполняется "тело" цикла.
Попробуй протрассировать этот цикл в студии нажимая F11.
Редактировался testicula (06-10-11 23:55:28)
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
Уже маленькая победа! Уже работает "Hello, World!", следующие команды хорошо отлажены и отлично работают (включая циклы):
+ - > < ^ v # ~ . * / % [ ]
В текущем состоянии можно полноценно запускать уже программы на чистом Brainfuck
Вот пример программы печатающей 987654321 с помощью цикла и оператора ~, который выводит значение текущей ячейки в цифрах
01 01 0A 0E 01 0B 02 01 01 0B 0F
Эквивалент на бреинфаке
+ + + + + + + + + + { 10+ }
[ - ~ ]
Циклы реализовал следующим образом, идеат команда начала цикла
0E
следующим идет адрес перехода к концу цикла
01 0B
01 - значит один байт, 0B - адрес (следующий после команды [ (0F))
Дальше идет тело цикла. Цикл начинается с того, что проверяется текущее значение ячейки, если не равно нулю, в стек виртуальной машины загружается адрес начала цикла, если нет, перепрыгивает на адрес указанный после команды 0E, если цикл был начал, когда доходит до команды 0F (]), проверятся значение ячейки, опять, если не равно нулю, переходит на адрес лежащий на вершине стека виртуальной машины, иначе, переходит на выполнение следующей команды. Как нибуть по аналогии сделаю и условный переход, на как сделать процедуры - ума не приложу, есть идеи?
Редактировался Babusha (09-10-11 15:53:24)
Неактивен
Уже маленькая победа! Уже работает "Hello, World!", следующие команды хорошо отлажены и отлично работают (включая циклы):
+ - > < ^ v # ~ . * / % [ ]
В текущем состоянии можно полноценно запускать уже программы на чистом Brainfuck
Вот пример программы печатающей 987654321 с помощью цикла и оператора ~, который выводит значение текущей ячейки в цифрах
01 01 0A 0E 01 0B 02 01 01 0B 0F
Эквивалент на бреинфаке
+ + + + + + + + + + { 10+ } [ - ~ ]
Циклы реализовал следующим образом, идеат команда начала цикла
0E
следующим идет адрес перехода к концу цикла
01 0B
01 - значит один байт, 0B - адрес (следующий после команды [ (0F))
Дальше идет тело цикла. Цикл начинается с того, что проверяется текущее значение ячейки, если не равно нулю, в стек виртуальной машины загружается адрес начала цикла, если нет, перепрыгивает на адрес указанный после команды 0E, если цикл был начал, когда доходит до команды 0F (]), проверятся значение ячейки, опять, если не равно нулю, переходит на адрес лежащий на вершине стека виртуальной машины, иначе, переходит на выполнение следующей команды. Как нибуть по аналогии сделаю и условный переход, на как сделать процедуры - ума не приложу, есть идеи?
Вызов процедуры CALL <addr> аналогичен следующей последовательности:
vm.StackVM.Push(ip); // ip - тут это instruction pointer.
vm.IP = <addr>
Выход из процедуры (return), аналогичен всего лишь:
vm.IP = vm.StackVM.Pop()
Это как пример.
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
Вызов процедуры CALL <addr> аналогичен следующей последовательности:
vm.StackVM.Push(ip); // ip - тут это instruction pointer.
vm.IP = <addr>Выход из процедуры (return), аналогичен всего лишь:
vm.IP = vm.StackVM.Pop()Это как пример.
Ну как-бы "имена" процедур есть числа
+ + + + + { 5+ }
{ Процедура 5 печатающая переход на новую строку, при этом не "портит" текущее значение ячейки}
( ^ # + + + + + + + + + + { 10+ } . # v @ ) &
Dictionary может хранить <int, int> хэш ?
Сложность в том, что я не придумал как и где процедуры хранить.
Кстати, да, я решил что оператор "v" не должен выталкивать значение лежащие на вершине стека, а только копировать (а если в ячейке уже есть число, складывать) в текущую ячейку, для уничтожения числа на вершине стека - оператор @
Редактировался Babusha (10-10-11 00:12:34)
Неактивен
Кстати, да, я решил что оператор "v" не должен выталкивать значение лежащие на вершине стека, а только копировать (а если в ячейке уже есть число, складывать)
Нормально. Я в своём компиляторе С тоже как-то сделал подобным образом стек машину (нужна была простота). Это достаточно эффективно.
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
Кстати, да, думаю отказаться от адреса конца цикла перед оператором [, думаю создать переменную isloopIgnore = false, потом делать как-то так
if(CurrentCommand() == 0xF || isLoopIgnore == true) isLoopIgnore = false;
else if(CurrentCommand() != 0xF || isLoopIgnore == true) NextByteCodeCommand();
по нескольким причинам, потому-что во первых, сложно считать адреса во время компиляции и сложно будет отлаживать, но в результате увеличится количество итераций, как поступить?
Редактировался Babusha (10-10-11 00:53:06)
Неактивен
Кстати, да, думаю отказаться от адреса конца цикла перед оператором [, думаю создать переменную isloopIgnore = false, потом делать как-то так
if(CurrentCommand() == 0xF || isLoopIgnore == true) isLoopIgnore = false; else if(CurrentCommand() != 0xF || isLoopIgnore == true) NextByteCodeCommand();
по нескольким причинам, потому-что во первых, сложно считать адреса во время компиляции и сложно будет отлаживать, но в результате увеличится количество итераций, как поступить?
Вот тут я тебя уже потерял. Извини, брэйнфак и C# - слишком для меня кислотное сочетание
- Модератор... ты очень, очень глубоко заблуждаешься...
- Два предупреждения за скрытый мат!
Неактивен
Вот тут я тебя уже потерял. Извини, брэйнфак и C# - слишком для меня кислотное сочетание
Не, согласен, сочитание вообще ппц .
Я имею ввиду, что циклы в байткоде выглядят вот так
0E 01 04 0F
0E - команда начала цикла.
01 04 - адрес конца, (01 размер в байтах, 04 - само число)
0F - команда конца цикла.
При начале цикла проверяется текущее значение ячейки, если 0, тогда виртуальная машина переходит на адрес указанный после команды 0E, если значение ячейки не ноль, тогда перепрыгивает адрес и начинает выполнять блок кода, я имел ввиду перепрыгивание блока кода сделать не прыжком на адрес, а просто смотреть каждую команду блока и игнорировать ее, пока не встретится 0F, все только потому-что, пораскинув ситуацией, считать адреса во время компиляции довольно трудновато и отлаживать будет тяжело, ведь мы будем стоять перед такой ситуацией, мы увидели начало блока цикла, чтобы посчитать адрес перехода конца, нам надо найти и посчитать весь блок, найти размер, потом к размеру добавить плюс один - байт команды конца цикла, плюс, еще один байт указывающий размер адреса и сам адрес, геморойно в компиляторе такое реализовать и отлаживать неудобно, но в итоге, мы получим цикл который будет медленее, но более простую реализацию, не знаю, как лучше сделать?
Добавлено спустя 09 мин 21 с:
Кстати, да, все еще думаю о названии, хочу избавится от мата , думаю сделать BF++ или BF#, как лучше?
Неактивен