Brainfuck

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>FLACI_c2397ghfqkgzsg</language>
'''Brainfuck''' ist eine ganz einfache Programmiersprache  (von Urban Müller, Schweiz, 1993). Müllers Ziel war es, eine einfache Turing-Vollständige Sprache zu entwerfen, welche mit einem möglichst kleinen Compiler übersetzt werden kann. Ein Brainfuck-Programm ähnelt dabei stark der formalen Definition einer Turingmaschine.

<html>
<style>
img {
	max-width:100%;
	height:auto;
}
</style>
</html>

[[Bild:Abb114demcomputerinshirngeschaut.jpg]]

Brainfuck besitzt acht Befehle, jeweils bestehend aus einem einzigen Zeichen:
{| class="wikitable"
|-
!Zeichen
!C-Äquivalent
!Semantik
|-
|&gt;|| ++ptr; 
|inkrementiert den Zeiger
|-
|&lt;|| --ptr; 
|dekrementiert den Zeiger
|-
| + || ++*ptr; 
|inkrementiert den aktuellen Zellenwert
|-
| - || --*ptr; 
|dekrementiert den aktuellen Zellenwert
|-
|.|| putchar(*ptr); 
|Gibt den aktuellen Zellenwert als ASCII-Zeichen auf der Standardausgabe aus
|-
|,|| *ptr = getchar(); 
|Liest ein Zeichen von der Standardeingabe und speichert dessen ASCII-Wert in der aktuellen Zelle
|-
|[|| while (*ptr) { 
|Springt nach vorne, hinter den passenden ]-Befehl, wenn der aktuelle Zellenwert 0 ist
|-
|]|| } 
|Springt zurück, hinter den passenden [-Befehl, wenn der aktuelle Zellenwert nicht 0 ist
|}


Zur besseren Vorstellung wird hier der Speicher am Ende der Verarbeitung gezeigt.

<html>
<div id="BFMemory" style="padding:4px;border:1px solid gray"></div>
<style>
#BFMemory td {text-align:center; padding:2px; background:#f3f3f3}
</style>
</html>

<run id="5dd398be95404">
</run>

Hier ein Hallo World! Programm in Brainfuck:

<run id="5db1736d87d73">
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]
>++++++++[<++++>-] <.>+++++++++++[<++++++++>-]<-.--------.+++
.------.--------.[-]>++++++++[<++++>- ]<+.[-]++++++++++.
</run>

<run id="5db1890306746">
-,[                         Read first character and start outer character reading loop
    -[                       Skip forward if character is 0
        >>++++[>++++++++<-]  Set up divisor (32) for division loop
                               (MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
        <+<-[                Set up dividend (x minus 1) and enter division loop
            >+>+>-[>>>]      Increase copy and remainder / reduce divisor / Normal case: skip forward
            <[[>+<-]>>+>]    Special case: move remainder back to divisor and increase quotient
            <<<<<-           Decrement dividend
        ]                    End division loop
    ]>>>[-]+                 End skip loop; zero former divisor and reuse space for a flag
    >--[-[<->+++[-]]]<[         Zero that flag unless quotient was 2 or 3; zero quotient; check flag
        ++++++++++++<[       If flag then set up divisor (13) for second division loop
                               (MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
            >-[>+>>]         Reduce divisor; Normal case: increase remainder
            >[+[<+>-]>+>>]   Special case: increase remainder / move it back to divisor / increase quotient
            <<<<<-           Decrease dividend
        ]                    End division loop
        >>[<+>-]             Add remainder back to divisor to get a useful 13
        >[                   Skip forward if quotient was 0
            -[               Decrement quotient and skip forward if quotient was 1
                -<<[-]>>     Zero quotient and divisor if quotient was 2
            ]<<[<<->>-]>>    Zero divisor and subtract 13 from copy if quotient was 1
        ]<<[<<+>>-]          Zero divisor and add 13 to copy if quotient was 0
    ]                        End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
    <[-]                     Clear remainder from first division if second division was skipped
    <.[-]                    Output ROT13ed character from copy and clear it
    <-,                     Read next character
]                            End character reading loop
</run>

Zur Hilfestellung die ASCII-Tabelle:

{| class="toptextcells"
|-
|
{| class="wikitable" style="margin:0;"
|- class="hintergrundfarbe6"
! Dez !! ASCII
|-
| 0 ||NUL
|-
| 1 ||SOH
|-
| 2 ||STX
|-
| 3 ||ETX
|-
| 4 ||EOT
|-
| 5 ||ENQ
|-
| 6 ||ACK
|-
| 7 ||BEL
|-
| 8 ||BS
|-
| 9 ||HT
|-
| 10 ||LF
|-
| 11 ||VT
|-
| 12 ||FF
|-
| 13 ||CR
|-
| 14 ||SO
|-
| 15 ||SI
|-
| 16 ||DLE
|-
| 17 ||DC1
|-
| 18 ||DC2
|-
| 19 ||DC3
|-
| 20 ||DC4
|-
| 21 ||NAK
|-
| 22 ||SYN
|-
| 23 ||ETB
|-
| 24 ||CAN
|-
| 25 ||EM
|-
| 26 ||SUB
|-
| 27 ||ESC
|-
| 28 ||FS
|-
| 29 ||GS
|-
| 30 ||RS
|-
| 31 ||US
|}
|
{| class="wikitable" style="margin:0;"
|- class="hintergrundfarbe6"
! Dez !! ASCII
|-
| 32 ||SP
|-
| 33 ||!
|-
| 34 ||"
|-
| 35 ||#
|-
| 36 ||$
|-
| 37 ||%
|-
| 38 ||&
|-
| 39 ||'
|-
| 40 ||(&nbsp;
|-
| 41 ||&nbsp;)
|-
| 42 ||*
|-
| 43 ||+
|-
| 44 ||,
|-
| 45 ||-
|-
| 46 ||.
|-
| 47 ||/
|-
| 48 ||0
|-
| 49 ||1
|-
| 50 ||2
|-
| 51 ||3
|-
| 52 ||4
|-
| 53 ||5
|-
| 54 ||6
|-
| 55 ||7
|-
| 56 ||8
|-
| 57 ||9
|-
| 58 ||:
|-
| 59 ||;
|-
| 60 ||<
|-
| 61 ||=
|-
| 62 ||>
|-
| 63 ||?
|}
|
{| class="wikitable" style="margin:0;"
|- class="hintergrundfarbe6"
! Dez !!  ASCII
|-
| 64 ||@
|-
| 65 ||A
|-
| 66 ||B
|-
| 67 ||C
|-
| 68 ||D
|-
| 69 ||E
|-
| 70 ||F
|-
| 71 ||G
|-
| 72 ||H
|-
| 73 ||I
|-
| 74 ||J
|-
| 75 ||K
|-
| 76 ||L
|-
| 77 ||M
|-
| 78 ||N
|-
| 79 ||O
|-
| 80 ||P
|-
| 81 ||Q
|-
| 82 ||R
|-
| 83 ||S
|-
| 84 ||T
|-
| 85 ||U
|-
| 86 ||V
|-
| 87 ||W
|-
| 88 ||X
|-
| 89 ||Y
|-
| 90 ||Z
|-
| 91 ||[
|-
| 92 ||\
|-
| 93 ||]
|-
| 94 ||^
|-
| 95 ||_
|}
|
{| class="wikitable" style="margin:0;"
|- class="hintergrundfarbe6"
! Dez !! ASCII
|-
| 96 ||`
|-
| 97 ||a
|-
| 98 ||b
|-
| 99 ||c
|-
| 100 ||d
|-
| 101 ||e
|-
| 102 ||f
|-
| 103 ||g
|-
| 104 ||h
|-
| 105 ||i
|-
| 106 ||j
|-
| 107 ||k
|-
| 108 ||l
|-
| 109 ||m
|-
| 110 ||n
|-
| 111 ||o
|-
| 112 ||p
|-
| 113 ||q
|-
| 114 ||r
|-
| 115 ||s
|-
| 116 ||t
|-
| 117 ||u
|-
| 118 ||v
|-
| 119 ||w
|-
| 120 ||x
|-
| 121 ||y
|-
| 122 ||z
|-
| 123 ||{
|-
| 124 ||&#124;
|-
| 125 ||}
|-
| 126 ||~
|-
| 127 ||DEL
|}
|}

Viele Ideen und Aufgaben rund um Brainfuck gibt es auch auf [https://www.swisseduc.ch/informatik/programmiersprachen/brainfuck/ Swisseduc]