2015. április 18., szombat

Tierra szimulációs rendszer

Tierra szintetikus élet - a lemodellezett evolúció

Vajon mi történik, ha egy biológus úgy dönt, hogy saját magát reprodukáló számítógépes programok kis világát teremti meg, hogy vizsgálhassa az evolúciót?
Az evolúciós folyamat modellezéséhez szándékosan el kellett rontani néhány bitet a modellbe betáplált "kód-organizmusokban". A tökéletesen működő számítógép belsejében egyfajta virtuális gépet hozott létre, amelyik kevésbé tökéletesen működik, mondjuk minden ötszázadik bitet hibásan másol át. Ezzel a másolási hibák gyakorisága szabályozott volt. Így alkotta meg Thomas Ray a "mesterséges Föld" absztrakt modelljét. Erre utalva a spanyol TIERRA nevet kapta, ami Földet jelent.

A TIERRA környezetben egy egység 5 bitből áll. Ezzel 32 utasítás volt kódolható. Ray kidolgozta, hogy milyen utasításkészlet alkossa a TIERRA programozási nyelvét. Úgy válogatta össze a 32 utasítást, hogy olyan programot lehessen írni, amik a TIERRA memóriájában létrehozzák önmaguk egy (a már említett random hibákkal létrejövő) másolatát.


Matematikusok később bebizonyították, hogy ez a szélsőségesen lecsupaszított számítógép is valójában éppen olyan univerzális, mint Neumann számítógépe volt. (Neumann megmutatta, hogy az univerzális számítógép képes önmagukat fizikailag reprodukáló robotok készítésére.) Ha megépítenénk valódi gépnek, azon is lehetne futtatni szövegszerkesztő-, játék- vagy böngészőprogramokat is. Ez fontos tény: nem lehet ugyanis azt állítani, hogy a TIERRA csak szimuláció, aminek alig van köze a valódi folyamatokhoz.

A TIERRA környezetben lényegét tekintve számítógépes vírusokhoz hasonló programok futottak. Egymással versenyeztek a processzor erőforrásaiért és a rendelkezésre álló memóriaterületért, amelyek az energia és az életterület absztrakt analógiájának tekinthetők. Ebben a környezetben az a program, amelyik kevesebb helyet foglal el, könnyen talál az utódjának helyet. Az amelyik gyorsabban, kevesebb processzorművelet felhasználásával szaporodik, szintén előnybe kerülhet.

A TIERRA környezet a benne futó konkrét programoktól függetlenül gondoskodik a másolási hibákról, illetve az idős, valamint a rendszert gyakran lefagyasztó programok elpusztításáról. (Találó neve ezen alrésznek a Reaper [Kaszás] volt. )

"Lehet zöld az ég, és lehet kék a fű..."

Amikor a környezet elkészült, Thomas Ray legjobb tudása szerint írt egy programot, amely képes volt elkészíteni önmaga másolatát. A legrövidebb ilyen program, amit el tudott képzelni, 80 utasításból állt. 1990. január 3-án sikerült először lefuttatnia ezt a programot a frissen elkészült TIERRA virtuális gépen, és mint írja, "ezzel elszabadult a pokol. [...] Kutatási programom egyszerre csak gyökeresen átalakult. Eddig egy rendszer tervezése volt a feladatok, innentől pedig csak a megfigyelés. Újra a dzsungelben voltam, hogy leírjak egy idegen világot, amelynek fizikája és kémiája teljesen másmilyen volt, mint az élet azon formáié, amelyeket ismertem és szerettem. Mégis, az élet olyan formái és folyamatai jelentek meg, amelyek egy gyakorlott természetkutató szemével valahogy nagyon is jól azonosíthatók voltak."

A gyakorlott természetkutató (és a hírszerzési dolgozó is) tudja, hogy amikor így ül megfigyelőhelyén, sokáig nem történik semmi érdekes. De figyelme nem lankadhat, bármikor történhet valami fontos dolog. Ray nem akart hinni a szemének, amikor egy 79 utasításból álló lényt látott, amely valamivel gyorsabban szaporodott, mint az ő 80-as utasítássorozata. Hosszabb programok is megjelentek, de azok idővel kihaltak. Egyszer csak megjelent egy 45 utasításból álló program, ami a vizsgálatok alapján egy valódi parazitának bizonyult: egy másik program kódjának részletét is felhasználta szaporodásához: megkereste az egyik 80-as kódját a memóriában, rákapcsolódott egy alkalmas ponton, és így magát a másolást (mint szaporodást) már ezzel végeztette el.

Számomra itt válik még érdekesebbé a történet. Egyes programok immunitást fejlesztettek ki az őket gyötrő parazita ellen, például a 79-es immunissá vált a 45-ös parazita egy változatára. Ám ekkor megjelent egy 51 soros, ami ezt a védelmet fel tudta törni. Még az altruizmus különböző formái is megjelentek, és hosszabb időn át fenn is maradtak. Előfordult, hogy egy parazita fejlesztett ki védelmet a "gazdaszervezete" számára, és ezzel annak ellenére jól járt, hogy maga egy kicsit hosszabbá vált.

Így történt, hogy Thomas Raynek soha többé nem kellett önreprodukáló programot írni. Gyártott neki rengeteget a TIERRÁ-ban zajló evolúció. Ezzel zárta ki azt a korlátozó tényezőt, ami az evolúció kutatásában állt a tudósok előtt: hogy csak egy van belőle, és azt is csak kis részletekben, régészeti leletekből vizsgálhatjuk. A TIERRA sokszori újraindítása során mindig más-más ökoszisztéma alakult ki, másfajta élőlényekkel és ezek legkülönbözőbb fajta összefonódásával. Néha még az ivaros szaporodás valamiféle formája is kifejlődött: egy programpár először is megkereste egymást a szaporodáshoz, ezek után mindkettő a TIERRA memóriájának ugyanarra a részére kezdte másolni önmagát, és így az utód által elfoglalt memóriaterület egy részére az egyik, a többi részére pedig a másik program kódrészlete került.

A TIERRÁ-nak sikerült elképesztenie Rayt, mint biológust és mint programozót. Egyszer váratlanul megjelent egy 22 utasításból álló program, amely teljesen egyedül is képes volt szaporodni. Nem volt sem parazita, sem másképpen nem függött más programoktól. Joggal döbbentette meg a program hatékonysága: negyed annyi utasítás is elég volt a kitűzött célhoz. Az evolúció minden megjelenési formájában csodákra képes.

Evolúciós verseny gazdák és a paraziták között egy leves-ben a Tierra Szintetikus Life program által kifejlesztett Tom Ray. A képeket az Artificial Life Monitor program jelenítette meg, amit Marc Cygnus írt. Minden kép 60.000 bájt-os levest jelenít meg. Minden egyes lényt egy színes sáv jelöl, színei megfelelnek-genom méretének (pl, piros 80, sárga 45, kék 79). 

A gazdák pirosak, nagyon gyakoriak. A paraziták sárgák, itt már megjelentek, de még ritkák.

A gazdák már ritkák, mert a paraziták itt már nagyon gyakoriak.
Itt megjelentek a pirosakra immunins gazdák a kékek, de még ritkák.

Az immunins gazdák egyre nagyobb a számban, elkülönülve a parazitáktól a felső memóriában.

Az immunins gazdák uralják memóriát, míg paraziták és fogékony gazdák csökkenése látszik.
A paraziták hamarosan a kihalás szélére kerülnek.

Röviden a Tierra rendszerről

Tierra - Spanyol szó, jelentése: Föld

Az eredeti tervezési kritérium szerint evolúcióra képes önreprodukáló gépi kód.

Másnéven darwini operációs rendszer, virtuális gép formájában van megvalósítva. A virtuális gép megvalósítás oka, hogy az önreprodukáló kód valójában egy vírus. Ha egy vírus nem virtuális környezetben működik, akkor bármikor elszabadulhat további gépekre. ld. első számítógépes vírus Creeper, (és Reaper).

Ez a szimulátor tulajdonképpen egy MIMD gép emulációja. A szimulátor alkotója: Thomas S. Ray (Tom Ray) A Tierra első verzója 1990-ben jelent meg. Jelenleg a V6.02 verzió érvényes (2011 nyár). A számítógép tudományon belül a mesterséges intelligencia azon belül a mesterséges élet témakörében találunk további információkat.


Template címzés

Architetúrális adottságok

A Tierra virtuális gépben nincs nincs numerikus művelet (ahol argomentumot adnánk). Ezért cím kalkuláció sem lehet ilyen alapon, vagyis nem lehet ugrási címet kalkulálni. Tom Ray azt "ajánlja" hogy az utasításkészlet a lehető legkisebb méretű legyen. A Tom Ray által definiált Istruction Set #0 32 utasításból áll.

Asszociáció

Hogyan lehet ilyen körülmények között ugró (ill. hívó) utasításokat megvalósítani? A válszhoz az ötlet a molekuláris gnetikából jön. Hogy "találják" meg egymást az összekapcsolódo molekulák? A kapcsolódó molekulák megtalálják az a "helyet" (egymáshoz illeszkedő formákat) ahol összekapcsolódhatnak. Ezek az un. template-ek.

Template-ek megvalósítása

Hogyan lehet megvalósítani a template-eket a Tierra programozási nyelvén? Az ötlet a következő: két különböző nop utasítás van, nop0 és nop1. Egyik nop sem csinál semmi "hasznosat", azoban egy template-et lehet belőlük csinálni. Íme egy template:

nop0
nop0
nop1
nop1

; ez a template: 0011 mintájú

; ehhez a template-hez illeszkedő template, 
; ennek az inverze, azaz: 1100, vagyis nop-okkal

nop1
nop1
nop0
nop0

; ez a template: 1100 mintájú

Hogy működik a jump?

A jump a mögötte lévő template-hez egy adott írányban az első illeszkedő template-re ugrik. Tehát az illeszkedő template keresése (így az ugrás iránya) egy adott irányba (előre vagy hátra) történik. Ha meggondoljuk, akkor ebből következik, hogy jump magára nem ugorhat, ilyen fajta végtelen ciklust nem okozhatunk.


Genetikai műveletek

Mutációk

A mutációk két féle módon változtathatják a gépi utasításokat:
  • Bit átbillentéssel: ekkor az utasítás egy bitjét (váletlenszerűen) átbillenti a rendszer
  • Véletlenszerű csere: ekkor egy teljes (véletlenszerűen választott) utasítás lesz kicserélve egy másik (szintén véletlenszerűen választott) utasításra. 

A mutációk a következő esetekben történhetnek:
  • a folyamatok születésekor
  • amikor a kód másolódik (egyik helyről a másikra)
  • bármikor véletlenszerűen (a kozmikus sugárzás hatását szimulálva)

Gének összekapcsolódása

További három esete van:
  • Kereszteződés
  • Beszúrás
  • Törlés 

A gének összekapcsolódása két helyen történhet:
  • Bárhol a genomban
  • Csak szegmens határokon, melyeket a template-ek jelölnek 

Szegmensek mentén történő gén összekapcsolás jellemzői:
A template-ek funcionálisan összefüggő kód darabokat jelölnek ki, így ha ezek mentén történnek a genetikai műveletek, akkor van esély hogy nem "értelmetlen" kódok kapcsolódnak össze. Nyilvánvalóan azon a felismerésen alapul, hogy a Tierra vezérlési folyamának pontjait jelölik ki a template-ek. A gének összekapcsolódása a folyamatok szaporodása során, az utód folyamaton törénik, annak megszületésekor.

Kereszteződés

A kereszteződésben résztvevő párok véletlenszerűen választódnak. Ekkor a genom kereszetzési pontja véletlenszerűen lesz megválasztva. A kereszteződés során az utód kisebbik része kicserélődik a kiválasztott pár megfelelő részével.

A kereszteződés kétféle formában történhet:
  • megtartva az utód méretét
  • megváltoztatvan az utód méretét

Beszúrás

A kereszteződéshez hasonlóan egy utód és egy kiválasztott társ vesz részt benne. Eltérően a kereszteződéstől a kód az utód kódjába beszúródik (nem cserélődik). A kód az utód bármely részébe beszúródhat. A kiválaszott társ kódjának bármely része beszúródhat az utódba.

Törlés

Maximálisan a genom fele törlődhet. A törlés folyamata: Elsőként a törlendő "darab" mérete kerül meghatározásra. Majd a törlés genomon belüli helye lesz kijelölve. Végül az adott méretű kódrészlet a törlődik a kijelölt helyről.

Szándékos hibák

A szándékos hibák (ebben a fejezetben a továbbiakban csak hibák) nem genetikai műveletek, mivel nem változtatják meg a genomot - bár módosítják a kód működését. A hibák ötlete a metabolikus reakciókban keletkező természetes hibákon alapulnak. Ekkor a reakció sikertelen vagy valamilyen melléktermék jön létre. Ennek megfelelően a Tierrában a hibák szándékosan változtatják meg a gépi utasítások hatását. Néhány példa a hibák hatására: aritmetikai műveletek esetén az eredményt +/- 1-el megváltoztaják regiszter mozgatások esetén egy szomszédos regiszterbe teszik az eredményt bit léptetés vagy rotáció esetén egy bittel tovább shiftelődik vagy léptetődik az eredmény


Darwini operációs rendszer

Slicer

A Slicer egy körré formált sor (queue) adat szerkezettel rendelkezik, a virtuális gépben futó folyamatok számára. A Slicer allokálja a CPU időszeleteket a sorban lévő folyamatoknak. A kapott időszelet mérete befolyásolja a folyamat által végrehajtható gépi utasítások számát. Az időszelet mérete lehet fixen meghatározott, véletlen változó alapján kiosztott vagy függhet a folyamat méretétől. A folyamatok születésükkor kerülnek a silcer sorába, pontosan a szülő folyamatuk utáni pozicióra.

Reaper

A Reaper egy közönséges sor (queue) adat szerkezettel rendelkezik a virtuális gép folyamatai számára. Az újonnan született folyamatok a sor alján lépnek be. Amikor a memória betelik, akkor a Reaper terminálja a Reaper sor tetején lévő folyamatot, majd eltávolítja a terminált folyamatot mind a Slicer, mind a Reaper sorából. Az eltávolított folyamat által allokált memória felszabadításra kerül, viszont a terminált folyamat kódja nem lesz eltávolítva, benne marad a soup-ban. Elős megközelítésben látható, hogy az idősebb folyamat terminálódik (hal meg) előbb. A Reaper ezen kívűl még terminálhat egy - a Reaper sor felső adott X%-ból - véletlenszerűen kiválasztott folyamatot. Amikor egy folyamat egy hibát generál (sikertelen mal vagy divide utasítás), akkor a folyamat feljebb lép egyet a Reaper sorban. Sikeres mal vagy divide esetén azonban lejjeb lép egyet a folyamat a Reaper sorban.

Memória allokálás

A memória allokálás összeköttetésben áll a Reaper-el. Amikor egy memória allokáció kérést nem lehet teljesíteni, mert nincs adott mennyiségű szabad memória, akkor a Reaper működésbe lép és terminál annyi folyamatot, hogy az általuk felszabadított memória elegendő legyen a legutóbbi memória allokáció kérés kiszolgálására. A memória kérések limitálva vannak, az első blokk méretének egy adott számszorosával (N*first_block_size).

Zavarok

A (mesterséges) zavarok a nem várt természeti események szimulációja. A virtuális gép szabályozott vagy szabálytalan időpillanatokban terminálhatja egyes folyamatok populációját. Indítási paraméterben megadható, hogy adott populációk hány százaléka kerüljön terminálásra és ez milyen időbeli minta szerint történjen meg.


A Tierra programozása

Hogyan kell programozni Tierra-ban?

A rendszer felépítéséből adódóan önreprodukáló kódot kell írni. Persze van lehetőség "egyszerűbb" (pl. teszt jellegű) programok írására, ekkor azonban nem nyer értelmet a Tierra eszközrendszere. A megírt önreprodukáló kódot creature-nek nevezik. A Tierra felparaméterezve (soup méret, genetikai műveletek paraméterei stb.) ezzel a creature-rel kerül elindításra. Ha a creature jól van megírva, akkor azonnal el kezd replikálódni, terjedni a soup-ban. Persze közben hatnak rá a szimulációs környezet hatásai (pl. genetikai műveletek) így a replikálódó kód el kezd megváltozni. A Tierra eszközrendszere ezeknek a változásonak a megfigyelésére és szabályozására készült. A soup-ban működő kódot gyakran genom vagy folyamat populációnak nevezik. Az azonos kódok egy genomot reprezentálnak. A genomot el is nevezi a Tierra rendszer, hogy könnyebben azonosítható legyen. A genomot alapvetően a programkód hosszáról és generációjáról nevezi el a rendszer. Nézzünk egy példát! A Tierra rendszerrel kapunk kész creature-öket. Ilyen a 0080aaa, melynek a neve a hosszából 80 (hexadecimálisan) és generációjából jön. Mivel ez az "első" generáció ezért az aaa nevet kapja, a következő ilyen hosszú kód generáció az aab nevet kapja. A 00800aaa Tom Ray által írt un. ősprogram. Ha ezzel elindítjuk a Tierra-t, további populációk jönnek létre, pl: 0061aai, 0069aab stb.

Az önreprodukáló kód szerkezete

Template
Önellenőrzés (méret), self-exam
Template
Reprodukciós ciklus, reproduction loop
Template
Másoló eljárás, copy procedure
Template

Utasításkészlet

Ahogy az 1. fejezetben említve lett, hogy a Tierra úgy lett kidolgozva, hogy könnyen változtatható legyen az alkalmazott utasítás készlet és könnyen és új utasítás készleteket is lehessen definiálni. A Tierra-val több utasítás készlet is jön. Természetesen mindegyik utasítás készletnek megfelelően különböző creature-ket lehet írni. Természetesen van egy "alapértelmezett" utasítás készlet, az Instruction Set #0. Ebben a leírásban minden példa a Instruction Set #0 felhasználásán alapúl.

Íme az Instruction Set #0

Instr Set #0

The original instruction set, designed and implemented by Tom Ray, in early 1990.

This instruction set operates on a CPU based on the following definitions:

#define STACK_SIZE 10
#define ALOC_REG 4
#define NUMREG 4         /* NUMREG = ALOC_REG */

typedef struct {         /* structure for registers of virtual CPU */
    Reg re[ALOC_REG];    /* array of registers */
    Reg ip;              /* instruction pointer */
    Reg sp;              /* stack pointer */
    Reg st[STACK_SIZE];  /* stack */
    I8s fl;              /* flag */
} Cpu;

The four registers in the re[] array are referred to as follows:
AX = re[0], BX = re[1], CX = re[2], DX = re[3].

No Operations: 2

nop0
nop1

Memory Movement: 11

pushA  (push AX onto stack)
pushB  (push BX onto stack)
pushC  (push CX onto stack)
pushD  (push DX onto stack)
popA   (pop from stack into AX)
popB   (pop from stack into BX)
popC   (pop from stack into CX)
popD   (pop from stack into DX)
movcd  (DX = CX)
movab  (BX = AX)
movii  (move from ram [BX] to ram [AX])

Calculation: 9

subCAB (CX = AX - BX)
subAAC (AX = AX - CX)
incA   (increment AX)
incB   (increment BX)
incC   (increment CX)
decC   (decrement CX)
zero   (zero CX)
not0   (flip low order bit of CX)
shl    (shift left all bits of CX)

Instruction Pointer Manipulation: 5

ifz    (if CX == 0 execute next instruction, otherwise, skip it)
jmp    (jump to template)
jmpb   (jump backwards to template)
call   (push IP onto the stack, jump to template)
ret    (pop the stack into the IP)

Biological and Sensory: 5

adr    (search outward  for template, put address in AX, template size 
       in CX)
adrb   (search backward for template, put address in AX, template size 
       in CX)
adrf   (search forward  for template, put address in AX, template size 
       in CX)
mal    (allocate amount of space specified in CX)
divide (cell division)

Total: 32 instructions

Creature létrehozása

Egy majndem üres program szerkezete:
A file nevének 0001aaa.tie-nak kell lennie.

format: 3  bits: 3
genotype: 0001aaa  genetic. 0,1  parent genotype: 0666god

CODE

track 0:

nop1    ; 110 01   egyetlen nop1 utasítás

Miért majdnem üres ? Hogy meg lehessen mutatni a programozáshoz alapvetően szükséged dolgokat. A fájl elnevezése nem véletlen. A 0001 résznek pontosan a fájlban lévő utasítások számával kell hogy megegyezzen, hexadecimálisa. Tehát ha a program 1 db utasításból áll akkor 0001 a név első része, ha 128 db utasítás van benne akkor 0080 a név első része. A név második részét érdemes fix aaa-ra venni. Ezt azt jelképezi, hogy egy mi általunk (ember által írt) genom lesz a file-ban. Ha ez a genom változik, akkor az újabb genomok az aab, aac stb. neveket kapják (feltételezve, hogy a genom hossza változatlan marad) megkülönböztetésűl. A file kiterjesztését célszerű .tie-re venni, hogy tudjuk ez egy Tierra forrás file.

Azonban nem elég, hogy a file neve tartalmazza a benne szereplő program hosszát! Ez inkább csak konveció, azért, hogy jobban meg tudjuk különböztetni a genomokat (pl. az ember által írtat a futás során létrejöttektől). A program méretének meg kell jelennie a genotype kezdetű sorban (ilyenmódon) kétszer is. Először genom (vagyis a file név kiterjesztés nélküli része), majd a genetic szó után szereplő 0, követve a program méret jön hexadecimális formában. Ha ennek a kitételnek nem teszünk eleget, akkor a fordító program figyelmeztet bennünket, hogy javítsuk ki.


A Tierra eszközök használata

A Tierra üzebehelyezése

A Tierra program üzembehelyezése egyszerű. Az általános ismertető oldalon megadott linkről azonnal letölthető, szintén a mellékelt linkek között van az elérhető dokumentáció linkje is. Érdemes a Quick Start lépéseit áttekinteni. A Tierra mind Windows és Linux ill UNIX rendszereken képes működni. Sem a Windows sem a (legtöbb) Linux esetén nem kell a program le fordításval bajlódnunk, a binárisok azonnal futnak.
(A példa Linux-ra vonatkozik)
A Tierra fő directory-jába (a példákban legyen ez is tierra) kerül a tierra végrehajtható file. Indítása egyszerű, ha nincs a PATH-ban, akkor a Tierra fő directory-jában:

$ ./tierra

Ha minden rendben, akkor azonnal indul a tierra. A tierra program azonnal üzen az alapértelmezett konzolra. Itt léthatjuk, hogy ha valami baj van. Ha rendben mennek a dolgok, akkor az üzenetek követik egymást. A programot a ^C billentyű paranccsal interaktív módba válthatjuk, ahol a megjelenő menün keresztül adhatunk különböző parancsokat, pl. leállíthatjuk a program futását.
Célszerű néhány további dolgot ismerni a program működéséről. A soup_in konfigurációs file-ban lehet beállítani az alapértelemezett futási paramétereket. A felhasználó is készíthet ilyen konfigurációs fájlt a saját beállításainak. Például ha a felhasználói konfigurációs fájl neve: si11, akkor a következő módon kell a tierra-t indítani:

$ ./tierra si11

Ekkor a konfigurációs fájlban megadott paraméterekkel indul a program. A legfontosabb paraméter GenebankPath paraméter.
A GenebankPath adja meg melyik un. gén bank directory-ból vegye a szükséges genom fájlokat a futáshoz és hová tegye az futás outputját.
Hogy a különböző genomok jól elkülöníthetően legyenek, a tierra a gén bank directory-kat használja. Ha készítünk egy új kézzel írt creature-t, akkor azt célszerű külön gén bank directory-ba tenni és ha "futtatjuk" a creature-t, akkor a keletkező outputokat szintén oda lehet helyezni. Így látható lesz, milyen genomok futtatása mit eredményez. A tierra konvencionálisan gb kezdetű directory neveket használ.
A konfigurációs fájl utolsó sora adja meg melyik genom kezdjen műköni a tierra indításával.
Példa konfig részlet (a # jel komment sort jelöl)

#
GenebankPath = gb11/  path for genebanker output
.
.
.
#
0080aaa

Ebben az esetben a tierra/gb11-es directory-ban léteznie kell egy 0080.gen fájlnak, csak akkor indul el a tierra.

Program fordítás a Tierra-ban

Ha már létrehoztunk egy forrás fájlt, mondjuk 0107aaa.tie néven akkor a következőket kell tennünk: Célszerű egy külön gén bank directory-ban tenni a fájlt, pl. gb11
A fordítás menete egyszerű:

$ ../arg c 0107aaa.gen 0107.tie

Ekkor keletkezik egy 0107aaa.gen biáris (végrhajtható fájl). Ha a soup paraméterek utolsó sora 0107aaa, akkor kell hogy létezzen a gb11/0107aaa.gen nevű filenak, aminek a már említett végrehajtható fájlnak kell lennie (célszerű a lefordított fájlt átmásolni vagy átnevezni).
A meglévő .gen fájlok visszafordíthatók forrás formára szintén az arg program segítségével.

$ ../arg x 0107aaa.gen aaa

A parancs kiadása után létrejön egy 0107aaa nevű fájl, ami Tierra forráskódot tartalmaz.

A tierra futásának megfigyelése

A Tierra rendszer számos eszközt biztosít a program "életének" nyomonkövetésére, hisz az egész rendszer értelme a szimuláció nyomén történő elemzés. Az egyik ilyen legfontosabb vizuális elemző program a Beagle Explorer (ez csak Linux-on áll rendelkezésre, Windows esetében egy másik program használható hasonló célokra). A Beagle Explorerrel nyomon követhetjük vizuálisan is a soup állapotát. Linux alatt a bgl-GUI_X11_Linux paranccsal indítható el.
Különböző log elemző programok is segíthetnek a munkában.

A tierra program futtatásának célja hogy elemezzük a megírt vagy létrejött kódok (genomok) működését:
  • Hogyan változnak a genomok?
  • Parazitizmus, alkalmazkodás, szexualitás mőködése
  • Például: a futtatások magas (több mint 70%-ban) megfigyelhető a loop unroll technika „kifejlődése”
  • Egyre kisebb creature-ok létrejötte


Egy Tierra program Tom Ray nyomán

0107aaa.tie ötlete

Assembly nyelven programozva, ha a programunkhoz hozzáadunk egy nop utasítást, akkor általában nem sok változást tapasztalunk. Persze, Assembly-ben is lehet olyan programot írni, ahol dramatikus hatása van egy nop-nak, de nem ez a jellemző. A Tierra kódjában azonban már néhány nop-pal is jelentősen megváltoztathatjuk programunk hatását! Emlékezzünk vissza a template címzés módszerére, ahol a jump utasítás egy kiegészítő (inverz) template-et keres meg ugrási célnak.

Ha például a kódunkba több helyre is elhelyezünk egy template-et, akkor előfordulhat, hogy a genetikai változások hatására a következő template-re ugrik a jump, ezzel jelentősen megváltoztatva a kód működését.

Tierra kódok írásakor elfogatott, hogy mindenki szeretné kissebb méretű önreprodukáló kódot írni, ami kihívásnak tűnik. Azonban más irányban is lehet próbálkozni. Tom Ray 0080aaa "ős programját" úgy vátoztattam, meg hogy 5 különböző 5 db nop-ból álló template-et tettem bele. A változtatás látszólag semmit nem jelent, nincs meg az aminek párja lehet a beírt template, nem csak összefüggő kóddarabokat választanak el ezek a template-ek (amitől az lenne várható, hogy hamar "szét esik" és nem tud tovább szaprodni a genom, hamar leáll a tierra futása).

Az így készült 0107aaa.tie mégis hasonlóan életképes (azonos indításai paraméterekkel) mint a kiválasztott ős.

0107aaa.tie

A pluszban beírt template nop utasításokhoz nem írtam kommentet.

**** begin genome file (note blank line at top of file)

format: 3  bits: 3
genotype: 0107aaa  genetic. 0,107  parent genotype: 0666god

CODE

track 0:

nop1    ; 110 01   0 beginning marker
nop1    ; 110 01   1 beginning marker
nop1    ; 110 01   2 beginning marker
nop1    ; 110 01   3 beginning marker
zero    ; 110 04   4 put zero in cx
not0    ; 110 02   5 put 1 in first bit of cx
shl     ; 110 03   6 shift left cx (cx = 2)
nop0
nop0
nop1
nop1
nop1
shl     ; 110 03   7 shift left cx (cx = 4)
nop0
nop1
nop1
nop1
nop1
nop1
movDC   ; 110 18   8 move cx to dx (dx = 4)
adrb    ; 110 1c   9 get (backward) address of beginning marker -> ax
nop0    ; 100 00  10 complement to beginning marker
nop0    ; 100 00  11 complement to beginning marker
nop0    ; 100 00  12 complement to beginning marker
nop0    ; 100 00  13 complement to beginning marker
subAAC  ; 110 07  14 subtract cx from ax, result in ax
movBA   ; 110 19  15 move ax to bx, bx now contains start address of mother
adrf    ; 110 1d  16 get (forward) address of end marker -> ax
nop0    ; 100 00  17 complement to end marker
nop0    ; 100 00  18 complement to end marker
nop0    ; 100 00  19 complement to end marker
nop1    ; 100 01  20 complement to end marker
incA    ; 110 08  21 increment ax, to include dummy instruction at end
subCAB  ; 110 06  22 subtract bx from ax to get size, result in cx
nop1    ; 110 01  23 reproduction loop marker
nop1    ; 110 01  24 reproduction loop marker
nop0    ; 110 00  25 reproduction loop marker
nop1    ; 110 01  26 reproduction loop marker
mal     ; 110 1e  27 allocate space (cx) for daughter, address to ax
call    ; 110 16  28 call template below (copy procedure)
nop0    ; 100 00  29 copy procedure complement
nop0    ; 100 00  30 copy procedure complement
nop1    ; 100 01  31 copy procedure complement
nop1    ; 100 01  32 copy procedure complement
divide  ; 110 1f  33 create independent daughter cell
jmpo    ; 110 14  34 jump to template below (reproduction loop)
nop0    ; 100 00  35 reproduction loop complement
nop0    ; 100 00  36 reproduction loop complement
nop1    ; 100 01  37 reproduction loop complement
nop0    ; 100 00  38 reproduction loop complement
ifz     ; 000 05  39 dummy instruction to separate templates
nop1    ; 110 01  40 copy procedure template
nop1    ; 110 01  41 copy procedure template
nop0    ; 110 00  42 copy procedure template
nop0    ; 110 00  43 copy procedure template
pushA   ; 110 0c  44 push ax onto stack
pushB   ; 110 0d  45 push bx onto stack
pushC   ; 110 0e  46 push cx onto stack
nop1    ; 110 01  47 copy loop template
nop0    ; 110 00  48 copy loop template
nop1    ; 110 01  49 copy loop template
nop0    ; 110 00  50 copy loop template
movii   ; 110 1a  51 move contents of [bx] to [ax] (copy one instruction)
decC    ; 110 0a  52 decrement cx (size)
ifz     ; 110 05  53 if cx == 0 perform next instruction, otherwise skip it
jmpo    ; 110 14  54 jump to template below (copy procedure exit)
nop0    ; 110 00  55 copy procedure exit complement
nop1    ; 110 01  56 copy procedure exit complement
nop0    ; 110 00  57 copy procedure exit complement
nop0    ; 110 00  58 copy procedure exit complement
incA    ; 110 08  59 increment ax (address in daughter to copy to)
incB    ; 110 09  60 increment bx (address in mother to copy from)
jmpo    ; 110 14  61 bidirectional jump to template below (copy loop)
nop0    ; 100 00  62 copy loop complement
nop1    ; 100 01  63 copy loop complement
nop0    ; 100 00  64 copy loop complement
nop1    ; 100 01  65 copy loop complement
ifz     ; 000 05  66 this is a dummy instruction to separate templates
nop1    ; 110 01  67 copy procedure exit template
nop0    ; 110 00  68 copy procedure exit template
nop1    ; 110 01  69 copy procedure exit template
nop1    ; 110 01  70 copy procedure exit template
popC    ; 110 12  71 pop cx off stack (size)
nop0
nop1
nop1
nop0
nop0
popB    ; 110 11  72 pop bx off stack (start address of mother)
nop0
nop1
nop1
nop1
nop0
popA    ; 110 10  73 pop ax off stack (start address of daughter)
nop1
nop0
nop0
nop1
nop1
ret     ; 110 17  74 return from copy procedure
nop1    ; 100 01  75 end template
nop1    ; 100 01  76 end template
nop1    ; 100 01  77 end template
nop0    ; 100 00  78 end template
ifz     ; 000 05  79 dummy instruction to separate creature

**** end genome file

Forrás: http://fbkerulo.blog.hu/2013/05/24/udvozlunk_a_blog_hu-n_16165
http://nyelvek.inf.elte.hu/leirasok/Tierra/index.php?chapter=1

Nincsenek megjegyzések:

Megjegyzés küldése