Co jest takiego wyjątkowego w Revomerze? Hmmm... powiedzmy, że trzy proste koncepcje. Pierwszą można zawrzeć w zdaniu Is Negative - Is Good, co oznacza, że wszystko, co jest związane z negacją, kasowaniem, odejmowaniem, jest dobre, a dodawanie i mnożenie jest be. Druga prosta koncepcja mówi, że program nie może zakończyć się z takim samym kodem źródłowym, z jakim się zaczął. Więcej, założenia języka sprawiają, że niemal każda operacja będąca krokiem do algorytmiki wymaga samomodyfikowania przez program własnych źródeł w trakcie działania! Ostatnia koncepcja definiuje zachowanie się interpretera. W przeciwieństwie do innych języków programowania, Revomer nie cechuje się bezradnością małego dziecka w przypadku napotkania błędu - on zawsze próbuje się domyślić, co programista miał na myśli, kiedy ten popełni błąd składni lub program będzie próbował wykonać niedozwoloną operację. Z naciskiem na PRÓBUJE. Od strony technicznej sprowadza się to do wykonywania losowej operacji w przypadku napotkania każdego błędu. A nuż trafimy :).
Na bazie tych trzech koncepcji powstał kompletny język programowania. Oto niektóre z jego ciekawszych cech:
- Zgodnie z koncepcją IN-IG, kod programu wykonywany jest od końca (ale linie numerowane są już od początku).
- Język posiada wbudowane operacje odejmowania i dzielenia, nie posiada natomiast mnożenia i dodawania.
- Program ma do dyspozycji 64 kB pamięci podzielonej na 1-bajtowe komórki.
- Pamięć operacyjna pełni jednocześnie rolę rejestrów - nie można definiować stałych argumentów; wszystko musi przejść przez pamięć.
- Kod programu podzielony jest na funkcje. Funkcja kończy pracę dopiero wtedy, kiedy nie będzie zawierać żadnego kodu.
- Program kończy pracę wraz z momentem usunięcia z funkcji zerowej ostatniej komendy.
- Można definiować wiele funkcji o tej samej nazwie - jeśli chcemy jakąś uruchomić, interpreter ma wybrać jedną z nich w sposób losowy.
- Rozbudowany zestaw komend do zarządzania kodem źródłowym: come here (przenosi bloki komend w inne miejsce), unless (warunkowo kasuje następną linijkę, jeśli podana komórka pamięci zawiera fałsz), real (usuwa linijkę leżącą N linijek dalej), rf (usuwa funkcję), conf (zamienia dwie funkcje nazwami), if (dołącza nowy plik, jednocześnie kasując siebie), shuffle (miksuje kod między podanymi linijkami).
- Wskaźniki!
- Każda nieprzewidziana przez specyfikację zagrywka kończy się wykonaniem operacji ROPE (losowa operacja).
Z Revomerem termin programowanie dynamiczne nabiera nowego znaczenia. A potwierdzić to możemy my, jego twórcy, którzy już stworzyli w nim kilka prostych programów i przekonali się o tym doświadczalnie.
Teraz trochę historii... w poniedziałek, dnia 28 sierpnia, znaleźliśmy się wszyscy pod lubelskim LO. im. Staszica, czekając na rozpoczęcie warsztatów. Rozmowa zeszła na ezoteryczne języki programowania; dzieliliśmy się swoimi opiniami i jednocześnie żartowaliśmy na ich temat. W pewnym momencie Krzyśkowi zaświtał pomysł: zróbmy coś własnego. Na pierwszym z wykładów zabraliśmy się do pracy. W moim zeszycie powstały pierwsze szkice, aż metodą burzy mózgów wypracowaliśmy koncepcje oraz założenia. Następnego dnia rankiem pożyczyliśmy laptop i rozłożyliśmy się w kącie sali gimnastycznej, aby rozpocząć prace nad interpreterem. Niestety, tego dnia nie stworzyliśmy prawdę mówiąc zbyt dużo - parę struktur danych i początek biblioteki standardowej, które później i tak wymieniliśmy. Niemniej od strony teoretycznej dodawane były kolejne pomysły, wszystkie zbierane w formie luźnych notatek w moim zeszycie.
W środę o drugiej w nocy, zmęczony grą w go i obserwowaniem partii brydża, powróciłem na salę gimnastyczną, czując wenę. Włączyłem laptop i do piątej nad ranem pisałem kompilator Revomera do bytecode-u. Język wtedy nosił jeszcze roboczą nazwę --C. Po przerwie na sen kontynuowałem pisanie, aż ok. 14.00 kompilator był gotowy. Następnej nocy i jeszcze przez czwartek tworzone były nowe struktury danych do zarządzania kodem źródłowym. Tenże czwartek został też dniem, w którym zrodził się pomysł spisania ostatecznej specyfikacji, i to na nie byle czym, bo na szarym papierze toaletowym. Pisanie rozpoczął Krzysiek, później kontynuowaliśmy tę robotę na zmianę. Po bezsennej nocy z 31 sierpnia na pierwszowrześniowy poranek, o godzinie 10.04 nastała historyczna chwila. Interpreter prawidłowo uruchomił i wykonał program wypisujący frazę "HI UNIVERSE" (podziękowania dla Róży za jej ułożenie :)). Dwie godziny później ukończona została specyfikacja.
Obecnie prace trwają dalej. Specyfikacja została przepisana na komputerze, a interpreterowi doszły nowe funkcje. Na dzień dzisiejszy udało mi się na nim uruchomić nawet generator liczb losowych. Próbujemy załatwić skądś SVN, aby móc razem rozwijać kod interpretera. W planach mamy też dalsze rozszerzanie języka o kolejne zwariowane pomysły, jak np. wielowątkowość czy obsługa połączeń sieciowych. Historyczna rolka papieru toaletowego spoczęła w mych rękach, a prawdziwą potęgę Revomera świat pozna, gdy język wykupi znany monopolista z Redmond :D.















Napisał Ace w wtorek, 5 września 2006 o 11:16
Dzis znalazlem kilka artow na temat tworzenia jezykow skryptowych :) Moze z nich korzystales piszac wlasny parser? :)
http://ejsior.info/acms/300/