Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Web Analytics
Cookie Policy Terms and Conditions Brainquack - Wikipedia, wolna encyklopedia

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:

[edytuj] Linki zewnętrzne

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu