Here I made an update that allow to see the execution of the automaton in real time.
--[moonscript] --brainfuck interpreter by oSchyns --version 0.3.0 BF="++++ ++++".. "[>+++++ +++++<-]".. ">++++.----- ----- -.--- ---."--.. --uncomment to test error output --"<< force a tape outbound" IN="" --tape to perform computation class Tape new:(l,m)=> @l=l --cell limit @m=m --loop the finite tape @t={} --tape @h=0 --read head --correct values @l-=1 if @l~=nil @m-=1 if @m~=nil --rhead out of the bounds of the tape unbound:=> if @m~=nil then return @h>@m @h<0 --init nil cell to zero init:=> @t[@h]=0 if @t[@h]==nil --move read head to the left mvL:=> @h-=1 if @m~=nil then if @h<0 @h=@m --move read head to the right mvR:=> @h+=1 if @m~=nil then if @h>@m @h=0 --decreament cell decr:=> @init! @t[@h]-=1 if @l~=nil then if @t[@h]<0 @t[@h]=@l --increament cell incr:=> @init! @t[@h]+=1 if @l~=nil then if @t[@h]>@l @t[@h]=0 --ins: insert value in cell --out: get value from cell ins:(i)=> @t[@h]=i if i~=nil out: => @t[@h] or 0 --stack to hold indexes of brackets class Stack new: => @s={} top: => @s[#@s] pop: => @s[#@s]=nil push:(i)=> @s[#@s+1]=i --automaton to execute the program class Automaton new:(p,i,l,m)=> @t=Tape l,m --tape @s=Stack! --stack @r=1 --read head @p="" --program @i=i --input @o="" --output @e=nil --error --strip useless chars of program for c in p\gmatch "[<>%+%-%[%]%.%,]+" @p..=c b=@check! if b~=nil @e="brackets mismatch at "..b --check for brackets mismatch check:=> s=Stack! for i=1,#@p if @program(i)=='[' then s\push i elseif @program(i)==']' return i if #s.s<=0 s\pop! return s\top! if #s.s> 0 return nil --get char from input input:=> if @i==nil or @i=="" then return nil c1=@i\byte! --1st char of i @i=@i\sub 2 --remove 1st char return c1 --output: add char to output --program: get instruction at 'n' --continue: continue execution output: (n)=> @o..=string.char n program:(n)=> @p\sub n,n continue: => @r<=#@p and @e==nil --find matching bracket match:(b)=> m=1 while m>0 and b<=#@p b+=1 if @program(b)=='[' then m+=1 elseif @program(b)==']' then m-=1 return b --opening bracket open:=> --jump to matching bracket if (@t\out!)==0 then @r=@match @r else @s\push @r --closing bracket clos:=> if (@t\out!)==0 then @s\pop! elseif @s\top! ~=nil then @r=@s\top! --automaton's' execution step step:=> switch @program @r when '<' then @t\mvL! when '>' then @t\mvR! when '-' then @t\decr! when '+' then @t\incr! when ',' then @t\ins @input! when '.' then @output @t\out! when '[' then @open! when ']' then @clos! @r+=1 if @t\unbound! @e="tape outbound !" --display to see the execution class Display new:(a,s=1,f=nil)=> @a=a --automaton @s=s/60 --number of update per second @c=0 --counter @f=3 --display format of cells if f=="hexadecimal" then @f=2 elseif f=="character" then @f=1 --execute automaton all at once execute:=> while @a\continue! @a\step! @output! --update automaton at given frame rate update:=> if @a\continue! if @c<1 then @c+=@s else @c=0 @a\step! @draw! --draw automaton state and output draw:=> cls! @tape 8, 2 @program 8,12 @output 4 --draw the tape tape:(w=6,h=0,c=1,a=3)=> rect 0,h,240,w,c l=math.ceil (40/@f)*0.5 p=(w-6)*0.5 q=6*@f b=l-@a.t.h d=15 if @f==2 then d=6 elseif @f==1 then d=3 rect l*q-d,h,6*@f,w,a for i=@a.t.h-l,@a.t.h+l unless i<0 c=15 c=14 if i==@a.t.h v=@a.t.t[i] or 0 if @f==3 then v="%3d"\format v elseif @f==2 then v="%2x"\format v elseif @f==1 then v=string.char v print v,(i+b)*q-d,h+p,c --draw the program program:(w=6,h=6,c=1,a=3)=> rect 0,h,240,w,c rect 117,h, 6,w,a p=(w-6)*0.5 b=20-@a.r for i=@a.r-20,@a.r+20 unless i<1 c=15 c=14 if i==@a.r v=@a\program i print v,(i+b)*6-2,h+p,c --print result of execution output:(s=0)=> i=s o=@a.o.."\n" --print each line for l in o\gmatch "[%S \t]*\n" print l,0,i*6 i+=1 break if i==21 --no more room --print error unless @a.e==nil print @a.e,0,130,6 --create automaton 'TM' using --program : BF --input : IN TM=Automaton BF,IN,128,nil --create display 'DP' using --automaton : TM --frame rate : 30 --cell display : decimal DP=Display TM,30,"decimal" --execute the automaton and display it export TIC=-> DP\update! --http://moonscript.org/reference/ --http://moonscript.org/compiler/ --https://esolangs.org/wiki/Brainfuck --http://zacstewart.com/2013/09/15/learning-cpp-a-brainfuck-interpreter.html
It is possible to change the width of the tapes and their colors. Also we can change the cell's display to see the values as decimal number, hexadecimal numbers or characters directly. This helps coding in BF a lot.