De ce mașina virtuală Java vă ajută să executați mai bine codul
În prezent, dezbateți dacă să utilizați java pentru următoarea aplicație sau să utilizați seturi de instrumente și cadre native? V-ar plăcea să știți ce avantaje oferă java peste programele native pentru o aplicație? Citiți mai departe pentru a afla!
Ce este o aplicație nativă?
O aplicație nativă este un program scris special pentru un sistem de operare (OS) și, eventual, pentru hardware-ul specific ce rulează acel OS. Este scris mai ales într-o limbă precum C / C ++. Codul sursă C / C ++ este compilat într-o formă obiect folosind un compilator, care este asamblat într-un executabil prin legarea bibliotecilor necesare. Un program construit în acest fel va funcționa pe hardware-ul specific și pe sistemul de operare pentru care este construit, dar poate să nu funcționeze corect în alte sisteme.
De ce nu sunt aplicații portabile portabile?
Un compilator pentru o limbă precum C / C ++ traduce instrucțiunile de cod sursă în limbajul mașinii pentru CPU-ul vizat. Când încercați să executați acest cod pe un alt CPU, este posibil ca programul să nu funcționeze corect (sau să funcționeze deloc), deoarece instrucțiunile limbajului mașinii din codul compilat pot să nu fie acceptate de acest procesor.
În plus, noul sistem de operare poate fi diferit de cel original și poate nu recunoaște chiar fișierul program ca executabil. Acest lucru se datorează diferitelor formate de fișiere utilizate pentru executabile în diferite sisteme de operare (cum ar fi Windows, Linux, MacOS etc.).
Portabilitatea este o problemă atât de mare pentru aplicațiile native, încât doar actualizarea compilatorului la versiunea următoare poate introduce schimbări de rupere. Codul dvs. ar putea fi necesar să fie fixat pentru a lucra cu noul compilator. Ca atare, splattering codul sursă cu ceea ce sunt cunoscute sub numele de ifdef instrucțiunile pentru a izola soluțiile hardware, OS sau compilatoare sunt comune.
Următorul este un fragment de cod mic din biblioteca de compresie BZLib care ilustrează utilizarea ifdefpentru a izola particularitățile platformei:
#ifdef _WIN32 # include # ifdef mici / * windows.h definesc mici pentru a char * / # undef mici # endif # ifdef BZ_EXPORT # define BZ_API (func) WINAPI func # define BZ_EXTERN extern # alt / * import dll dinamic dinamic * / # (WINAPI * func) # definește BZ_EXTERN # endif #else # definește BZ_API (func) func # define BZ_EXTERN extern #endif
Transferabilitatea codului sursă în sistemele de operare
Această situație poate fi atenuată într-o oarecare măsură prin re-compilarea codului sursă C / C ++ la noul procesor. Cu toate acestea, sistemul de operare pentru noul procesor poate fi diferit. Și codul sursă poate să nu se compileze fără modificări, majore sau minore. Chiar și modificările minore ale versiunilor sistemului de operare pot necesita modificări ale codului sursă.
Și când vă gândiți la sisteme de operare diferite, cum ar fi Windows și Linux / UNIX, portabilitatea este un joc complet nou. Cu excepția cazului în care utilizați un set de instrumente sau un cadru care vă izolează complet de sistemul de operare, portabilitatea codului sursă este imposibilă. Acest lucru se datorează faptului că interfața sistemului de operare este complet diferită între aceste sisteme. Dacă, în cele mai îndepărtate colțuri ale codului, utilizați direct orice primitiv de sistem de operare, atunci codul dvs. nu va fi portabil în aceste sisteme de operare diverse.
Cum este Java diferit?
În acest scenariu, java oferă o nouă paradigmă, un nou mod de a construi software-ul. Când programați în Java, vizați a mașină virtuală. O astfel de mașină există ca concept, iar limba java oferă interfețe pentru programarea împotriva acestei mașini. De exemplu, puteți interoga cantitatea de memorie disponibilă, numărul de procesoare, interfețele de rețea etc. ale mașinii virtuale.
Cum sunt construite aplicațiile Java?
Limba java oferă un compilator Java care traduce codul sursă în codul obiect. Codul obiect este apoi executat de către mașină virtuală java, care este un program separat de compilator. Sistemul de operare, la rândul său, vizualizează mașina virtuală Java ca pe un alt program care rulează pe acel OS.
Sarcina portabilității a trecut acum de la programatorul de aplicații la furnizorul de mașini virtuale Java. Programatorul aplicației scrie software-ul folosind primitivele limbajului java, iar mașina virtuală Java este responsabilă pentru traducerea acestor primitive în facilitățile de sistem de operare gazdă. Când o nouă versiune a sistemului de operare iese, este responsabilitatea furnizorului de a actualiza mașina virtuală Java, astfel încât să funcționeze corect pe noul sistem de operare.
Care sunt avantajele mașinii virtuale Java?
Așa cum am menționat anterior, mașina virtuală Java oferă o vizualizare virtuală a sistemului de operare și a hardware-ului către programatorul de aplicații. Această vizualizare virtuală are forma diferitelor interfețe și metode și servește pentru a izola programul de aplicație de diferențele dintre sistemul de operare gazdă și hardware-ul subiacent. Astfel, programatorul de aplicații poate accesa facilități cum ar fi un Windowing Toolkit, Networking, grafică 3D, mai multe CPU-uri etc. fără a fi nevoie să recurgă la apeluri la nivel scăzut, ceea ce înseamnă că programul nu este portabil.
Un program java este scris și este compilat folosind compilatorul java. Codul obiect rezultat (numit cod octet) poate fi transportat la un alt sistem de operare gazdă care rulează pe hardware diferit și ar trebui să ruleze fără probleme.
JIT Compilator
Mașina virtuală java utilizează a Compilator JIT pentru a optimiza codul octet specific pentru CPU-ul țintă. JIT înseamnă La timp și se referă la optimizările runtime pe care JVM le aplică codului de octet pentru ca acesta să funcționeze mai bine pe procesorul curent.
Un alt avantaj al utilizării mașinii virtuale Java este că poate aplica diferite optimizări pentru diferite cazuri de utilizare, toate cu același cod octet. De exemplu, Oracle JVM oferă două opțiuni pentru rularea codului octet: un mod server și un mod client. Modul server se optimizează pentru programele servere de lungă durată, în timp ce modul JVM al clientului se optimizează pentru perioade de răspuns rapide, deoarece este probabil să fie utilizat în modul interactiv.
Pentru a rezuma, o aplicație nativă este construită pentru un anumit hardware și sistem de operare. O aplicație java, pe de altă parte, urmează a Build Once Run Anywhere filozofie, prin faptul că are un JVM rula instrucțiunile codului octet compilat. În timp ce aplicațiile native au fost în mod tradițional văzute ca fiind mai performante decât aplicațiile java, s-ar putea să nu fie întotdeauna adevărat datorită utilizării unui compilator JIT de către JVM.
Ai dezvoltat o aplicație nativă și a trebuit să treci la java din cauza portabilității? Sau invers din cauza problemelor legate de performanță? Spuneți-ne în comentariile de mai jos.
Credit de imagine: Profit_Image prin Shutterstock.com
Explorați mai multe despre: Java.