Pull to refresh

Comments 17

Кстати, весь исходный код можно было бы хорошо сжать. Кажесь, там большую часть кода занимают смещения по регистрам. У меня их всего 32, но можно было бы обойтись восьмью: четыре общего назначения, четыре временных. Это бы сделало код в несколько раз короче

Можно и без сокращения числа регистров сократить код. Набросал простенький оптимизатор на js :)

let program = '>>><<<<+<<>>>';
let oldp, newp = program;
do { oldp = newp; newp = oldp.replace(/><|<>/g, ''); } while (oldp != newp);
console.log(newp); // <+>

Круть! Написал похожий оптимизатор на хаскеле, добавил схлопывание плюсов с минусами, немного модифицировал кодогенераторы, чтобы программы были подогнаны под оптимизатор и скомпилированный код стал в разы короче

Ох, эта красота заставила улыбнуться

И в целом хороший туториал по теме «как и желудей и веток получились процессоры»

Годнота! итоговый код на brainfuck выглядит сильно оптимальнее того что генерирует C2bf - там такая лютая стек-машина генерируется, что производительность падает в сотни раз по сравнению с нативым кодом на bf.

Возьму себе на вооружение - буду программки для лампового компьютера генерировать. Осталось только выучить хаскель :)

Стековая машина присутствует в дизайне эзотерического языка Befunge и его вариантов.
тоже есть где "развернуться" :)

Продвинутые эйчары еще не начали на литкоде предлагать быстренько порешать задачи на bf?

Ну это не совсем буханка, подобные техники использовались в локальных DRM защитах, когда код ее ядра компилировался в "виртуальную машину" которая представляла из себя лютый трэш.

Я про картинку в конце статьи.

Я конечно нуб в BF, но имея только указанные операции, как присваивается начальное значение для того, что будет изменяться?

[-]++...+. В си это эквивалентно

while(*ptr) {
    *ptr --;
}
// Тут *ptr == 0 
*ptr ++;
*ptr ++;
// ...
*ptr ++;
// Тут у *ptr нужное значение

Спасибо. Стало понятнее.

В качестве дополнительного комментария. Первые три символа - это очищение ячейки (можно и опускать, но никто не гарантирует, что там раньше был 0), потом плюсиками увеличиваем значение ячейки до нужного значения. И вот здесь можно применить небольшую хитрость.

например надо в ячейку записать число 27.

решение в лоб - вбиваем 27 плюсов.

+++++++++++++++++++++++++++

решение два. представим число 27 как 5*5+2 на bf это будет выглядеть так:

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

прыгаем на следующую ячейку, заносим туда число 5. возвращаемся на текущую ячейку. увеличиваем ее на 5, прыгаем на следующую ячейку, уменьшаем ее на 1 и если не ноль, то возвращаемся на знак "[" и повторяем цикл. получаем 5*5. осталось только добавить 2.

В результате получили сокращение кода. И чем больше число, тем больше будет сокращение.

Для автора, это кстати, идея для организации дальнейшей оптимизации получаемого кода.

Можно несколько констант задавать одновременно и таким образом сжать код ещё сильнее.

В bfc простор для оптимизаций просто огромный, но я все нетривиальные оптимизации отметаю в угоду универсальности кода, так как хочу замахнуться ещё на уровень выше

Sign up to leave a comment.

Articles