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:
- 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.
- 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.
- 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.
- 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ć :).






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 :)