This is a really basic commandline brainfuck interpreter, it’s not written for speed or performance, it just shows you how a brainfuck interpreter should work. Of course you can speed it up by converting the code to a form of bytecode, working with pointers or even convert it to machine code.
program Brainfuck;
{$APPTYPE CONSOLE}
uses
Classes;
const
ARRAY_SIZE = 30000;
type
TBFEngine = class
private
FScript: TStrings;
FCompiled: AnsiString;
FArr: array of Byte;
FIndex: Integer;
procedure Compile;
procedure ClearArray;
public
constructor Create;
destructor Destroy; override;
procedure Run;
property Script: TStrings read FScript;
end;
{ TBFEngine }
procedure TBFEngine.ClearArray;
var
i, l: Integer;
begin
l := Length(FArr);
for i := 0 to l - 1 do
FArr[i] := 0;
end;
procedure TBFEngine.Compile;
var
i, l: Integer;
begin
l := Length(FScript.Text);
FCompiled := '';
for i := 1 to l do
if FScript.Text[i] in ['>', '<', '+', '-', '.', ',', '[', ']'] then
FCompiled := FCompiled + FScript.Text[i];
end;
constructor TBFEngine.Create;
begin
FScript := TStringList.Create;
SetLength(FArr, ARRAY_SIZE);
end;
destructor TBFEngine.Destroy;
begin
FScript.Free;
end;
procedure TBFEngine.Run;
var
c: AnsiChar;
i, j, l, t: Integer;
begin
Compile;
ClearArray;
t := 0;
FIndex := 0;
l := Length(FCompiled);
i := 1;
while i <= l do
begin
case FCompiled[i] of
'>':
if FIndex <> (ARRAY_SIZE - 1) then
Inc(FIndex);
'<':
if FIndex <> 0 then
Dec(FIndex);
'+': Inc(FArr[FIndex]);
'-': Dec(FArr[FIndex]);
'.': Write(Chr(FArr[FIndex]));
',': Read(FArr[FIndex]);
'[':
if not Boolean(FArr[FIndex]) then
for j := i + 1 to l do
begin
c := FCompiled[j];
if c = '[' then
Inc(t)
else if c = ']' then
if t <> 0 then
Dec(t)
else begin
i := j;
Break;
end;
end;
']':
if Boolean(FArr[FIndex]) then
for j := i - 1 downto 1 do
begin
c := FCompiled[j];
if c = ']' then
Inc(t)
else if c = '[' then
if t <> 0 then
Dec(t)
else begin
i := j;
Break;
end;
end;
end;
Inc(i);
end;
end;
var
Engine: TBFEngine;
begin
if ParamCount = 1 then
begin
Engine := TBFEngine.Create;
Engine.Script.LoadFromFile(ParamStr(1));
Engine.Run;
Engine.Free;
end;
end.
Hello world in brainfuck:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.——.——–.>+.>.