Brainfuck
Brainfuck on programmeerimiskeel, mille lõi Urban Müller eesmärgiga kirjutada maailma kõige väiksem kompilaator. Loomulikult vajas selline kompilaator ka maailma väikseimat programmeerimiskeelt, milleks saigi Brainfuck.
Urban Mülleril õnnestus kirjutada kompilaator Amiga OS 2.0-le, mis oli vaid 200 baidi suurune. Brian Raiter kirjutas kompilaatori Linuxile, mis saavutas suuruse 171 baiti. Brainfucki kompilaatoreid ja interpretaatoreid on erinevad autorid kirjutanud paljudes erinevates keeltes. Eriti tasub ära märkida Brainfucki interpretaatoreid, mis on kirjutatud Brainfuckis. Eeskätt Daniel B. Cristofani kirjutatud imetilluke variant
Süntaks
Brainfuck on minimalistlik keel. Programmis on kesksel kohal üks globaalne viitmuutuja, mis programmi alguses viitab esimesele positsioonile suures baitide massiivis (võib olla näiteks 30 kilobaidi suurune), mis kõik on vaikimisi seatud väärtusele null. Keeles on kaheksa käsku, mis kõik koosnevad vaid ühest sümbolist:
- > liigutab viida ühe positsiooni võrra edasi
- < liigutab viida ühe positsiooni võrra tagasi
- + suurendab viidatavat baiti ühe võrra
- - vähendab viidatavat baiti ühe võrra
- . kirjutab viidatava baidi tähemärgina programmi väljundisse
- , loeb programmi sisendist tähemärgi ja kirjutab selle väärtuse viidatavasse baiti
- [ liigub edasi vastava ']'-ni, kui viidatav bait võrdub nulliga
- ] liigub tagasi vastava '['-ni, kui viidatav bait ei võrdu nulliga
Hello world
Programm, mis väljastab teksti "Hello, World!":
++++++++[->++++>+>>++>++>>+++>+<<<<<< <<]>[->++>+++>+++>+>+>++<<<<<<]>.>+++ ++.>----..+++.>----.>.>-.<<<.+++.---- --.<-.>>>+.>>++.
Brainfucki interpretaator
Tegu on väga lihtsa C++ programmiga mis näitab Brainfucki koodi väljundit seda mitte kompileerides.
#include <iostream>
#include <stack>
using namespace std;
int main()
{
unsigned char buffer[30000] = {0};
char *ptr = "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.";
unsigned char *ptr2 = buffer;
stack<char *> pos_stack;
while(*ptr && *ptr != EOF)
{
if(*ptr == '+') ++*ptr2;
if(*ptr == '-') --*ptr2;
if(*ptr == '>') ++ptr2;
if(*ptr == '<') --ptr2;
if(*ptr == ',') *ptr2 = cin.get();
if(*ptr == '.') cout << *ptr2;
if(*ptr == '[') pos_stack.push(ptr + 1);
if(*ptr == ']' && *ptr2 != 0) ptr = pos_stack.top();
else {
if(*ptr == ']' && *ptr2 == 0) pos_stack.pop();
ptr++;
}
fflush(stdin);
}
return 0;
}
Välislingid
- Brian Raiter'i Brainfucki lehekülg
- Frans Faase'i Brainfucki lehekülg, kust leiab ka õpetuse
- Brainfuck development environment with integrated debugger (IDE) for Windows
- Brian Raiter'i assembleris Linuxile kirjutatud Brainfucki kompilaatori lähtetekst
- Brainfucked kompilaator (Windows/DOS)
See artikkel vajab täiendamist, et anda teemast piisavat ülevaadet. |