# 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] ARGS: The Brainfuck file to compile. OPTIONS: -h, --help Print help information -o, --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