[ start | wtyczka RSS do The Bat! | Interpreter i kompilator Brainfuck w C++ | dziwactwa mojego osiedla ]

Raz na jakiś czas człowiek ma chęć zrobić coś dobrze i bez kompromistów 8-) Z takim nastawieniem napisałem kolejny interpreter i kompilator języka Brainfuck.

Z założenia nie jest to projekt specjalnie nastawiony na Brainfuck'a, a raczej na C++ - potraktowałem go jako ćwiczenie pisania rozwiązania elastycznego, opartego na szablonach, zgodnego z ogólnie przyjętymi konwencjami.

W ten sposób powstały:

Interpreter

Wymagania

Interpreter może pracować z dowolnym typem T (jako wejściowym, wyjściowym i elementem pamięci), który spełnia następujące wymagania:

Parametry - ogólnie

Wejście, wyjście, pamięć i program są przekazywane jako następujące parametry:

Błędy

Błędy raportowane są za pomocą wyjątków (dziedziczących z klasy brainfuck::interpreter::exception, która dziedziczy z klasy std::runtime_error):

Funkcje i parametry

Do wykonania programu można użyć jednej z dwóch funkcji:

Problemy przenośności

bidirectional_insert_iterator_t

Iterator bidirectional_insert_iterator_t jest specjalnym iteratorem dwukierunkowym, który potrafi pracować na dowolnym kontenerze, który udostępnia iterator dwukierunkowy i metodę insert(). Jego "specjalność" polega na tym, że może "wyjść poza" kontener - ewentualny dostęp do elementu wskazywanego jest w takiej sytuacji poprzedzony wstawieniem elementu na końcu lub na początku kontera. Przejście o więcej niż jeden element poza za koniec/przed początek kontenera powoduje wstawienie wartości określonej w konstuktorze iteratora (lub wartorści bezparametrowo konstruowalnej).

Kompilator

Kompilator - funkcja

Sam kompilator jest szablonową funkcją wymagającą podania:

Generator kodu

Generator kodu odpowiada za tłumaczenie ośmiu poleceń języka oraz komentarza (znaki inne niż instrukcje języka). Dodatkowo metody prologu i epilog wywoływane przed rozpoczęciem i po zakończeniu właściwej kompilacji) pozwalają na dodanie odpowiednich nagłówków/zakończeń lub innych operacji "porządkowych" w wynikowym kodzie.

Jako przykład implementacji napisałem prosty generator dla ANSI C, ale nic nie stoi na przeszkodzie, żeby dopisać implementację generującą kod w dowolnym języku. Przy odrobinie pracy można dołączyć również "generator", który byłby de facto interpreterem 8-)

Błędy

Błędy raportowane są za pomocą wyjątku brainfuck::compiler::exception, który dziedziczy z klasy std::runtime_error. Jedynymi błędami kompilacji Brainfuck'a są niesparowane nawiasy rozpoczynające i kończące pętle. W obiekcie wyjątku dostępna jest informacja, w którym miejscu znajduje się odpowiedni niesparowany nawias.

Optymalizator

Zazwyczaj w programach pisanych w Brainfuck'u występują długie sekwencje operacji + i -, rzadziej - < i >.

Dla uproszeczenia budowy sam kompilator wywołuje metody generatora kodu "jeden-do-jeden", to znaczy, że każda instrukcja Brainfuck'a powoduje jedno wywołanie odpowiedniej metody, zawsze z parametrem count (liczba kolejnych instrukcji) równym 1.

"Dodatkiem" do kompilatora, który "skraca" sekwencje poleceń jest optymalizator. Działa jako dekorator dla dowolnego generatora kodu, należy "udekorować" nim oryginalny generator. Dla każdej sekwencji operacji +, -, <, >, . i , odpowiednia metoda "udekorowanego" generatora będzie wywoływana tylko raz, za to z odpowienią wartością parametru count.

Pliki do pobrania (download)

brainfuck2.zip - źródła w wersji spakowanej, razem z programami command-line'owego interpretera i kompilatora Brainfuck->ANSI C. Zawiera również wynik kompilacji brainfuck'owego "Hello, world!" do ANSI C z optymalizacją i bez.

Dodatkowo poprzednia wersja interpretera: brainfuck.zip.

Gdybyś chciał podzielić się jakimiś uwagami zapraszam do pisania na adres:


Strefa banerów

spam poison

NIE dla patentów na oprogramowanie!

NIE dzieciom neostrady

Kampania "Dziecko w sieci"

Antybaner, czyli o spamowaniu przez Międzynarodowe Centrum Informacyjno-Konsultingowe znane jako ICIC, opisanym również w na grupach dyskusyjnych w wątkach: Międzynarodowe Centrum Informacyjno-Konsultingowe oraz ICIC

(c) 2005 pkierski.software

Valid HTML 4.0 Transitional

Ostatnia modyfikacja: 2006.08.12 22:04:50

free counters
Free counters

spamtrap entry, do not enter!