Stan kodu źródłowego prezentuje się następująco: Revomer jest już w stanie wykonać większość z przewidzianych w specyfikacji zadań. Działa COME HERE, działa UNLESS, działa nawet CONF (zamiana funkcji nazwami). Do dokończenia wciąż pozostaje system sars służący do zmiany długości słowa, aby można było przekazywać większe liczby jako parametry do instrukcji (przy okazji wykonanie takiej zamiany odwraca starszeństwo bajtów :)). Jednym z najnowszych nabytków jest tzw. Logika Revomerowa. Jest to odmiana logiki klasycznej, w której prawda ma wartość ujemną: -1. Do dyspozycji jest jeden operator: NAND, a także dwa reduktory pozwalające zredukować dowolną liczbę do prawdy lub fałszu. Is negative zwraca -1 dla liczb ujemnych, a 0 dla nieujemnych. Reduktor standardowy jest o wiele bardziej wyszukany. Aby za jego pomocą określić wartość logiczną liczby, należy zapisać ją słownie w języku ferrinckim, zahaszować algorytmem MD5 i wziąć trzeci bit siedemnastego bajtu otrzymanego ciągu. Opcjonalnie zamieniamy jeszcze 1 na -1 i gotowe. Tym ma się zająć Krzysiek, jak tylko poczuje się pewnie w obsłudze SVN-a.
Drugą sprawą jest tenże właśnie SVN udostępniony nam, jak pisałem, przez Łukasza Bobińskiego. Repozytorium można przeglądać online: https://svn.harem.com.pl/public/revomer. Tam także można zapoznać się z całym kodem źródłowym - co prawda jest w nim lekki bałagan, a i on sam nie jest pisany do końca z przyjętymi normami organizacji kodu źródłowego w C++, ale ważne że działa i realizuje swoje zadanie :).
Revomer od samego początku okazał się być językiem zupełnym w sensie Turinga. Jak się to udowadnia? Có, trzeba to mocno streścić, ale mam nadzieję, że zachowam sens. Zanim powstały komputery, matematycy zastanawiali się nad problemem obliczalności. Powstało wtedy kilka modeli potrafiących automatycznie wykonywać obliczenia. Jednym z nich była maszyna Turinga, składająca się z nieskończonej taśmy danych, po której porusza się głowica czytająco-zapisująca. W zależności od stanu, w jakim się znajduje i znaku na aktualnej pozycji, maszyna modyfikuje go i przesuwa się w prawo lub w lewo. Okazuje się, że na tak prymitywnym modelu można wykonać każdy algorytm, który da się wykonać na normalnym komputerze (dysponując nieskończonym czasem) - zatem oba te urządzenia są sobie rówoważne. Kolejnym pojęciem jest tzw. Uniwersalna Maszyna Turinga, która jako dane przyjmuje ciąg będący opisem innej maszyny turinga (wraz z danymi), po czym wykonuje ją. Taka maszyna także jest zupełna w sensie Turinga, a dla nas oznacza to, iż jeden model obliczeń równowany maszynie Turinga może emulować inny model obliczeń.
Jednym ze sposobów dowiedzenia, że jakiś model jest zupełny, jest pokazanie, że można w nim stworzyć Uniwersalną Maszynę Turinga. Jest to raczej oczywiste - załóżmy, że mamy problem X, którego nie da się rozwiązać w naszym modelu obliczeń, ale da się rozwiązać maszyną Turinga. Skoro potrafi on jednak emulować UMT, przekształcamy opis problemu tak, aby był akceptowalny przez UMT i poszczamy w takiej postaci do naszej emulowanej maszynki. W ten sposób rozwiązaliśmy nasz problem X za pomocą modelu, który zgodnie z założeniem nie potrafi go rozwiązać. Sprzeczność. Wyobraźmy sobie teraz, że zamiast maszyny Turinga pan Alan Turing wymyślił Brainfucka. Model obliczeń proponowany przez ten język też jest zupełny, zatem czy coś by to zmieniło, gdybyśmy rozprawiali o Uniwersalnych Maszynach Brainfucka itd? Nie - przecież jedno i drugie jest sobie równoważne. Cała sztuka polega zatem na pokazaniu, że w Revomerze da się napisać interpreter Brainfucka. Posiedziałem, podumałem i wymyśliłem, jak mógłby on działać. W wolnej chwili postaram się to jakoś estetycznie poskładać do kupy i zaprezentować.
Gdy skończymy Revomera 0.9, zabierzemy się za opracowywanie wersji 1.0 posiadającej wiele nowości. Języki ezoteryczne już nigdy nie będą takie same :)
- Funkcje obsługi plików
- Funkcje sieciowe
- Wielowątkowość oraz system wyjątków (przechwytywanie operacji ROPE (random operation) :).
- Dynamiczny przydział pamięci.
- Biblioteka obsługi interfejsu tekstowego.
- Biblioteka Funkcji Nieużytecznych, np. DTS (usuwa plik źródłowy programu :)) - dzięki niej każdy ROPE stanie się niezapomnianym przeżyciem :).
- Możliwość kompilacji programu do postaci bytecode'u lub nawet do pliku wykonywalnego!
Interpreter nowej wersji zostanie napisany od nowa w formie świetnie zorganizowanej biblioteki, którą będzie można wykorzystać na wiele sposobów. Chcesz napisać zaawansowany IDE z debuggerem? Nic trudnego. Bierzesz bibliotekę i nie musisz się martwić o część związaną z wykonywaniem programów :).
Acha, niedługo ruszy strona poświęcona Revomerowi, gdy tylko zjawi się wreszcie Anas i mi subdomenę podepnie pod odpowiedni katalog.







Napisał dr_bonzo w poniedziałek, 25 września 2006 o 22:07
Nie znam sie na pisaniu jezykow, ale brzmi szalenie:
"Biblioteka Funkcji Nieużytecznych" -- przepisywana co roku od nowa :P
a "Reduktor standardowy" wymiata :)