2016-12-22 22:58:20 +01:00
|
|
|
bfc
|
|
|
|
===
|
|
|
|
|
2016-12-24 22:27:38 +01:00
|
|
|
'bfc' is a small, fast, self-contained, optimizing Brainfuck compiler for *nix
|
2016-12-24 22:42:21 +01:00
|
|
|
on Intel x86-64.
|
2016-12-22 22:58:20 +01:00
|
|
|
|
|
|
|
Also included are several interpreters in various states of sophistication that
|
|
|
|
document my progress as I was writing this, from the simplest approach to an
|
|
|
|
optimizing JIT compiler.
|
|
|
|
|
|
|
|
It's pretty easy to retarget the compiler, it just means redoing half the work.
|
2016-12-24 22:42:21 +01:00
|
|
|
Thanks to the unified ABI, adding support for another flavour of *nix only means
|
|
|
|
changing the syscall numbers. The compiler itself is platform agnostic.
|
2016-12-22 22:58:20 +01:00
|
|
|
|
|
|
|
Building
|
|
|
|
--------
|
|
|
|
Build dependencies: a C99 compiler +
|
2016-12-24 22:27:38 +01:00
|
|
|
Runtime dependencies: Linux or OpenBSD
|
2016-12-22 22:58:20 +01:00
|
|
|
|
|
|
|
$ git clone https://github.com/pjanouch/bfc.git
|
|
|
|
$ cd bfc
|
|
|
|
$ make
|
|
|
|
|
|
|
|
To obtain dumps of the intermediate representation, compile with `-DDEBUG`:
|
|
|
|
|
|
|
|
$ make CPPFLAGS=-DDEBUG
|
|
|
|
|
|
|
|
Usage
|
|
|
|
-----
|
|
|
|
|
2016-12-24 22:42:21 +01:00
|
|
|
$ ./bfc-amd64-linux [INPUT-FILE] [OUTPUT-FILE]
|
|
|
|
$ ./bfc-amd64-openbsd [INPUT-FILE] [OUTPUT-FILE]
|
2016-12-22 22:58:20 +01:00
|
|
|
|
2016-12-22 23:40:30 +01:00
|
|
|
When no input file is specified, standard input is used. Similarly, the default
|
|
|
|
output filename is `a.out`. After the compilation, the resulting file can be
|
|
|
|
run on the target platform.
|
2016-12-22 22:58:20 +01:00
|
|
|
|
2017-01-19 01:22:30 +01:00
|
|
|
gdb
|
|
|
|
---
|
|
|
|
You may have noticed the `gdb-experiment.go` file. It is a non-optimizing
|
|
|
|
version of the compiler targeting Linux only that adds DWARF debugging
|
|
|
|
information mapping code locations onto lines in the `ir-dump.txt` byproduct
|
|
|
|
output file. It's been rewritten in Go since managing all those binary buffers
|
|
|
|
required to build the symbol table proved to be too painful in C.
|
|
|
|
|
|
|
|
$ go run gdb-experiment.go [INPUT-FILE] [OUTPUT-FILE]
|
|
|
|
|
|
|
|
Use `break *0x4000b7` to get a breakpoint at the first Brainfuck instruction.
|
|
|
|
|
2017-01-21 23:49:16 +01:00
|
|
|
image::gdb-experiment.png[align="center"]
|
|
|
|
|
2017-06-20 19:30:00 +02:00
|
|
|
There is also `gdb-object-file.go` that generates an object file that can be
|
2017-06-25 22:22:00 +02:00
|
|
|
statically linked with `ld`, and `gdb-object-file-libc.go` generates an
|
|
|
|
OS-independent binary that can be linked against the libc with the C compiler:
|
2017-06-20 19:30:00 +02:00
|
|
|
|
|
|
|
$ go run gdb-object-file-libc.go program.bf program.o
|
|
|
|
$ cc program.o -o program
|
|
|
|
|
2016-12-22 22:58:20 +01:00
|
|
|
Contributing and Support
|
|
|
|
------------------------
|
|
|
|
Use this project's GitHub to report any bugs, request features, or submit pull
|
|
|
|
requests. If you want to discuss this project, or maybe just hang out with
|
|
|
|
the developer, feel free to join me at irc://irc.janouch.name, channel #dev.
|
|
|
|
|
2017-06-20 19:30:00 +02:00
|
|
|
Bitcoin donations: 12r5uEWEgcHC46xd64tt3hHt9EUvYYDHe9
|
|
|
|
|
2016-12-22 22:58:20 +01:00
|
|
|
License
|
|
|
|
-------
|
|
|
|
'bfc' is written by Přemysl Janouch <p.janouch@gmail.com>.
|
|
|
|
|
|
|
|
You may use the software under the terms of the ISC license, the text of which
|
|
|
|
is included within the package, or, at your option, you may relicense the work
|
|
|
|
under the MIT or the Modified BSD License, as listed at the following site:
|
|
|
|
|
|
|
|
http://www.gnu.org/licenses/license-list.html
|