RAM stroj Nataša Naglič 4. junij 2009 1 RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni trak, pomnilnik ter program. Bralni trak- zaporedje polj, vsako vsebuje celo število, lahko tudi negativno. Ko se znak prebere, se glava pomakne za eno polje v desno. Pisalni trak- zaporedje praznih polj. Ko se izvrši ukaz za pisanje, se v prazno polje vpiše število, glava se pomakne za eno polje v desno. Ko je simbol zapisan, se ga ne da spremeniti. Pomnilnik- neomejeno zaporedje registrov r0,... Vsak register lahko shrani eno število. Ta model je veljaven, če velja: Velikost problema je dovolj majhna, da ga lahko shranimo v glavni pomnilnik računalnika. Števila, uporabljena pri računanju, so dovolj majhna da jih lahko zapišemo z eno pomnilniško besedo. Program za RAM ni shranjen v pomnilniku. Iz tega sledi, da sam sebe ne more spreminjati. Je zgolj zaporedje ukazov; npr aritmetične operacije, operacije za sprejem in izpis podatkov, posredno naslavljanje, vejitve,... Vsa računanja se izvajajo v prvem registru r0, ti. akumulatorju. 1
Primer ukazov (Tabela 1). Slika 1: skica RAM modela Vsak ukaz je sestavljen iz operacijske kode in naslova ( ali oznaka). Operand je lahko: = i... celo število i, i... nenegativno število i, ki ponazarja vsebino registra i, *i... označuje posredno naslavljanje ( je vsebina registra j, kjer je celo število j zapisano v registru i, če <0 se stroj vstavi). Program P - V splošnem RAM program P definiramo kot preslikavo iz bralnega v pisalni trak. Definiramo ga s preslikavo c, iz nenegativnih celih števil v cela števila (c(i)... vsebina registra i), in pa s programskim števcem P C, ki določa naslednji ukaz, ki naj se izvrši. Na začetku imamo c(i) = 0, za vsak i 0. PC je nastavljen na prvi ukaz programa P, pisalni trak je prazen. 2
Operacijska koda LOAD STORE ADD SUB MULT DIV READ WRITE JUMP JGTZ JZERO HALT Naslov oznaka oznaka oznaka Tabela 1: Nabor ukazov Po izvršitvi k-tega ukaza programa P, se P C avtomatsko poveča na P C +1, tj. naslednji ukaz, razen če je k-ti ukaz JUMP, JGTZ, JZERO, HALT. Da bi določili pomen posameznega ukaza, definirajmo v(a)... vrednost a a: v(= i) = i, v(i) = c(i), v( i) = c(c(i)), Naslednja tabela (Tabela 2) definira ukaze, ki smo jih določili zgoraj. Operand a je lahko = i ali i ali i. Če ukaz ni definiran, npr. STORE(= i), ga obravnavamo kot HALT. Podobno tudi deljenje z 0 prekine program. Po izvršitvi ukaza sledi P C P C + 1. Torej se ukazi vršijo eden za drugim, dokler ne pride do ukazov HALT ali JUMP, ali dokler JGTZ ali JZERO nimata izpolnjenega pogoja. Predpostavimo, da P vedno prebere n števil iz vhodnega traku in na izhodni trak izpiše največ eno število. Če po branju x1,..., xn na izhodni trak zapiše y in nato prekine izvajanje, pravimo, da P izračuna funkcijo f(x1,..., xn) = y. Lahko pa RAM program definiramo tudi s končno abecedo znakov Γ, podobno kot Turingov stroj. Pri tem znake predstavimo s celimi števili 1,..., k, za nek k. RAM sprejme jezik tako, da vpišemo začetni niz s = a1 a2... an, a1 na prvo mesto traku... niz zaključimo z 0 na n + 1 mestu. 3
Ukaz Pomen LOAD a c(0) v(a) STORE i c(i) c(0) STORE i c(c(i)) c(0) ADD a c(0) c(0) + v(a) SUB a c(0) c(0) v(a) MULT a c(0) c(0) v(a) DIV a c(0) c(0)/v(a) READ i c(i) trenutni vhodni simbol (glava se premakne za eno polje v desno) READ i c(c(i)) trenutni vhodni simbol (glava se premakne za eno polje v desno) WRITE a trenutno prosto mesto na pisalnem traku v(a) (glava se premakne za eno polje v desno) JUMP b P C se nastavi na ukaz z oznako b JGTZ b P C se nastavi na ukaz z oznako b če velja c(0) > 0 JZERO P C se nastavi na ukaz z oznako b če velja c(0) = 0 HALT Konča izvajanje programa Tabela 2: Definicija ukazov Za niz pravimo, da ga je RAM program P sprejel, če P prebere vse znake s, znak 0, na pisalni trak zapiše 1 in konča program. Jezik, ki ga P sprejme, je množica sprejetih nizov. Poglejmo si še primer RAM programa, ki izračuna funkcijo. Definirajmo funkcijo: f(n) = { n n za n 1 0 sicer Spremenljivke r1, r2, r3 so shranjene v registrih 1, 2 in 3. Program množi število n samo s seboj n 1 krat (Tabela 3). 2 Računska zahtevnost Povprečni kriterij En register RAM programa porabi eno prostorsko enoto. En ukaz RAM programa porabi eno časovno enoto. 4
RAM program Pomen READ 1 beri r1 LOAD 1 če r1 0, zapiši 0 JGTZ pos WRITE = 0 JUMP endif pos: LOAD 1 r2 r1 STORE 2 LOAD 1 r3 r1 1 SUB =1 STORE 3 while: LOAD 3 dokler r3 > 0 JGTZ continue JUMP endwhile continue: LOAD 2 r2 r2 r1 MULT 1 STORE 2 LOAD 3 r3 r3 1 SUB =1 STORE 3 JUMP while endwhile: WRITE 2 zapiši r2 endif: HALT Tabela 3: RAM program Logaritemski kriterij (upošteva omejeno velikost ene enote spomina) Definirajmo naslednjo logaritemsko funkcijo za celo število i: { 1 za i = 0 l(i) = log i + 1 sicer Prva tabela (Tabela 4) prikazuje časovno zahtevnost t(a) za a, druga (Tabela 5) pa za vsak ukaz posebej. Logaritemski kriterij upošteva, da se število n v registru predstavi z log n + 1 biti. Osnovan je na dokaj grobi predpostavki, da je časovna zahtevnost izvršitve ukaza sorazmerna z dolžino a. 5
Operand a t(a) = i l(i) i l(i) + l(c(i)) i l(i) + l(c(i)) + l(c(c(i))) Tabela 4: Časovna zahtevnost za e Ukaz časovna zahtevnost) LOAD a t(a) STORE i l(c(0)) + l(i) STORE i l(c(0)) + l(i) + l(c(i)) ADD a l(c(0)) + t(a) SUB a l(c(0)) + t(a) MULT a l(c(0)) + t(a) DIV a l(c(0)) + t(a) READ i l(vhod) + l(i) READ i l(vhod) + l(i) + l(c(i)) WRITE a t(a) JUMP b 1 JGTZ b l(c(0)) JZERO l(c(0)) HALT 1 Tabela 5: Časovna zahtevnost za ukaze Poglejmo si logaritemsko casovno zahtevnost za ukaz ADD i: Poglejmo najprej koliko nas stane dekodiranje a: branje števila i: l(i), branje c(i), vsebine registra i in iskanje registra c(i): l(c(i)), branje vsebine registra c(i): l(c(c(i))). ADD i sešteje števili c(c(i)) in število c(0), tj. število v akumulatorju. Vidimo, da je l(c(0)) + l(i) + l(c(i)) + l(c(c(i))) dokaj realna ocena. Logaritemsko prostorsko zahtevnost definiramo kot vsoto po vseh registrih, tudi akumulatorju; l(xi), kjer je xi največja vrednost shranjena v registru i med računanjem. Izračunajmo sedaj časovno in prostorsko zahtevnost RAM programa, ki smo ga opisali zgoraj. Največ nas stane zanka množenja (MULT ). Ko se 6
vrši i-tič, akumulator vsebuje n i, drugi register pa vsebuje n. Skupaj imamo n 1 ponovitev ukaza MULT. Povprečni kriterij: vsaka izvršitev nas stane eno časovno enoto, torej za vsa množenja O(n). Če gledamo logaritemski kriterij dobimo: i-to množenje: l(n i ) + l(n) = (i + 1) log n Vsa množenja: n 1 i=1 log n O(n 2 log n) Prostorsko zahtevnost določajo števila shranjena v registrih 0 do 3: Povprečni kriterij: O(1). Logaritemski kriterij: O(n log n), saj je največje število shranjeno v katerem od teh registrov n n in l(n n ) = n log n. Literatura: [1] http://www.fmf.uni-lj.si/ orbanic/ram.pdf 7