Brainfuck
Author
Albert FloresBrainfuck (někdy je také eufemisticky nazýván Brainf*ck nebo dokonce Brainf***) je extrémně minimalistický ezoterický programovací jazyk. Byl vytvořen pro pobavení a jako výzva programátorům, pro praktické účely není vhodný.
Popis jazyka
Jazyk Brainfuck vymyslel v roce 1993 švýcarský programátor Urban Müller. Překladač pro počítače Amiga s OS 2. +more0 má velikost pouhých 240 bajtů, některé další překladače jsou dokonce menší než 200 bajtů. Klasická [url=https://web. archive. org/web/20070313151559/http://wuarchive. wustl. edu/pub/aminet/dev/lang/brainfuck-2. lha]Müllerova distribuce verze 2[/url] obsahuje překladač pro počítače Amiga, interpret jazyka, zdrojové kódy ukázkových programů a soubor README se základními informacemi o této distribuci.
Jazyk obsahuje pouze osm příkazů (viz seznam dále). Interpretace příkazů se v Brainfucku provádí sekvenčně, všechny neznámé znaky jsou ignorovány - zdrojový kód lze tedy opatřit komentářem v libovolném místě (komentář pouze nesmí obsahovat klíčové znaky).
Provádění kódu si lze představit jako operace nad polem buněk o velikosti jednoho bajtu. Standardně se používá pole o velikosti 30 000 buněk. +more Hodnoty buněk jsou před spuštěním programu nastaveny na 0. Každá buňka může obsahovat hodnoty v intervalu 8 bitů (tedy 0-255). Nad těmito buňkami se „pohybuje“ ukazatel, který označuje aktuální buňku, se kterou jsou prováděny operace. Tento ukazatel je při spuštění programu nastaven nad první buňku a lze ho posouvat doleva či doprava.
Příkazy
Příkaz | Popis | Ekvivalent v CZmíněné ekvivalenty příkazů Brainfucku v jazyce C vycházejí z předpokladu, že proměnná ptr je deklarována jako unsigned char*. | Ekvivalent v DelphiZmíněné ekvivalenty příkazů Brainfucku v Delphi vycházejí z předpokladu, že proměnná ptr je deklarována jako typ ukazatel na Byte (^Byte) a aplikace je překládána jako konzolová (pro funkce Write a Read). +more |
---|---|---|---|
> | posun datového ukazatele o jednu buňku doprava | ++ptr; | Inc(Ptr); |
< | posun datového ukazatele o jednu buňku doleva | --ptr; | Dec(Ptr); |
+ | zvýšení hodnoty aktivní buňky o 1 (buňky, nad kterou je ukazatel) | ++*ptr; | Inc(Ptr^); |
- | snížení hodnoty aktivní buňky o 1 | --*ptr | Dec(Ptr^); |
. | výpis hodnoty aktivní buňky na standardní výstup (v drtivé většině případů na obrazovku). Pro výpis se používá hodnota aktivní buňky převedená dle kódování ASCII na znak. | putchar(*ptr); | Write(Char(Ptr^)); |
, | uložení hodnoty ze vstupu do aktivní buňky | *ptr=getchar; | Read(Char(Ptr^)); |
[ | pokud je hodnota aktivní buňky rovna nule, provede přesun instrukčního ukazatele doprava za odpovídající ] | while (*ptr) { | while Ptr^ 0 do begin |
] | pokud je hodnota aktivní buňky různá od nuly, provede přesun instrukčního ukazatele doleva na odpovídající [ | } | end; |
Předchůdce Brainfucku
Za formálního předchůdce Brainfucku lze považovat jazyk \mathcal{P}^{\prime\prime} vytvořený Corradem Böhmem v roce 1964. Brainfuck je, kromě dvou vstupních a výstupních (I/O) příkazů, menší obměnou tohoto jazyka.
Příklady
Ve všech následujících příkladech jsou ve vysvětlení buňky označovány jako b
, kde Index je pořadí buňky. První buňka má index 0.
Hello World!
Jako při popisu každého jazyka, i zde se začíná typickou ukázkou - následující program vypíše Hello World! a skončí.
Kód s komentářem
Protože Brainfuck interpretuje pouze klíčové znaky, je v tomto příkladu komentář vložen přímo do zdrojového kódu a pro snadnější orientaci jsou očíslovány řádky.
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
# Přesun na b[4] a přechod na novou řádku (v ASCII kódování znak 'LF' s hodnotou 10). Takto implementovaný přechod na novou řádku je ve formátu Unix, kde jsou řádky oddělovány znakem 'LF'. +more Pro výpis ve formátu Mac by musel být použit znak 'CR' (ASCII hodnota 13), ve formátu DOS by pak musela být použita sekvence těchto znaků ('CR'/'LF').
Nastavení buňky na nulu
Tento fragment programu nastaví aktivní obsah buňky na 0 - hodnota buňky je v každém kroku cyklu snižována o jednu dokud není 0. Pak se cyklus ukončí.
Jednoduchý cyklus
Tento program dokola vypisuje na obrazovku vstup z klávesnice. V prvním příkazu je do b[0] načtena hodnota na vstupu. +more V následujícím cyklu je tato hodnota vypsána na obrazovku a znovu je načtena hodnota na vstupu. Tento cyklus je v podstatě nekonečný, protože z klávesnice nelze vložit znak s ASCII hodnotou 0. Jednoduchou modifikací lze zaručit, že program bude ukončen, když je z klávesnice vložena mezera:.
b[0] - 32 = 0
Přesun hodnoty z buňky do buňky
Kopírování hodnot v buňkách
Sčítání
Tento program sečte číslice na vstupu a vypíše jejich součet pokud je výsledek jednociferný. V případě dvouciferného výsledku vypisuje znak, který má ASCII hodnotu výsledku.
Jazyky založené na Brainfucku
Protože je jazyk Brainfuck jednoduchý, bylo vytvořeno několik dalších programovacích jazyků založených právě na něm.
Doublefuck
Doublefuck je modifikací Brainfucku, který pracuje na dvou páskách. Kromě běžných příkazů Brainfucku zde existuje i druhá sada příkazů pro práci s druhou páskou a je možnost využít i ukazatele. +more Pro tento jazyk byla přijata zkratka DBF.
Vlastnosti jazyka
DBF pracuje se dvěma poli, z nichž každé disponuje svým ukazatelem. Oba ukazatelé jsou po spuštění programu nastaveny na prvním buňku ve svém poli. Hlavní příkazy jazyka jsou:
Příkaz | Popis příkazu |
---|---|
Příkazy z Brainfucku | Příkazy z Brainfucku |
> | Posun prvního datového ukazatele o jednu buňku doprava |
< | Posun prvního datového ukazatele o jednu buňku doleva |
Zvýšení hodnoty prvního pole, konkrétně aktivní buňky o 1 (buňky, nad kterou je první ukazatel) | |
Snížení hodnoty prvního pole, konkrétně aktivní buňky o 1 (buňky, nad kterou je první ukazatel) | |
. | Výpis hodnoty aktivní buňky (buňky, nad kterou je první ukazatel) na standardní výstup (v drtivé většině případů na obrazovku). +more |
, | Uložení hodnoty ze vstupu do aktivní buňky (buňky, nad kterou je první ukazatel) |
[ | Skok za shodu - Pokud je hodnota aktivní buňky (buňky, nad kterou je první ukazatel) rovna nule, provede přesun instrukčního ukazatele doprava za odpovídající ] |
] | Skok před shodu - Pokud je hodnota aktivní buňky (buňky, nad kterou je první ukazatel) různá od nuly, provede přesun instrukčního ukazatele doleva na odpovídající [ |
Příkazy pro práci s druhou páskou | Příkazy pro práci s druhou páskou |
v | Posun druhého datového ukazatele o jednu buňku doprava |
^ | Posun druhého datového ukazatele o jednu buňku doleva |
Zvýšení hodnoty druhého pole, konkrétně aktivní buňky o 1 (buňky, nad kterou je druhý ukazatel) | |
Snížení hodnoty druhého pole, konkrétně aktivní buňky o 1 (buňky, nad kterou je druhý ukazatel) | |
: | Výpis hodnoty aktivní buňky (buňky, nad kterou je druhý ukazatel) na standardní výstup (v drtivé většině případů na obrazovku). |
; | Uložení hodnoty ze vstupu do aktivní buňky (nad kterou je druhý ukazatel) |
{ | Skok za shodu - Pokud je hodnota aktivní buňky (buňky, nad kterou je druhý ukazatel) rovna nule, provede přesun instrukčního ukazatele doprava za odpovídající } |
} | Skok před shodu - Pokud je hodnota aktivní buňky (buňky, nad kterou je druhý ukazatel) různá od nuly, provede přesun instrukčního ukazatele doleva na odpovídající { |
Příklad
Hello world v jazyce Doublefuck:
v++++++++++[-///////v//////////v////v///v////////^^^]//:v/:///////::///:v////:v//: v///////:>+++.+++.------.--------.^/:
Na prvním řádku je vypsáno „Hello, “, na druhém řádku je vypsáno „World!“.
Ostatní modifikace
PATH kombinuje Brainfuck s jazykem Befunge - obsahuje příkazy pro práci ve dvourozměrném prostoru. * Brainfork je více vláknová (multi threadová) implementace Brainfucku. +more Jazyk je rozšířen o příkaz 'Y' pro přepínání mezi jednotlivými vlákny. * Braintwist je Brainfuck doplněný o možnost modifikace vlastního kódu při jeho běhu. * THRAT používá pouze dva klíčové znaky (':' a ';'). Pomocí jejich kombinací se provádí příkazy jako v Brainfucku. Množina příkazů je rozšířena o dva - o příkaz na ukončení programu a o příkaz pro číselný výstup. * L00P nemá příkazy '[' a ']' pro cyklus. Je však doplněn o další příkazy pro cykly a pro manipulaci s hodnotami buněk. * Ook. používá pro provádění příkazů Brainfucku pouze složeniny z klíčových slov 'Ook. ', 'Ook. ' a 'Ook. '. Tento jazyk je parodií na Brainfuck inspirovaný vyjadřovacími schopnostmi knihovníka z příběhů Úžasná Zeměplocha spisovatele Terryho Pratchetta. * COW používá pro provádění příkazů Brainfucku kombinaci klíčových slov Moo. Klíčová slova se rozlišují pouze použitím kapitálek ('Moo', 'MOo', atd. ). * Spoon místo klíčových znaků Brainfucku používá jejich obdobu v Huffmanově kódování. * BrainDuino port BrainFucku na Arduino I/O desku (Atmel ATMega), je doplněn o příkazy '. ', '. ' a '_' - tj. zjistit napětí na vstupním pinu (0-255), zapsat hodnotu (0-255) na výstupní pin a poslední slouží k 10 ms busywaitu.
Odkazy
Poznámky
Externí odkazy
https://sites. google. +morecom/site/visualbf/ Visual brainfuck, jednoduché [url=://www. muppetlabs. com/~breadbox/bf/ stručný popis jazyka, další odkazy na Brainfuck *[/url]url=://web. archive. org/web/20051210061947/http://www. 4mhz. de/ interpret jazyka s integrovaným debuggerem (IDE) pro prostředí Windows *[/url]url=://web. archive. org/web/20031206060451/http://esoteric. sange. fi/brainfuck/ archiv různých implementací, kompilátorů, zdrojových kódů *[/url]url=://www. hevanet. com/cristofd/brainfuck/ podrobný popis jazyka, archiv implementací a zdrojových kódů *[/url]url=://web. archive. org/web/20060521223304/http://www. bf-hacks. org/programs. html příklady a další odkazy *[/url]url=://www. iwriteiam. nl/Ha_BF. html *[/url]url=://home. arcor. de/partusch/html_en/bfd. html kompilátor pro prostředí Windows a DOS *[/url]url=://www. robos. org/. bfcomp Brainfuck počítač *[/url]url=://www. clifford. at/bfcpu/ Brainfuck procesor *[/url]url=://web. archive. org/web/20110807140628/http://kidsquid. 99k. org/programs/bf/ Brainfuck OS boot loader *[/url]url=://web. archive. org/web/20090102014138/http://stoyan. cz/clanek/jazyk-brainfuck-a-brainfuck-interpret-v-c/ Interpret BrainFucku napsaný v jazyce C *[/url]url=://web. archive. org/web/20060504053638/http://justice. loyola. edu/~mcoffey/pr/5k/i. html Interpret BrainFucku napsaný v JavaScriptu *[/url]url=://php. vrana. cz/brainfuck. php Interpret BrainFucku napsaný v PHP *[/url]url=://github. com/garretraziel/mindfuck Interpret BrainFucku napsaný v Pythonu *[/url]url=://esolangs. org/wiki/Brainfuck Detailnější náhled na BrainFuck *[/url]url=://esolangs. org/wiki/Brainfuck_algorithms Pokročilejší BF Algoritmy.
[[Kategorie:Programovací jazyky][Vývojové prostředí|integrované vývojové prostředí]] pro Brainfuck *[/url]] Kategorie:Ezoterické programovací jazyky