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
|-
|>|| ++ptr;
|inkrementiert den Zeiger
|-
|<|| --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 ||(
|-
| 41 || )
|-
| 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 |||
|-
| 125 ||}
|-
| 126 ||~
|-
| 127 ||DEL
|}
|}
Viele Ideen und Aufgaben rund um Brainfuck gibt es auch auf [https://www.swisseduc.ch/informatik/programmiersprachen/brainfuck/ Swisseduc]