4.7. Reprezentarea internă a programului Java
Proprietățile de bază ale platformei Java
aplicațiile sunt programe în sensul obișnuit, dar sunt executate în mediul platformei Java;
applet-uri - programe care rulează în mediul de web-browser care acceptă platforma Java (Sun HotJava, Netscape Communicator, Microsoft Internet Explorer), astfel de programe pot fi transmise prin Internet și executat pe computerul client;
servlet-uri și boabe corporative - programe Java, componente de server ale aplicațiilor distribuite;
Tolerabilitatea în Java se realizează prin faptul că Java programul este compilat nu direct în orice comenzi specifice de calculator, și în așa-numitul, Java bytecode - echipa de unele mașini abstracte numit Java (JVM) mașina virtuală. Rezultatul final (modulul executabil) este un fișier de clasă - un program în Java bytecode. Pe țintă (pe mașină în cazul în care programul se execută), acesta trebuie să ruleze software-ul JVM, care emulează un computer, capabil de a rula comenzi Java bytecode. JVM în sine este dependent de platformă, adică este proiectat să funcționeze pe o anumită platformă și într-un anumit sistem de operare. JVM citește comenzi Java bytecode și simulează execuția lor pe platforma hardware și în mediul de operare în care operează. În acest sens, utilizează bibliotecile Java, de asemenea, dependente de platformă. Miezul tehnologiei este specificația Java bytecode, fișier de clasă și JVM. Compilatoarele Java pot fi create (și create) de diferiți dezvoltatori, dar toate modulele executabile generate de ele trebuie să respecte specificațiile Java bytecode. În plus, există compilatoare de alte limbi de programare care generează Java bytecode. De asemenea, dezvoltatorii diferiți pot dezvolta (și dezvolta) și JVM, dar toate JVM-urile trebuie să execute standardul Java bytecode.
Rularea aplicației în platforma Java
Deci, programul Java este executat în modul de interpretare. Deși Sun Microsystems își declară eficacitatea ca fiind una dintre principalele proprietăți ale programelor Java, din punct de vedere al vitezei, această afirmație este, în mod ușor, îndoielnică. Un program interpretat, în principiu, nu poate fi executat cât mai repede decât un program în codurile țintă. Eficiența programelor Java depinde de performanța JVM, iar JVM-urile diferiților producători diferă semnificativ în acest indicator (liderul este IBM). Ca parte a instrumentelor de dezvoltare Java, există, de asemenea, compilatoare "în timp util" (JIT-just-in-time) care traduc codul Java al codului de destinație, rezultând un modul executabil în platforma țintă și în formatul de sistem. Un astfel de modul este executat fără JVM, iar execuția lui este mai eficientă decât executarea bytecodei interpretate, dar aceasta este deja în afara platformei Java.
Astfel, independența Java-programe de platforme hardware specifice și sisteme de operare se realizează datorită faptului că Java platforma este un „strat“ suplimentar între aplicație și sistemul de operare și API-ul în locul sistemului specific de apeluri o anumită aplicație OS API utilizează JRE sau structura de bază a limbii
JVM suportă mediul de execuție bytecode intern, care are următoarele caracteristici interesante:
Un model dinamic de reprezentare a programelor. Java program este un set de clase, fiecare clasă este creat atunci când compilați un fișier binar cu clasa, dar metodele actuale soderzhischy bytecode, de asemenea, descrierea structurii de clasă (descriere a datelor și metode de antete). JVM, atunci când se încarcă clase pentru fiecare dintre ele, creează un obiect Class, un descriptor de clasă, în care sunt încărcate datele din fișierul de descriere. În plus, mânerul de clasă conține referințe la clasa parentală, interfețe și așa mai departe.
"Auto-determinare" - multe elemente ale reprezentării interne a programului pot fi descrise prin intermediul Java însuși. În primul rând, ele sunt descriptori de clasă de clasă, precum și proceduri de încărcare și legare a acestora. În plus, structura obiectelor de clasă. este descrisă în obiect - încărcătorul de clasă (denumit și clasă). Rezultă că JVM interpretează nu numai codul "utilizator", ci și câteva funcții ale sistemului care pot fi de asemenea scrise în Java;
controlul total al obiectelor. Toate obiectele din program sunt dinamice și moștenite de la strămoșii obișnuiți - clasa Obiect, adică toate obiectele au o entitate internă comună prin care JVM le poate "urma". În special, procedurile pentru colectarea automată a gunoiului se bazează pe aceasta: toate obiectele care sunt inaccesibile (direct, indirect sau recursiv) prin intermediul datelor de program locale sunt distruse;
multithreading. În Java, ideea de multi-threading implementat la nivelul limbajului ca abilitatea de a crea clase de obiecte derivate din clasa fir, în care se realizează metoda rula în paralel cu place de el în mediul local al obiectului curent. În JVM, firele nu sunt interpretate, ci implementate ca fluxuri fizice suportate de sistemul de operare. Din punct de vedere figurativ, pentru fiecare fir, este creată o instanță JVM separată. În plus, JVM în sine este, de asemenea, multi-threaded: funcțiile sale individuale sunt implementate ca fire independente.
Mai jos vom lua în considerare câteva caracteristici ale "procesorului" virtual al JVM, ca platformă pe care rulează programele Java.