mindblown 0.4.1

Brainfuck to x86 ELF compiler with batteries included.
# mindblown

Brainfuck to x86 ELF compiler with batteries included written in Rust meant for Linux and Windows under WSL. Code generation is made from brainf\*\*k directly to x86 Intel assembly as IR. Most of the optimization work is done when parsing, so an integrated interpreter can benefit from it too. 

This is in a very early state. Stay tuned for more features and optimizations like the ones described in [TODO](#todo).

> Note:
`samples/patterns.py` was solely used for detecting common loop patterns in classical brainf\*\*k programs for present and future refactoring.

## Table of Contents

- [mindblown]#mindblown
  - [Table of Contents]#table-of-contents
  - [Prerequisites]#prerequisites
  - [Getting started]#getting-started
  - [Usage]#usage
    - [Compile a brainf\*\*k program]#compile-a-brainfk-program
  - [Inspiration]#inspiration
  - [TODO]#todo

## Prerequisites

* [Rust]https://www.rust-lang.org/tools/install
* [GCC]https://gcc.gnu.org/install/
* [WSL]https://docs.microsoft.com/en-us/windows/wsl/install-win10 (for Windows users)


## Getting started

Get the latest binary release installed on your machine
```sh
# Get the latest cargo release

$ cargo install mindblown

# Build from source

$ git clone https://github.com/Noxtal/mindblown.git
$ cd mindblown
$ cargo build --release
```

## Usage

```sh
mindblown 0.4.0
Brainfuck to x86 ELF compiler with batteries included.

USAGE:
    mindblown [SUBCOMMAND]

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information

SUBCOMMANDS:
    compile    Compiles a Brainfuck file.
    help       Print this message or the help of the given subcommand(s)
```

> If no subcommand is provided, `mindblown` will default to the intergrated interpreter, which also uses the [snailquote]https://github.com/euank/snailquote syntax for input. Please refer to their [documentation]https://docs.rs/snailquote/latest/snailquote/fn.unescape.html for more information.

### Compile a brainf\*\*k program

```sh
mindblown-compile
Compiles a Brainfuck file.

USAGE:
    mindblown compile [OPTIONS] <FILE>

ARGS:
    <FILE>    The Brainfuck file to compile.

OPTIONS:
    -h, --help               Print help information
    -o, --output <OUTPUT>    The output file.
    -r, --run                Run the compiled executable after compiling.
```

## Inspiration

* https://github.com/pretzelhammer/rust-blog/blob/master/posts/too-many-brainfuck-compilers.md#intro-to-x86 for the x86 assembly codegen
* https://github.com/pretzelhammer/brainfuck_compilers/blob/master/src/x86_64/compiler.rs for examples of the x86_64 assembly codegen in Rust
* http://calmerthanyouare.org/2015/01/07/optimizing-brainfuck.html for optimizing brainf\*\*k
* http://brainfuck.org for most programs in the `samples` folder


## TODO

- [x] Make the interpreter take in newlines
- [x] Add various CLI features such as choosing the output file, etc.
- [x] Implement clearer and smarter error handling
- [ ] Optimize loop handling to Assembly
- [ ] Allow for more optimization