b'\n_START_ARTICLE_\nBrainfuck\n_START_PARAGRAPH_\nBrainfuck este un limbaj de programare esoteric, cunoscut pentru simplitatea acestuia. _NEWLINE_Acest limbaj de programare a fost creat de c\xc4\x83tre programatorul Urban M\xc3\xbcller, pentru a pune la \xc3\xaencercare acesta neav\xc3\xa2nd nicio aplica\xc8\x9bie practic\xc4\x83. Forme populare de cenzurare fiind brainf***, brainf*ck, brainfsck, b****fuck sau BF. Numele limbajului nu este \xc3\xaen general scris cu liter\xc4\x83 mare, except\xc3\xa2nd situa\xc8\x9bia c\xc3\xa2nd acesta se afla la \xc3\xaenceputul propozi\xc8\x9biei, de\xc8\x99i este un substantiv propriu.\n_START_SECTION_\nDesignul limbajului\n_START_PARAGRAPH_\nUrban M\xc3\xbcller, inspirat de compilatorul limbajului FALSE, care avea 1024 bi\xc8\x9bi lungime, a creat brainfuck \xc3\xaen 1993 cu inten\xc8\x9bia de a face un limbaj de programare ce putea fi implementat cu cel mai mic compilator posibil. _NEWLINE_Limbajul prezint\xc4\x83 8 comenzi("<",">","+","-") restul caracterelor fiind ignorate. Un program brainfuck este o secven\xc8\x9b\xc4\x83 de comenzi, aceste fiind citite de la st\xc3\xa2nga la dreapta \xc8\x99i de sus \xc3\xaen jos. Programul se termin\xc4\x83 dup\xc4\x83 ce ajunge la ultima comand\xc4\x83._NEWLINE_Limbajul brainfuck folose\xc8\x99te un model simplu reprezentat de programul propriu-zis, un contor al instruc\xc8\x9biunilor (pointer) \xc8\x99i un vector de cel pu\xc8\x9bin 30000 de octe\xc8\x9bi lungime, av\xc3\xa2nd elementele cu valoarea ini\xc8\x9bal\xc4\x83 zero \xc8\x99i dou\xc4\x83 stream-uri (\xc3\xaen general - cel de intrare \xc8\x99i cel de ie\xc8\x99ire).\n_START_SECTION_\nUn limbaj predecesor brainfuck-ului\n_START_PARAGRAPH_\nExcept\xc3\xa2nd cele dou\xc4\x83 comenzi de citire \xc8\x99i de scriere, brainfuck este nimic altceva dec\xc3\xa2t o varia\xc8\x9bie a limbajului de programare P\xe2\x80\xb2\xe2\x80\xb2 creat de Corrado B\xc3\xb6hm \xc3\xaen anul 1964. Astfel, conceptul exista deja de aproape trei decenii c\xc3\xa2nd Urban M\xc3\xbcller a f\xc4\x83cut brainfuck-ul.\n_START_SECTION_\nHello World!\n_START_PARAGRAPH_\nProgramul de mai jos afi\xc8\x99eaz\xc4\x83 mesajul "Hello World!", urmat de o nou\xc4\x83 linie:_NEWLINE_ +++++ +++++             valoarea elementului curent ajunge la 10[                       se folose\xc8\x99te o bucl\xc4\x83 pentru a stabili valoarea urm\xc4\x83toarelor 4 elemente la 70/100/30/10    > +++++ ++              adun\xc4\x83 7 la elementul 1    > +++++ +++++           adun\xc4\x83 10 la elementul 2     > +++                   adun\xc4\x83 3 la elementul 3    > +                     adun\xc4\x83 1 la elementul 4    <<<< -                  decrementeaz\xc4\x83 elementul 0]                   > ++ .                  afi\xc8\x99eaz\xc4\x83 \'H\'> + .                   afi\xc8\x99eaz\xc4\x83 \'e\'+++++ ++ .              afi\xc8\x99eaz\xc4\x83 \'l\'.                       afi\xc8\x99eaz\xc4\x83 \'l\'+++ .                   afi\xc8\x99eaz\xc4\x83 \'o\'> ++ .                  afi\xc8\x99eaz\xc4\x83 \' \'<< +++++ +++++ +++++ .  afi\xc8\x99eaz\xc4\x83 \'W\'> .                     afi\xc8\x99eaz\xc4\x83 \'o\'+++ .                   afi\xc8\x99eaz\xc4\x83 \'r\'----- - .               afi\xc8\x99eaz\xc4\x83 \'l\'----- --- .             afi\xc8\x99eaz\xc4\x83 \'d\'> + .                   afi\xc8\x99eaz\xc4\x83 \'!\'> .                     afi\xc8\x99eaz\xc4\x83 \'\\n\'_NEWLINE_Din motive de u\xc8\x99urin\xc8\x9b\xc4\x83 de citire, programul a fost comentat \xc8\x99i comenziile au fost grupate. Programul ar fi putut de altfel s\xc4\x83 fie scris astfel:_NEWLINE_ ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.\n_START_SECTION_\nCur\xc4\x83\xc8\x9barea unui element\n_START_PARAGRAPH_\n[-]_NEWLINE_O secven\xc8\x9b\xc4\x83 de cod care decrementeaz\xc4\x83 elementul curent p\xc3\xa2n\xc4\x83 c\xc3\xa2nd acesta devine nul.\n_START_SECTION_\nNulizeaz\xc4\x83 elementele predecesoare\n_START_PARAGRAPH_\n[     [-]     < ]_NEWLINE_Decrementeaz\xc4\x83 elementul curent p\xc3\xa2n\xc4\x83 la atingerea unei valori nule, continu\xc3\xa2nd acest lucru cu toate elementele predecesoare acesteia p\xc3\xa2n\xc4\x83 la \xc3\xaent\xc3\xa2lnirea uneia cu valoare numeric\xc4\x83 egal\xc4\x83 cu 0.\n_START_SECTION_\nDeruleaz\xc4\x83 p\xc3\xa2n\xc4\x83 la primul element\n_START_PARAGRAPH_\n[<]>_NEWLINE_Decrementeaz\xc4\x83 pointerul de date p\xc3\xa2n\xc4\x83 g\xc4\x83se\xc8\x99te un zerou, apoi \xc3\xael incrementeaz\xc4\x83. Not\xc4\x83: Aceasta garanteaz\xc4\x83 o valoare nenul\xc4\x83 la pointerul final dac\xc4\x83 pointerul initial sau pointerul urm\xc4\x83tor are o valoare nenul\xc4\x83.\n_START_SECTION_\nAdunare\n_START_PARAGRAPH_\nVersiunea distructiv\xc4\x83._NEWLINE_ [     ->        +< ]_NEWLINE_Versiunea nedistructiv\xc4\x83._NEWLINE_ [     -         >+        >+        << ] >>        [     -     <<+     >> ]_NEWLINE_Aceast\xc4\x83 versiune este nedistructiv\xc4\x83 \xc3\xaens\xc4\x83 folse\xc8\x99te de 1.5 ori mai mult\xc4\x83 memorie.\n_START_SECTION_\nBucle condi\xc8\x9bionate\n_START_PARAGRAPH_\n,----------[----------------------.,----------]_NEWLINE_Acest program cite\xc8\x99te de la tastatur\xc4\x83 un caracter sc\xc4\x83z\xc3\xa2nd 10 din valoarea numeric\xc4\x83 a acesteia (valoarea ASCII a unei linii noi) \xc8\x99i dac\xc4\x83 valoarea nu este nenul\xc4\x83, acesta mai scade 22, rezult\xc3\xa2nd un caracter cu 32 mai mic (aceasta este diferen\xc8\x9ba \xc3\xaentre literele mici \xc8\x99i cele mari).\n_START_SECTION_\nPortabilitatea\n_START_PARAGRAPH_\nDeoarece Urban M\xc3\xbcller nu a specificat un standard al acestui limbaj, numeroasele interpretoare si compilatoare ale limbajului  utilizeaz\xc4\x83 mai multe "dialecte". Una dintre diferen\xc8\x9bele principale fiind cea \xc3\xaen care programul cite\xc8\x99te valori numerice sau ASCII.\n_START_SECTION_\nM\xc4\x83rimea unui element\n_START_PARAGRAPH_\n\xc3\x8en distribu\xc8\x9bia original\xc4\x83, lungimea unui element este echivalent\xc4\x83 cu cea de 8 bi\xc8\x9bi, \xc3\xaens\xc4\x83 exist\xc4\x83 de asemenea interpretoare care folosesc 16, 32 sau chiar 64 de bi\xc8\x9bi.\n_START_SECTION_\nM\xc4\x83rimea vectorului\n_START_PARAGRAPH_\n\xc3\x8en distribu\xc8\x9bia original\xc4\x83, num\xc4\x83rul elementelor este de 30000, elementul curent ini\xc8\x9bial fiind cel cu indicele 0. Unele versiuni \xc3\xaens\xc4\x83 extind vectorul dinamic sau folosesc m\xc4\x83rimi foarte mari, altele las\xc4\x83 utilizatorul s\xc4\x83-\xc8\x99i seteze dimensiunea.\n_START_SECTION_\nVaria\xc8\x9bia valorii numerice a caracterului linie nou\xc4\x83\n_START_PARAGRAPH_\nAv\xc3\xa2nd \xc3\xaen vedere c\xc4\x83 unele sisteme de operare folosesc diferite tabele ASCII, programele portabile nu pot depinde de valoarea caracterului linie nou\xc4\x83.'