5. Java Virtual Machine

Prilikom kompiliranja, izvorni se kod prevodi u tzv. bajt-kod. Kompilirani bajt-kod može se pokrenuti na svakom računalu za koje postoji Java Virtual Machine (JVM). Interpreter, koji je dio izvršnog sustava, uzima naredbe iz bajt-koda, te ih prevodi u naredbe za konkretno računalo ili operativni sustav. Na taj se način isti bajt-kod može izvršavati na različitim računalima, a upravo JVM ima zadatak da to omogući. Budući da je bajt-kod samo privremeni oblik izvršnog koda, nešto se vremena gubi i na konačno prevođenje u naredbe odredišnog računala.

Što je, zapravo, bajt-kod? Bajt-kod najjednostavnije je zamisliti kao asemblerski jezik za neko izmišljeno računalo. Prilikom definiranja toga izmišljenog računala, potrebno je osmisliti svaki njegov dio, kao kada bismo zaista konstruirali neko stvarno računalo. Treba precizno definirati kako se pojedini dio ponaša i kako se može programirati. Kad kompilator prevodi izvorni kod programa, on iz njega stvara program za tu izmišljenu platformu. To “izmišljeno” računalo naziva se upravo Java Virtual Machine (“prividni stroj”). Ono se nalazi u memoriji našeg računala tijekom izvršavanja programa koji su pisani u Javi, te prevodi naredbe bajt-koda u konkretne naredbe za računalo. Drugi, također veliki dio posla, obavlja interpreter, koji mora “uvjeriti” program pisan u Javi da se izvršava na stvarnom računalu.

Izvršni sustav može se podijeliti u sedam osnovnih dijelova:

- skup registara

- stog

- okružje za izvršavanje programa

- memorijska hrpa

- bazen konstanti

- područje za pohranjivanje metoda

- skup naredbi

Registri u izvršnom sustavu za Javu slični su registrima u pravom računalu. Ipak, postoji jedna značajna razlika. Budući da naredbe Javinog bajt-koda rade isključivo sa stogom, registri se ne koriste za razmjenu podataka u programu, kao što je to slučaj kod “pravih” računala. Stogovi su bolji odabir za tok informacija u programu, jer su većina današnjih računala siromašna registrima.

U izvršnom sustavu postoje četiri registra širine 32 bita:

- pc, programski brojač (program counter)

- opto, pokazivač na vrh operanda, odnosno, pokazivač na vrh stoga koji sadrži operande (operand top)

- frame, referentni okvir (reference frame)

- vars, registar za varijable (variable register).

Javin izvršni sustav koristi stog za slanje parametara metodama, izračunavanje izraza i dobivanje rezultata od njih. Sve naredbe bajt-koda uzimaju podatke sa stoga, nad njima obavljaju svoje operacije i zatim rezultate postavljaju natrag na stog, odakle ih može uzeti neka sljedeća naredba. Poput registara i stog je širine 32 bita.

Okružje za izvršavanje programa je dio stoga. Ono se brine o načinu prosljeđivanja parametara u metode i vraćanju rezultata u glavni program.

Svakom programu koji se izvršava u izvršnom sustavu dodjeljuje se memorijsko područje iz kojeg može alocirati (dobiti) memoriju. To se područje naziva memorijskom hrpom ili memorijskim bazenom. Njegova je standardna veličina 1MB. Unatoč tome što je veličina memorijskog bazena unaprijed određena, on može rasti tijekom izvršavanja programa. No, kako se ne bi dogodilo da memorijska hrpa postane prevelika, Javin izvršni sustav stalno obavlja postupak prikupljanja memorijskog smeća (garbage collection), tijekom kojeg se oslobađa sva memorija koja se više ne koristi.

Svaka klasa iz memorijskog bazena ima svoj bazen konstanti. Budući da se konstantne vrijednosti tijekom izvršavanja programa ne mijenjaju, kompilator može odmah tijekom kompiliranja programa stvoriti posebna memorijska područja namijenjena konstantama, tzv. bazene konstanti. Kompilirana klasa sadrži informacije o tome koliko se konstanti u njoj nalazi i na kojoj memorijskoj adresi počinje njihovo memorijsko područje, bazen.

Javino područje za pohranjivanje metoda slično je područjima u koja drugi programski jezici smještaju kompilirani kod. To područje sadrži bajt-kod koji pripada pojedinoj metodi.

Interpreter proučava svaku naredbu bajt-koda i izvodi radnju koja je označena tim bajt-kodom. Ta se radnja može protegnuti kroz veći broj procesorskih ciklusa, ovisno o procesoru i računalu na kojem se izvršava JVM. Javin interpreter koristi mnoge napredne tehnike za ubrzavanje prevođenja, čime kompenzira vrijeme koje se tijekom izvršavanja programa izgubi na interpretiranju.

Sadržaj