15 czerwca 2009

Przygotowując się do egzaminu z Podstaw Automatyki

Malbolge.
Jest nazwą ósmego kręgu piekła Dantego, w którym wieczne męki cierpią dusze róznej maści oszustów, złodziei, kłamców.
Jest też nazwą ezoterycznego języka programowania, zaprojektowanyego jako najtrudniejszy w użytku. (Jakkolwiek istnieje kilka innych nieużytecznie trudnych języków, żaden nie był tworzony z tym założeniem - np. INTERCAL powstał, by nie mieć nic wspólnego z jakimkolwiek programowaniem [program który w C wykonuje się 0,5sec, INTERCALowi zajmuje 17 godzin], a BrainFuck miał być możliwie małym językiem kompletnym w sensie Turinga [kompilator dla Amigi ma 240B]).

Program wykorzystuje ten sam obszar pamięci na dane i rozkazy. Operuje na trzech rejestrach, nazywanych A, C i D. A jest to akumulator, używany do wszelkich operacji na danych - jest ustawiany na wartość wyniku. C jest wskaźnikiem rozkazów, jak z nazwy wynika wskazuje w kodzie aktualnie wykonywany rozkaz. D jest wskaźnikiem danych, o działaniu analogicznym do C. Program po rozpoczęciu ma wszystkie rejestry ustawione na 0.

Podczas wykonywania programu, sprawdzane jest, czy aktualna instrukcja jest graficznym znakiem ASCII (kody 33-126).
Jeśli tak jest, od jej wartości odejmowane jest 33, dodawane C, wszystko dzielone modulo 94. Reszta dzielenia mod 94 jest wskaźnikiem pozycji w tablicy 94 znaków:

+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XTcA"lI
.v%{gJh4G\-=O@5`_3i
Sprawdzane jest, czy ustalony w ten sposób znak jest jednym z 8 niżej wymienionych rozkazów, jeśli tak - jest wykonywany, jeśli nie - cóż... :) Jeżeli oryginalna instrukcja (przed całym tym liczeniem) nie jest drukowalnym znakiem ASCII, program kończy sie w tym miejscu.

Gdy interpreter czyta plik źródłowy, sprawdza w ten sposób każdy (niebiały) znak po kolei. Jeżeli żaden z nich nie okazuje się być rozkazem, plik jest odrzucany.

Po wykonaniu instrukcji, od C odejmowane jest 33, a wynik jest indeksem w kolejnej tablicy:
5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1C
B6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@
Odpowiedni znak jest przepisywany do C, które następnie jest zwiększane o 1.

Rozkazami są znaki: j, i, *, p, <, /, v, o.
Rozkazy < i / są to operacje I/O (czytanie i zapis do A oraz wypisanie A), j oraz i służą do modyfikacji wartości odpowiednio D i C, * wydaje się być przesunięciem trójkowym D w prawo (sic!), działania p nie czaję. v zatrzymuje program, o nie robi nic poza inkrementacją C i D (co zresztą czynią wszystkie instrukcje).

Tak zdefiniowany język programowania uważa się za możliwy do bycia kompletnym w sensie Turinga (nikt tego nie udowodnił, aczkolwiek w oczywisty (aha, zależy dla kogo) sposób spełnia część kryteriów i prawdopodobnie pozostałe).

W Malbolge żaden człowiek nie napisał jeszcze programu. Do napisania "Hello World!" użyto algorytmów genetycznych, zaś kod wygląda tak:
(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**
hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<
Jest to najbardziej złożony program w tym języku.

The day that someone writes, in Malbolge, a program that simply copies its input to it's output, is the day my hair spontaneously turns green. It's the day that elephants are purple and camels fly, and a cow can fit through a needle's eye.

3 komentarze:

  1. Taaaa... PA. Ale co tam - gotowiście na latające wielbłądy? To jedziemy! F34r my L337 p0w3r!

    >Tu był kod, ale głupi bloger wywala: Twój kod HTML nie może zostać zaakceptowany: PHP, ASP, and other server-side scripting is not allowed.<

    A tak na serio, co za pacan ten język wymyślił?

    OdpowiedzUsuń
  2. Jutro przeczytam... jak już napiszę swój egzamin. Albo po tym jak wytrzeźwieje. Chociaż może zanim wytrzeźwieję, to ta kaszanka będzie miała więcej sensu....

    OdpowiedzUsuń
  3. Próbowałam 3 razy po pijaku, raz na trzeźwo, 5 razy z kacem... Sorry, nie wiem co piszesz.

    OdpowiedzUsuń