Tierra szimulációs rendszer

Programozás

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.