Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/thehxdev/bfi
Fast and efficient BrainFuck compiler and interpreter written in C
https://github.com/thehxdev/bfi
assembly brainfuck brainfuck-compiler brainfuck-interpreter c compiler interpreter nix
Last synced: 3 days ago
JSON representation
Fast and efficient BrainFuck compiler and interpreter written in C
- Host: GitHub
- URL: https://github.com/thehxdev/bfi
- Owner: thehxdev
- Created: 2024-01-28T19:30:31.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-04-05T19:25:41.000Z (8 months ago)
- Last Synced: 2024-04-05T20:31:32.432Z (7 months ago)
- Topics: assembly, brainfuck, brainfuck-compiler, brainfuck-interpreter, c, compiler, interpreter, nix
- Language: C
- Homepage:
- Size: 91.8 KB
- Stars: 6
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# BFI
BFI is a fast and efficient BrainFuck interpreter and compiler written in C (C99).
For more information about BrainFuck read the [BrainFuck wikipedia page](https://en.wikipedia.org/wiki/Brainfuck).
You can find more complex and interesting examples in [brainfuck.org](https://brainfuck.org) website.
download `*.b` source files and execute them with BFI.## Build
First clone the source code using git.
```bash
git clone --depth=1 --branch=main https://github.com/thehxdev/bficd bfi
```Make sure that you have a C compiler like `gcc` or `clang` and `make` installed.
### make build options:
- `OPTIMIZE`:
To compile with debug information, set `OPTIMIZE` to 0.- `SAFE`:
To add memory access protections set `SAFE` to 1.
This makes bfi (a little) slower but out of range accesses to memory while executing BrainFuck source code will be catched.
(This only affects the interpreter and NOT the compiler!)- `STATIC`:
Set `STATIC` option to 1 to build bfi as a standalone, staticly linked binary using [musl libc](https://musl.libc.org/).
But befor that, make sure that you have `musl-clang` and musl libc installed.### Build bfi
Build bfi using the folloing command:
```bash
make OPTIMIZE=1
```
Then you can use `bfi` executable in `build/` directory.## Usage
You can use `bfi` as an interpreter or a compiler.### Interpreter
After you built `bfi`, You can run examples provided in `examples` directory. Just execute `bfi` and provide
the source code file as first command-line arugment.
while you are in the project root directory:
```bash
# run `examples/helloWorld.bf` file
# this will print `Hello World!` to stdout
./build/bfi 'examples/helloWorld.bf'
```### Compiler
To compile BrainFuck source code to **x64 Assembly** (AT&T Syntax), provide source code file as first argument
and output file as second argument.
Then you can use `gcc` to build the executable from generated assembly file.
```bash
# compile `examples/helloWorld.bf` file to `helloWorld.S`
./build/bfi 'examples/helloWorld.bf' './helloWorld.S'# assemble `helloWorld.S` file
gcc './helloWorld.S'
```## More Info
bfi ignores all characters that are not a valid BrainFuck command. BrainFuck has only 8 commands:
- `>` : increment data pointer by one
- `<` : decrement data pointer by one
- `+` : increment byte at the data pointer by one
- `-` : decrement byte at the data pointer by one
- `.` : output the data at data pointer (print to stdout as single character)
- `,` : accept one character from stdin and store it in data pointer
- `[` : jump to next command of matching `]`, if the data pointer's data is zero
- `]` : jump to next command of matching `[` (goes backward), if the data pointer's data is non-zero