> | Increment the pointer |
< | Decrement the pointer |
+ | Increment the byte at the pointer |
- | Decrement the byte at the pointer |
. | Output the byte at the pointer |
, | Input a byte and store it in the byte at the pointer |
[ | Jump forward past the matching ] if the byte at the pointer is zero |
] | Jump backward to the matching [ unless the byte at the pointer is zero |
Click here for a brief description of the language. The wikipedia entry is more detailed spoiling the fun in discovering the quirks of the language.
I started writing an interpreter for BF in Ruby, which was a simple switch. But the interesting part is actually writing code in BF. Its much more challenging than Assembly language because of the instruction set and using a tape like memory without any registers.
Here is the BF interpreter in Ruby:
if ARGV.length != 1
puts "Usage: ruby brainfuck.rb filename"
exit
end
mem = Array.new(30000,0x00)
loopstack = Array.new
p = 0
code = File.open(ARGV[0]).readlines.join("")
i=0
while i < code.length
case code[i]
when '>'
p += 1
when '<'
p -= 1
when '+'
mem[p] += 1
when '-'
mem[p] -= 1
when '.'
print mem[p].chr
when ','
mem[p] = STDIN.getc
when '['
if mem[p].zero?
i = code.index(']',i)
else
loopstack.push i
end
when ']'
if(mem[p].zero?)
loopstack.pop
else
i = loopstack.last
end
end
i+=1
end
And here is the traditional HelloWorld program in BF:
#H
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++
.
>
#e
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
+
.
>
#l
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
.
>
#l
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
.
>
#o
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++
.
>
#SPACE
++++++++++++++++++++++++++++++++
.
>
#w
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++
.
>
#o
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++
.
>
#r
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++
.
>
#l
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
.
>
#d
++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++
.
So long for HelloWorld? This would probably be the worst language for beginners!
The only work in the Interpreter was managing loops expressed using [ and ]. I ended up using a stack to manage loops similar to the way stacks are used in procedural languages to transfer control to methods and return back.
Here is a program to iterate from 0 to 9 in BF:
#ASCII value of 0
++++++++++++++++++++++++++++++++++++++++++++++++
>
#Loop counter variable
++++++++++
[
< . + >
-
]
No comments:
Post a Comment