Brainquack
Z Wikipedii
Spis treści |
[edytuj] BrainQuack
BrainQuack jest ezoterycznym językiem programowania opartym na języku BrainFuck.
[edytuj] Idea maszyny języka BQ
Maszyna składa się z indeksowanej pamięci operacyjnej podzielonej na bajty, obszaru kodu programu oraz konsoli wejścia-wyjścia. Struktura i działanie jest w pełni kompatybilne wstecz z językiem Brainfuck.
[edytuj] Pamięć operacyjna maszyny
Pamięć stanowi obustronnie nieograniczona tablica bajtów zainicjowana zerami, oraz wskaźnik na jeden z bajtów, na którym wykonywane są, lub który steruje operacjami języka BQ. Pamięć można porównać do taśmy i głowicy maszyny Turinga, i ze względu na tę analogię w dalszej części pracy będzie nazywana taśmą. Poruszanie się po taśmie odbywa się relatywnie względem bieżącej komórki (wskazywanego bajtu).
W praktyce wielkość taśmy jest ograniczona zasobami komputera.
[edytuj] Obszar kodu programu
Kod programu stanowi ciąg operatorów języka BF zapisany w postaci lewostronnie skończonej, indeksowanej od 0 do n tablicy bajtów. Na aktualnie wykonywany operator wskazuje licznik programu (Code Pointer).
Op. |
+ |
+ |
> |
- |
{ |
+ |
- |
- |
> |
- |
} |
< |
< |
{ |
R |
< |
< |
< |
} |
. |
. |
. |
CP |
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
[edytuj] Konsola wejścia i wyjścia
Maszyna posiada wyjście na które wysyłane są bajty. Za sposób wyświetlania przyjęto znaki ASCII o kodzie danym wyprowadzanym bajtem.
Maszyna wymaga istnienia wejścia, do którego na żądanie wprowadzana jest wartość bajtu.
[edytuj] Obszar kodu przeciążonego
Obszar gdzie przechowywane są definicje przeciążonych operatorów. Niedostępny bezpośrednio z poziomu samej maszyny, zmieniany i dostępny jedynie przez wykonanie kodu. W idei są to sekwencyjne podzbiory (wycinki taśmy) obszaru kodu, posiadające własny wskaźnik kodu będący offsetem (przesunięciem) względem początku definicji oraz zakończonym operatorem domknięcia }.
Op. |
+ |
+ |
> |
- |
{ |
+ |
- |
- |
> |
- |
} |
< |
< |
{ |
R |
< |
< |
< |
} |
. |
. |
. |
. |
CP |
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
CP[op] |
0 |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
W powyższym przykładzie operator + zostaje przeciążony sekwencją
-->-
Początkiem (o offsecie zerowym) definicji znaku + jest komórka o numerze 6.
Kolejne operatory definicji przeciążenia można uzyskać sumując początek definicji oraz offset operatora. Zakończenie definicji operatora stanowi znak } o CP= 6+4=10.
Do przeciążenia operatora w teorii wymagane są więc tylko dodatkowe dwa wskaźniki, nie potrzebny jest dodatkowy obszar kodu.
[edytuj] Programowanie maszyny BrainQuack
[edytuj] Operatory języka BF
Operator |
Funkcja wykonywana |
Odpowiednik w C |
> |
zwiększa wskaźnik taśmy o 1 |
p++ |
< |
zmniejsza wskaźnik taśmy o 1 |
p-- |
+ |
zwiększa o 1 bajt we wskazywanej komórce |
t[p]++ |
- |
zmniejsza o 1 bajt we wskazywanej komórce |
t[p]-- |
. |
wyświetla znak ASCII o wartości takiej jak we wskazywanej komórce taśmy |
putchar(t[p]) |
, |
pobiera bajt (znak ASCII) i zapisuje we wskazywanej komórce taśmy |
t[p]=getchar() |
[ |
skacze do odpowiadającego mu ] jeśli w bieżącej pozycji znajduje się 0 |
while(t[p]){ |
] |
skacze do odpowiadającego mu [ |
} |
p- wskaźnik na bajt taśmy (komórkę tablicy bajtów)
t- taśma (tablica bajtów)
[edytuj] Operatory języka BQ
Operator |
Funkcja wykonywana |
Dopuszczalny w redefinicji |
12 |
Operator multiplikacji, przybiera formę liczby decymalnej z zakresu 2-256, powodujący tylukrotne wykonanie znaku bezpośrednio za tą liczbą, ile wynosi ta liczba. |
Tak |
% |
losowo zwiększa lub zmniejsza o 1 bajt we wskazywanej komórce |
Tak |
{ |
Redefiniuje następujący po nim operator (o CP większym od 1) jako ciąg operatorów języka BF zawarty pomiędzy adresem CP większym o 2 od znaku { do adresu pierwszego napotkanego znaku } |
Nie |
} |
koniec redefinicji operatora. |
Nie |
~ |
Odwołanie (normalizacja) następującego po ~ operatora. |
Nie |
$ |
Operator strumieniowania taśmy na kod. Wczytuje nn kolejnych znaków większych od wskazywanej komórki i wstawia je w kod zamiast znaku $. nn jest wartością wskazywanej komórki. Strumieniowaniu podlegają jedynie bajty z zakresu 200-250. |
[edytuj] Operatory pomocnicze debugera:
Operator |
Funkcja wykonywana |
# |
Pułapka, wstrzymuje wykonywanie kodu do czasu wznowienia przez użytkownika. |
& |
Logowanie - zapisuje stan maszyny BQ do logu celem późniejszej analizy. Logowane dane zależą od ustawień debugera, |
Znaki debugera mają właściwości operatorów BF, mogą zostać przeciążone oraz być częścią redefinicji. Ich obsługą zajmuje się warstwa prezentacyjna programu. Znaki te nie stanowią części języka sensu stricto.
[edytuj] Uwagi dotyczące przeciążania operatora
W języku BQ można przeciążyć każdy operator (znak).
Wymagane jest by przeciążany operator był kompletnym programem w języku BF, to znaczy miał zamknięte pętle i nie używał składni BQ (operatory są nieprzeciążone, znaki nie stanowiące operatora języka BF za wyjątkiem %, # oraz & są ignorowane jako komentarz). W dalszej części pracy operatory nieprzeciążone, działające zgodnie z zasadą języka Brainfuck nazywać będę normalnymi.
[edytuj] Prymitywy języka
{+++} |
Redefinicja znaku + by zwiększał wartość komórki o 2 a nie o 1 |
{a[-]97+.} |
Przypisanie znakowi 'a' operatora wpisującego w bieżącej komórce i wypisywaniu na ekran znaku ASCII o wartości 97 czyli 'a'. |
{.48+.} |
Modyfikacja wyświetlania - bajty o wartości 0-9 będą wyświetlane jako cyfry. |
[c{]}c~] c ] |
Naruszenie parzystości klamer pętli z użyciem przeciążenia. Znak 'c' to dowolny kod. |
[edytuj] Tablica Operatorów
Operator |
Multiplikatywny |
W przeciążeniu |
Opis |
+ |
Tak |
Dozwolony |
Zwiększa bieżący (wskazywany) bajt taśmy |
- |
Tak |
Dozwolony |
Zmniejsza bieżący (wskazywany) bajt taśmy |
> |
Tak |
Dozwolony |
Przesuwa wskaźnik (głowicę) taśmy w prawo |
< |
Tak |
Dozwolony |
Przesuwa wskaźnik (głowicę) taśmy w lewo |
. |
Tak |
Dozwolony |
Wyprowadza znak wskazywany z taśmy na konsolę (ekran) |
, |
Tak |
Dozwolony |
Wprowadza znak z wejścia (klawiatury) w bieżącą komórkę taśmy |
[ |
NIE |
Dozwolony gdy domknięty |
Wykonuje skok wskaźnika kodu za odpowiadający mu ']' wtedy i tylko wtedy gdy wskazywana komórka taśmy jest zerowa. |
] |
NIE |
Dozwolony gdy ma parę |
Wykonuje skok wskaźnika kodu na odpowiadający mu '[' |
# |
Tak |
Dozwolony |
Znak specjalny debugera. Powoduje wstrzymanie wykonywania kodu. |
& |
Tak |
Dozwolony |
Znak specjalny debugera. Powoduje zalogowanie stanu maszyny BQ |
% |
Tak, ze zmianą funkcjonalności |
Dozwolony |
Zachowuje się jak normalny (nie przeciążony) operator '+' lub '-' losowo z szansą 50/50%. Multiplikacja powoduje wykonanie NN razy tego samego operatora, ciąg NN operatorów % powoduje losowanie zachowania dla każdego operatora osobno. |
{ |
NIE |
Ignorowany |
Rozpoczyna redefinicję operatora następnego po '{' |
} |
NIE |
Ignorowany |
Kończy redefincję operatora |
~ |
NIE |
Ignorowany |
Odwołuje przeciążenie operatora następnego po znaku '~' |
$ |
NIE |
Ignorowany |
Powoduje wpisanie w kod BQ zamiast znaku $ zawartości taśmy od wskazywanego bajtu do NN bajtów w prawo, gdzie NN to wartość bajtu wskazywanego. Komórki o wartościach innych niż <200,250> nie są dodawane do kodu. |
przeciążony |
TAK |
Ignorowany |
Operator zdefiniowany jako procedura języka Brainfuck |
Liczba decymalna |
- |
Ignorowany |
Powoduje wielokrotne wykonanie operatora stojącego za liczbą, jeśli jest multiplikatywny. Wykonanie odbywa się w 1 cyklu maszynowym. |
[edytuj] Zobacz też
Lista ezoterycznych języków:
- Aura
- Befunge
- Brainfork
- Doublefuck, odmiana Brainfucka z dwoma buforami pamięci.
- ETA
- L00P
- L33t
- Malbolge
- Moo
- Ook!
- PATH, połączenie Brainfucka i Befunge.
- QUOTE
- SNUSP, podobnie, lecz ze stosem wywołań.
- Whitespace
[edytuj] Linki zewnętrzne
- BrainQuack Interpreter - Edytor, debuger, interpreter, BrainQuack (dla Windows)