Visual Programming на Brainfuck
Привет всем кто читает. Эта статья будет настолько необычной, насколько вообще может быть необычной статья на хабре. Если вы любите brainfuсk думаю вам будет довольно интересно. Выдохните, получите удовольствие от просмотра картинок под катом.TL; DRНе буду нагружать статью исходниками, те, кому будет интересно, всегда смогут найти их наgithub. Лучше расскажу, как на свет появились эти гифки.
Я довольно много программирую на С, и вот однажды кто-то показал мне brainfuck. Я сразу влюбился в этот лаконичный язык, который просто подкупает своей простотой. Brainfuck«у можно научить даже ребенка. И вот я решил написать виртуальную машину под него, как разминку вообще в мире виртуальных машин. Да и разминку для мозга. Программирование ведь для того и создано, чтобы можно было исследовать и открывать. Одним словом — интересно жить.
Я написал виртуальную машину, с собственным простым байт-кодом на С. (Решение не использовать интерпретатор появилось именно из-за необходимость хотя бы чуть развить навыки в виртуальных машинах, байт-коде и всем таком. Например, я хоть и С программист, но ассемблер почти не знаю, т.к. вообще всему обучался сам, google там, все дела и начинал вообще с С++)Она могла исполнять простые программы основанные на выводе данных и сдвигах с инкрементом/декрементом. (++>>--<<-+>)Потом немного позже я добавил if, goto и реализовал компиляцию циклов в байт-код через goto по адресу. (+++[>+<-]) Еще позже я реализовал вложеность циклов. (+++[>+++[>+<-]<-])
Я отложил виртуальную машину на неопределенный срок, т.к. появились более интересные и весомые задачи в С-библиотеке. И вот, вчера мне пришла в голову чудесная мысль смотреть что происходит в памяти VM во время выполнения программы, так сказать заглянуть в недра зверя, почувствовать алгоритмы. В эту тему на просторах интернета была отличная гифка про виды сортировки.
Первым делом прикрутил ncurses, т.к. уже был небольшой опыт работы с ней. Просто после каждого такта работы VM будем отрисовывать RAM в виде квадрата 32×32. Т.к. я любитель acii art, то понял, что можно сделать кроме hex-кодов символов вывод поинтереснее. Использовал цвета в ncurses чтобы отображать каждый байт памяти (т.е. каждое значение памяти от 0 до 255 это цвет). Так и родилась идея наглядного программирования на brainfuck. Еще раз говорю, что все исходные коды доступны на github.
Кстати самая долгая по времени выполнения и короткая по коду программа
+[>+] выполняется за 1305601 циклов VM, и на моей машине без визуализации это происходит намного меньше чем за секунду. А вот с визуализацией занимает около 2х минут.Спецификации Из спецификаций 1 кб OЗУ, 8-бит адресация (максимальный goto на 255 байт), 8-бит процессор. Неограниченная память программ.Зацикленность > и < на 1кб, т.е. считай кольцевая замкнутость.
P.S. Если возникнут вопросы, или предложения отделить код VM от библиотеки в отдельное приложение с опциями, я конечно же это сделаю. Сейчас же, прямо в коде можно прописать свою программу на brainfuck, так же задать визуализацию цветами/hex, и задать задержку выполнения. Можно даже устроить конкурс на лучшую гифку) Еще это открывает хороший простор на тему генетических алгоритмов в программировании. Можно попробовать сделать «игру жизнь» и т.д.
Из планов сделать загрузку программы в oзу и потом поисследовать код на тему самомодификации.