Привет всем кто читает. Эта статья будет настолько необычной, насколько вообще может быть необычной статья на хабре. Если вы любите brainfuсk думаю вам будет довольно интересно.
TL;DR
+[>+]
в цвете:
hello world c циклами
+[>>+]
+[>>>+]
+[>+ >>++ >>>+++ >>>>++++ >>>>>+++++ >>>>>>++++++ >>>>>>>+++++++ >>>>>>>>++++++++]
Все исходные коды доступны на github.
Не буду нагружать программу исходниками, тем, кому будет интересно всегда может найти их на 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зу и потом поисследовать код на тему самомодификации.
ссылка на оригинал статьи http://habrahabr.ru/post/257933/
Добавить комментарий