deus napisał(a)
Ba, jeśli będzie to dobrze zrobione to samą maszynę można rozwijać do nawet zgodności z x86... Ale to już większy hardkor.
Aż x86, chroniony czy rzeczywisty... a może dać możliwość przełączania? Z rozwinięciem problemu by nie było - piszę debuggger z disassemblerem przystosowanym do analizy i emulacji kodu więc /uwaga - uświęcone wieloletnią tradycją stwierdzenie/ jak skończę mogę to dostosować na potrzeby 4P-Wars :-) . Problemem jest coś innego - asm IA-32 jest bardzo skomplikowany dla zwykłego programisty. Kto na 4p - pomijając mnie - byłby w stanie pisać te nasze wirusy korzystając w pełni z możliwości tego asma?
Nie musisz tego tak mocno wbijać... tylko zasugerowałem, ale zaznaczyłem że to większy hardkor...
deus napisał(a)
maszyna przedstawiona jest jako 3 bloki podzielone na mniejsze, największy to "dysk" podzielony na 128 obszarów, potem "pamięć" na 64, potem "procesor" na 8.
Hm, trochę mało tego - oczywiście jeżeli jeden obszar == jedna komórka pamięci /jeden bajt/. Jak dla mnie 2^12 pamięci to minimum - kod programu też trochę zajmuje, w sumie można by go ograniczyć do stałego rozmiaru opkodów /DWORD/.
e... niezbyt, myślałem bardziej że jeden blok = 10 KB, wtedy prawdziwe by się stało stwierdzenie "640 KB wystarczy każdemu".
deus napisał(a)
Druga sprawa to wygląd pamięci w momencie zainicjowania VM - jakieś śmieci, db 0 czy co? Proponuję wypełnienie 0xFF /czyli po ludzku -1/, dałoby to programom możliwość 'znalezienia' innych kodów, przejęcia kontroli nad przeciwnikiem i 'wtopienia' się w niego, asymilacji /oczywiście można ładnie oszukać oszukać przeciwnika dająć odpowiednią sekwencję bajtów... film 'Coś' mi się przypomina ;P/. Może podział pamięci na strony /ew. segmenty/ czy coś w tym stylu?
podobnie to widziałem. "Czysty" bajt pamięci to 0xFF i wtedy rzeczywiście daje dobre rezultaty. Podział pamięci tak jak wspomniałem na bloki po 10KB, oczywiście to jest podział taki draftowy, ostateczna wersja ile czego i po ile to inna bajka.
deus napisał(a)
Teraz pytanie takie: czy to ma być coś a'la core wars gdzie programy biją się ze sobą? Bo jeśli tak to może to być trochę nudne, IMO lepiej by było, gdyby było coś oprócz bijących się programów, walki w kilku kategoriach
Co ja dalej chciałem... a, już mam: na jakiej zasadzie te programy mają konkretnie walczyć - wypełnianie pamięci bajtami o własnej sygnaturze jest raczej znacznie nudniejsze niż stary CW. To jest sedno sprawy - jak to ma wyglądać od strony wirtualnego sprzętu? Zmuszenie przeciwnika do rzucenia wyjątkiem, ew. obrona\naprawa swojego kodu przed takimi atakami przeciwnika nie jest zła. Ale można wymyślić jeszcze inne zadania - utworzenie XX niezależnych wątków czy przejęcie XX% czasu procesora. Np. nowy wątek zwiększa - kosztem czasu przeciwnika - czas procesora dla danego procesu o 1/2 aktualnego czasu czasu wątku, jak chyba widać zwiększa się liczba cykli dla procesu, ale zmniejsza dla pojedynczego wątku zmniejszając jego możliwości bojowe i czyniąc program łatwym celem - czas wątku == czas_procesu / liczba_wątków. Jeżeli ma być pseudo-OS to trzeba wprowadzić poziomy uprzywilejowania.
Hmm... zapełnienie pamięci własną sygnaturą, to jedna z wielu możliwości, można przecież jeszcze mnożyć własny kod i go uruchamiać jako odrębnego wojownika w trybie co-op, można robić "lock" pamięci, można nadpisać kod przeciwnika i zmuszać do różnych działań na własną rzecz... masa kombinacji różnymi stronami. So many ideas so little space... oczywiście oprócz wygrania przez przejęcie zasobów (std) to przecież można by wygrać np. absolutnie blokując przeciwnika (np. ustawić bit NX dla obszaru pamięci w którym się znajduje... chamstwo), "wywalić go" (buffer overflows, access violations, runtime-errors, you name it) i najbardziej spektakularne: przejąć go, czyli tak go skonfundować żeby albo powielał segment przeciwnika, albo coś takiego czy innego.
deus napisał(a)
Dobra, a teraz to co najbardziej interesuje moją skromną osobę: jak konkretnie ma VM wyglądać?
- rejestrowa - x86 się kłania
- stosowa - MIL czy jak się asembler .NETa nazywał
- 'pamięciowa' - RedCode /asm CW/
Mnie każda pasuje, chociaż 1, 3 przede wszystkim /stosową ścierpię/. W sumie rejestrowa ze stosem /jak w IA-32/ ma największe możliwości. Stos jako zwykły fragment pamięci, który przeciwnik może nadpisać czy prywatne sprzętowe 'coś' o ograniczonym rozmiarze? OK, jak już ustalimy jaka to VM, będzie trzeba rozkazy wybrać i format instrukcji opracować /to w sumie będzie najprostsze/. Myślę, że ograniczymy się do wyłącznie liczb całkowitych + ew. oparte na nich struktury kontrolne VM. Na co komu float do ukatrupienia przeciwnika? Cechą go czy mantysą przez stos? ;-P Jeszcze jedna sprawa: instrukcja == 1 cykl procesora? A może bardziej kompleksowe instrukcje będą dłuższe? Wypadałoby dać jakąś konkretną liczbę cykli procesowi np. czas procesora dla jednej tury /tury wszystkich programów/ wynosi 256 czyli po 128 na proces /oczywiście na starcie/.
"Nie mam pojęcia o czym pan mówi", ale co do instrukcji to miałem taki sen żeby instrukcje wykonywały się w miarę realnie, co znaczy że niektóre mogły by zająć 1/2 cyklu, niektóre 12 itp. Tury dobrze by było móc ustawiać zależnie od poziomu walk itd... jeszcze fajnie by było gdyby oprócz tur było też "real-time"
deus napisał(a)
Wizualizacja to już nie moja sprawa - mnie tekstowe logi wystarczą... byle by to nie myło różowe!
Wizualizacją mogą się zająć dzieci takie jak ja... I nie bój żaby, nic różowego czy innego cukierkowego nie będzie (chyba że pozostanie pomysł z logo programów, w tedy zależy tylko od twórców)
deus napisał(a)
Dobra, Wy myślcie, a ja idę się pobawić w "co autor chciał przez to powiedzieć?" silnikiem disasemblera - natrzaskałem kawał czasu temu struktur i flag, zająłem się czym innym i efekty są jakie są :/
Miłego.
Pamiętać należy że fajnie by było gdyby oprócz asemblera można było używać też innych języków, jak i na podstawie ich pisać nowe... dało by to duuuży realizm i niejedną pracę inżynierską/magisterską a nawet doktorską!
//edit: żebym nie zapomniał: przecież może być multum strategi, i multum rozwiązań a do tego można je kombinować razem w jednego wojownika... albo z jednego wojownika robi się kilka wyspecjalizowanych co-ops gdzie każdy robi swoje, byle by zdobyć przewagę... itd... wiele można kombinować i oby się dało...
//edit 2:
Bah, olśniło mnie!
Złą wodę wypiłem to mnie olśniło...
Gdzie w takim Core-wars sztuczna inteligencja programu, do tego jeszcze tak ograniczone środowisko?
No i jak mnie tak trafiło to pytanie, tak mnie trafiła odpowiedź:
Te opisane 4p-wars z tym ograniczonym środowiskiem, to pole testowe strategii, dające bojownikom możliwość przeanalizowania różnych strategii, sposobów obrony i ataku itp.
Teraz gdzie by się zaczęła sztuczna inteligencja: Uczestnicy pola testowego, powiedzmy top-20, albo i jeszcze inni ludzie, robią raz na jakiś czas (ustalany walnie) programy do robienia bojowników dla danej kategorii, czy cuś. Programy te właśnie by się popisywały sztuczną inteligencją, bo analizowały by strategie przeciwnika, znajdowały najlepszą obronę, implementowały w wojowniku, przewidywały strategie na następną turę itd. zagadka polegała by na tym, że programy analizują taktykę podczas walki, natomiast podczas walki nie mogą zmieniać kodu wojownika, dopiero po zakończonej rundzie (w razie wersji turowej tak samo, dopiero po zakończeniu walk) modyfikują wojownika dodając możliwe funkcje obronne + nowe strategie ataku. Oczywiście jakieś zasady tych modyfikacji by obowiązywały żeby nie było tak, że jeden program dodaje obronę na to co przeciwnik właśnie usunął.
Jak widać inteligencja tu jest, bo program musi być "wytrenowany" w rozpoznawaniu strategii, a sam na podstawie swojego treningu trenuje "pieska", czyli wojownika.
Przy takiej pobieżnej analizie, sądzę że zwycięzca w "inteligentnych wojnach" a raczej program tak stworzony byłby bardzo mocnym zawodnikiem...
//edit 3:
Jak to przeanalizowałem to widze kilka spraw nie związanych z samą stroną programową co z uczestnikami i develami:
-taki projekt jest cholernie skomplikowany, deus zapewne dużo potrafi, ale to nawet jego może przygnieść
-do wojen nie-inteligentnych output chyba powinien być w formie logów tekstowych, a z nich robić wizualizacje graficzne, da to większą możliwość dla tworzenia wojowników inteligentów i ułatwi tworzenie wizualizerów
-wojownika nie-inteligentnego bez problemu napisze jedna osoba, kwestia języka danego do dyspozycji przez twórcę maszyny... a może lepiej jak maszyna tylko by interpretowała bytecody czy cuś a języki by się napisało... nie wiem, ale na pewno wojownicy nie są aż tak skomplikowani
-wojownika inteligentnego napisać... no to już widzę większe problemy, kwestia zebrania danych treningowych, trenerów, sieci neuronowych... tu widze już teamy programistów...