awib

a brainfuck compiler written in brainfuck

  • 所有者: matslina/awib
  • 平台:
  • 許可證: GNU General Public License v3.0
  • 分類:
  • 主題:
  • 喜歡:
    0
      比較:

Github星跟蹤圖

Awib is a brainfuck compiler entirely written in brainfuck.

  • Awib implements several optimization strategies and its compiled
    output outperforms that of many other brainfuck compilers
  • Awib is itself a 4-language polyglot and can be run/compiled
    as brainfuck, Tcl, C and bash
  • Awib has 6 separate backends and is capable of
    compiling brainfuck source code to Linux executables (i386) and
    five programming languages: C, Tcl, Go, Ruby and Java

Usage

Feed awib brainfuck source code as input and the compiled program
will be written as output.

Awib is a cross-compiler. The supported target platforms are
listed below. By default, the target "lang_c" is chosen.

To specify a target platform, insert a line on the form "@TARGET"
(without the quotation marks and with "TARGET" suitably replaced)
at the very beginning of the source code you wish to compile.
Awib will then produce output accordingly.

386_linux - Linux executables for i386
lang_c    - C code
lang_ruby - Ruby code
lang_go   - Go code
lang_tcl  - Tcl code
lang_java - Java code

For instance, the following input would produce an executable hello
world-program for Linux:

@386_linux
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.

The following would produce a hello world-program in Ruby:

@lang_ruby
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.

And this file would give you the hello world-program in C:

@lang_c
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.

Optimizations

Awib is an optimizing compiler:

  • Sequences of '-','>','<' and '+' are contracted into single
    instructions. E.g. "----" is replaced with a single SUB(4).
  • Mutually cancelling instructions are reduced. E.g. "+++-->><"
    is equivalent to "+>" and is compiled accordingly.
  • Some common constructs are identified and replaced with single
    instructions. E.g. "[-]" is compiled into a single SET(0).
  • Loops known to never be entered are removed. This is the case
    for loops opened at the very beginning of a program (when all
    cells are 0) and loops opened immediately after the closing
    of another loop.
  • Copy and multiplication loops are replaced with constant time
    operations. E.g. "[->>+++<+<]" is compiled into two RMUL(2, 3),
    RMUL(1,1)), SET(0)..

Requirements

Awib will run smoothly in any brainfuck environment where:

  • Cells are 8-bit or larger
  • The read instruction ',' (comma) issued after end of
    input results in 0 being written OR -1 being written
    OR no change being made to the cell at all.

The vast majority of brainfuck environments meet these criteria.

Since awib is polyglot, it is also possible to compile and/or run awib
directly as C, tcl or bash. For instance, using gcc, the following
will build an executable file called awib from awib-0.2.b.

$ cp awib-0.2.b awib-0.2.c
$ gcc awib-0.2.c -o awib.tmp
$ ./awib.tmp < awib-0.2.b > awib-0.2.c
$ gcc -O2 awib-0.2.c -o awib

Using bash works fine, but is very very very slow:

$ (echo "@386_linux"; cat awib.b), bash awib.b > awib
$ chmod +x awib

And tcl:

$ (echo "@386_linux"; cat awib.b), tclsh awib.b > awib
$ chmod +x awib

Environment

Code compiled with awib will execute in an environment where:

  • Cells are 8-bit wrapping integers.
  • Issuing the read instruction ',' (comma) after
    end of input results in the current cell being
    left as is (no-change on EOF).
  • At least 2^16-1 = 65535 cells are available.
  • Operating beyond the available memory, in either
    direction, results in undefined behaviour.

License

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Mats Linander, 2014-09-14

主要指標

概覽
名稱與所有者matslina/awib
主編程語言Brainfuck
編程語言Assembly (語言數: 7)
平台
許可證GNU General Public License v3.0
所有者活动
創建於2013-10-31 21:22:51
推送於2025-02-16 12:23:50
最后一次提交2025-02-16 07:23:49
發布數4
最新版本名稱v0.4 (發布於 )
第一版名稱v0.1 (發布於 )
用户参与
星數556
關注者數12
派生數17
提交數157
已啟用問題?
問題數3
打開的問題數0
拉請求數15
打開的拉請求數1
關閉的拉請求數1
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?