Dziś jest sobota, 10 stycznia 2009 roku (z kalendarza...)

Mnożenie i 99 butelek

Icon

05.11.2006, 18:04

Revomer

Komentarze (3)

Powrót

Epopeja ezoterycznego języka programowania Revomer się nie zakończyła. Projekt powoli, acz w miarę systematycznie posuwa się naprzód. Dzięki przesiadce na Linuksa znalazłem błąd w kompilatorze polegający na czytaniu z niewłaściwego bufora (tego, w którym były białe znaki), co zamieniało kod źródłowy programu w serię komend rope (Random Operation). Jednak to nie wszystko, ponieważ bardzo zaawansowane są już prace nad programem wypisującym tekst piosenki 99 butelek.

Kod źródłowy liczy już jakieś 3 kB, przy czym jego 90% zajmuje się jedynie wyświetlaniem kolejnych literek tekstu. Pozostały fragmencik to kod, który przerywa wykonywanie funkcji, kiedy licznik butelek zmaleje do zera. Aktualnie jest to wykonwane w następujący sposób: najpierw zamieniamy nazwę aktualnej funkcji z jakąś pustą funkcją. Później następuje seria operacji matematyczno-logicznych mających określić, czy licznik osiągnął 0. Jeżeli nie, program normalnie wykonuje jeszcze raz komendę conf, która przywraca właściwe nazwy funkcji i sprawia, że te zaczynają wykonywać się od początku. W przeciwnym razie wcześniej wykonuje się unless, które tego drugiego confa kasuje. Teraz program myśli, że serio aktualnie wykonywana funkcja jest pusta, zatem kończy ją pomyślnie.

Jednak dwie ostatnie zwrotki piosenki mają nieco inne brzmienie, dlatego algorytm ten nieco zmodyfikuję. Zamiast wykorzystywać pętlowe właściwości funkcji, zastąpię confa przez come here, które zwyczajnie skopiuje cały dotychczasowy kod przed siebie samego, powodując ponowne jego wykonanie. Jeżeli licznik osiągnie 1, come here zostanie skasowany, dzięki czemu interpreter będzie mógł wyświetlić dwie ostatnie zwrotki tak, jak należy :). Przerwanie końcowe funkcji nastąpi z użyciem confa.

Obecna wersja programu napisana jest z użyciem małego oszustwa. Otóż oficjalnie Revomer nie posiada żadnej komendy do wyświetlania liczb w systemie dziesiętnym, przez co programista musi sobie ją samodzielnie napisać. Tymczasowo, dla celów debugowych, wsadziłem jednak do interpretera polecenie num - je właśnie muszę wyeliminować. Prace nad algorytmem wyświetlania liczb trwają. Dzisiaj rano zaimplementowałem mnożenie (Revomer potrafi tylko dzielić i odejmować - takie są założenia :)). Do prezentacji wyników nadal używany jest num, ale tylko dlatego, żeby sprawdzić, czy wszystko działa. Sam algorytm jest w pełni zgodny ze specyfikacją i nie korzysta z nielegalnych sztuczek. Oto jego kod:

almukantarat~
mul_null%
almukantarat~
conf mul_null, n~
unless}$506#
????& $506, $507
in $507
in $506
@&%^" $508, $506
conf n, mul_null~
@&%^" $501, $508
@&%^" $501, $507
gifs 1~
hide $508
gifs 1~
hide $507
gifs 1~
hide $506
~].?&* $505, $503~
~].?&* $503, $504~
@&%^" $504, $503
~].?&* $503, $505~
~].?&* $505, $502~
~].?&* $502, $501~
@&%^" $501, $502
~].?&* $502, $505~
n%
almukantarat~
nope~
nope~
nope~
nope~
foo%
almukantarat~
come here $520, $521, $522
gifs 3~
hide $522
gifs 17~
hide $521
gifs 17~
hide $520
charm $66
gifs 110~
hide $66
gifs 0~
hide $504
@&%^" $509, $503
~].?&* $500, $503~
gifs 1~
hide $502
gifs 0~
hide $509
m%
almukantarat~
come here $500, $501, $502
gifs 3~
hide $502
gifs 14~
hide $501
gifs 14~
hide $500
num $504
charm $66
gifs 109~
hide $66
gifs 8~
hide $501
gifs 8~
hide $500
%

Liczby do pomnożenia wprowadzamy do komórek pamięci 500 i 501. Dodam, że program na razie działa na 8-bitowych słowach (działanie SARS pozwalającej zmienić je na dłuższe, jeszcze nie jest do końca zaimplementowane), przez co poprawnie mnożone są czynniki dające iloczyn mniejszy od 256. Muszą być one także dodatnie :).

Dla zainteresowanych, którzy nie czytali wrześniowego wpisu o Revomerze, w przypisach podaję dalej adres do specyfikacji języka, gdzie mogą zapoznać się z jego założeniami oraz zasadami działania :).

Wraz z Krzyśkiem pracujemy też nad wersją 1.0, która będzie wzbogacona o wiele nowych i ciekawych opcji:

  1. Wielowyjątkowość - połączenie mechanizmu wyjątków z wielowątkowością. Program może przechwytywać wykonywanie komendy Rope (Random Operation) i przechodzić do bloku obsługi wyjątku, jednocześnie rozpoczynając nowy wątek. Wątek ulega zakończeniu dopiero wtedy, kiedy w końcu zgodzimy na wykonanie przechwyconej losowej operacji.
  2. Network Source Code Transmission Protocol - Revomer zostanie wzbogacony o obsługę połączeń sieciowych, lecz będzie ona dosyć specyficzna. Revomer będzie mógł wysyłać jedynie fragmenty swego kodu źródłowego (znikają one wtedy z programu) i tak samo traktować nadchodzące dane.
  3. Standard Useless Function Library - czyli biblioteka funkcji bezużytecznych - dzięki niej każde wywołanie losowej operacji będzie przyprawiać o dreszczyk emocji, m.in. za sprawą komendy DTS (Delete This Shit), która kasuje plik z kodem źródłowym wykonywanego programu :D.
  4. Komenda WTF (What The Fuck), która zapisuje, począwszy od podanej komórki pamięci, informacje o następnej komendzie, po czym usuwa ją - przydatne przy pisaniu quine'ów i odczytywaniu danych z połączenia sieciowego :).

Szykujemy również coś specjalnego, ale na razie nie będziemy się z tym zdradzać :).

Powrót

Komentarze

Napisał Edas w niedzielę, 5 listopada 2006 o 19:09

Hmm czy jest możliwość skontaktowania się z Tobą jakoś przez GG czy też mailowo abyś mnie poduczył jak się robi własne interpretery? Narazie robię sobie taki niby mój bo korzystam z artukułu na gamedev.pl apropo robienia własnego języka iterpretowanego ;) Chętnie nauczyłbym się też czegoś nowego :)

Napisał Zyx w niedzielę, 5 listopada 2006 o 20:08

Hmmm... to napisz na maila i wyślij mi swój GG, jest on podany w "Hall of fame" na podstronie "Kontakt".

Napisał dr_bonzo w poniedziałek, 6 listopada 2006 o 13:31

OMG, to jest gorsze niz asembler, nawet nie probuje tego zrozumiec :)

'WTF' to by sie przydalo w CoreWars (czy jak to sie zwalo)

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2009 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia