piątek, września 09, 2011

Przesyłanie "obcych" na odległość, albo uniwersalny format danych ;-)

Czytam sobie "2001 Odyseja kosmiczna" i jestem w okolicach gdy HAL9000 głupieje.
To spowodowało, że przypomniałem sobie inną AI z książek Arthura C. Clarke'a, czyli Atenę z "Burzy Słonecznej".
Atena z 2 innymi AI wysyła się w kosmos i po jakimś czasie trafia do odbiorników jakiejś obcej cywilizacji gdzie zaczyna znów działać w jakimś rodzaju sandboxu.

I tak się zacząłem zastanawiać czy można przesłać program komputerowy tak by można go było zawsze uruchomić?
Albo jeszcze prościej, czy można stworzyć format, który komputer "binarny" byłby w stanie zawsze zrozumieć? [gdzie zawsze oznacza po odpowiednio wielkiej ilości prób].

Wydaje mi się, że tak, choć nie mam pewności :-)

Wyobrażam sobie to w taki sposób.

Najpierw mamy liczbę n bitową [np. 32 bitową], powiedzmy 1024 [zapisaną na 32 bitach].
Później mamy 1024 liczby od 0 do 1024.

Ten fragment "załatwia" nam definicję liczb "dodatnich".

Później mamy kolejną liczbę 1024 i następnie liczby od -1023 do 0.

To definicja liczb ujemnych.

I pokazujemy, że potrafimy zakodować liczby ujemne i dodatnie... może nawet powinno być tak, że najpierw napisalibyśmy 2048, później zaś dali liczby od -1023 do 1024?

Teraz "nauka" bardziej skomplikowanych "formatów".

Tu nie mam jeszcze pomysłu :-) Ale idea jest taka by "nauczyć", że najpierw jest np. długość w "słowach", później ilość powtórzeń "bloku", a później bloki [i każdy ma swoją długość].

Teraz dobrze by było przedstawić "opcody".

Niechby to był "język" podobny do assemblera x86.
Byłoby kilka rejestrów, np. 6 + 1 do licznika instrukcji.

Zacząłbym od ADD.
długość ramki,opcode (np. 0xADD :-)),teraz rejestry czyli najpierw 7 razy 0, później 6 zer i 1.
po tym znów:
długość ramki,opcode (np. 0xADD :-)),teraz rejestry czyli najpierw 0, później 1, dalej 5 razy 0, później 1,0,0,0,0,0,1.
Liczę, że to by już pokazywało, że ADD działa na 2 pierwszych rejestrach i że ten ostatni może mieć coś wspólnego z licznikiem rozkazów.
Później:
długość ramki,0xADD,1,1,0,0,0,0,0 a za tym 2,0,0,0,0,0,1

To samo dla kolejnych paru liczb.
W końcu dla -1 i 1, -2 i 2 i -1023 i 1023.

Później by "pokazać", do czego służy licznik instrukcji walnąłbym coś w stylu:
ADD 10,10,0,0,0,0,0 -> 20,0,0,0,0,0,0,1
ADD 20,10,0,0,0,0,1 -> 30,0,0,0,0,0,0,2
i tak dalej.

W końcu prosty program w stylu:
ADD 1
ADD 20
ADD 30
ADD 10

i wynik w pierwszym rejestrze jest 61.
Najpierw program zapisany tak, że byłyby zapisane stany rejestrów, czyli
ADD,0,1,[zera],0
ADD,1,20,[zera],1
ADD,21,30,[zera],2
ADD,51,10,[zera],3

i wynik, następnie program tak jak powinien wyglądać, czyli to co było wyżej (ADD i liczba jako 1 linia) i znów wynik jako stan rejestrów. Później serię takich programów.

Następnie MOV, i programy używające MOV i ADD i wyniki ich działania.

Dalej reszta rozkazów.

Widzę tu masę problemów ;-) ale zakładam, że przy takim przekazie "odbiorca" mógłby podchodzić wiele razy do przekazu, tak by w końcu dostawać wyniki zgodne z "przekazem".

Na końcu takiego "pakietu" można by było umieścić właściwy program.

Ale gdyby się to udało to można by było załatwić resztę przekazu też. Najpierw przesłać program, później za nim dane dla tego programu :-) i moglibyśmy tak wysyłać dowolny format danych, bo zawsze miałby w sobie odtwarzacz :-)

Co najlepsze, taki "odtwarzacz" uniwersalny do takich danych nie byłby chyba znów tak skomplikowany, bo musiałby "tylko" odpowiednio wiele razy próbować uporządkować format tak by mu wszystko działało.

Pewnie zbytnio upraszczam, ale wydaje mi się, że takie coś by mogło działać :-)

Może więc 1 wiadomość jaką dostaniemy od obcych będzie w takim formacie? ;-)


Podobne postybeta
Celeron M353 900MHz vs. Intel Atom 1.6GHz, czyli o tym czemu jest remis? ;-)
Algorytm ;-)
Kontakt i Bez Wyjścia - końcówki zapalniki ;-)
Hackowanie odczytu danych Exif ;-)
Defragmentacja SSD - o tym dlaczego nie należy jej robić