Привет всем, кто читает. Эта статья будет настолько необычной, насколько вообще может быть необычной статья на Хабре. Если вы любите brainfuсk, думаю, вам будет довольно интересно. Выдохните, получите удовольствие от просмотра картинок под катом.
TL;DR
gifs
в цвете:
hello world c циклами
Все исходные коды доступны на github.
+[>+]
в цвете:
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зу и потом поисследовать код на тему самомодификации.
Комментарии (6)
MichaelBorisov
14.05.2015 15:29Я написал виртуальную машину, с собственным простым байт-кодом на С. (Решение не использовать интерпретатор появилось именно из-за необходимость хотя бы чуть развить навыки в виртуальных машинах, байт-коде и всем таком.
Не совсем понятно, как вам удалось отказаться от интерпретатора. Как я понял, вы транслируете Brainfuck не в машинный код, а байт-код не может исполняться на процессоре непосредственно (см. Википедия: байт-код). Для него тоже нужен интерпретатор. В своей простоте Brainfuck фактически сам является байт-кодом, поэтому непонятно, каких улучшений можно добиться, если транслировать его в другой интерпретируемый байт-код, а не исполнять интерпретатором непосредственно.
Далее в статье (раздел «спецификации») вы упоминаете некий 8-битный процессор. Какое отношение имеет этот процессор к проекту? Или это разрядность АЛУ виртуальной машины, исполняющей ваш байт-код?StrangerInRed Автор
14.05.2015 15:34Да, это разрядность АЛУ виртуальной машины, исполняющей байт-код. Возможно я не совсем конкретно выразился в этом случае. Если реализовать VM в железе, то трансляция будет фактически в машинный код.
StrangerInRed Автор
14.05.2015 15:37+1Можете посмотреть сами сорцы. Там все очень просто. Разница просто в том, что сначала вся программа компилируется (опять же если vm выполнена в железе). А потом выполняет на VM.
Nicolette
15.05.2015 02:47+1Я надеялась увидеть Visual Programming на Brainfuck — это было бы действительно необычно :-)
morgreek
Хм, красиво) Как насчёт подобия кода из «матрицы»?)
StrangerInRed Автор
Можете попробовать сделать) Я тоже попробую, но это будет настоящий brainfuck.