Maszyna wirtualna Java
W informatyce maszyna wirtualna Java (zwana również wirtualną maszyną Java lub JVM ) jest komponentem oprogramowania platformy Java, który wykonuje programy przetłumaczone na kod bajtowy po pierwszej fazie kompilacji w kodzie bajtowym (wśród języków programowania, które można przetłumaczyć na kod bajtowy znajdujemy Java , Groovy , Clojure , Scala i Eta ).
Zasada
Czynności, które należy wykonać, aby uruchomić program napisany w Javie, są następujące:
- Programista używa edytora tekstu lub zintegrowanego środowiska programistycznego, takiego jak Eclipse, NetBeans lub IntelliJ IDEA, aby napisać jedną lub więcej klas Java
- Oprogramowanie kompilatora przekształca program w kod bajtowy, który jest niewielką abstrakcją kodu maszynowego
- Kod bajtowy jest dostarczany do wirtualnej maszyny Java, która go uruchamia
Kod bajtowy jest zazwyczaj tworzony przez kompilację kodów źródłowych (lub plików źródłowych ) napisanych w Javie , chociaż możliwe jest wytworzenie kodu bajtowego zaczynając od innych języków, takich jak Scala , Kotlin , Clojure czy Groovy [1] .
JVM jest zdefiniowana przez specyfikację utrzymywaną przez Oracle . Każdy system, który zachowuje się w sposób zgodny z tą specyfikacją, jest uważany za konkretną implementację JVM. Istnieją implementacje oprogramowania dla praktycznie wszystkich nowoczesnych systemów operacyjnych , zarówno bezpłatnych, jak i komercyjnych. Ponadto istnieją specjalne implementacje dla określonych środowisk sprzętowych / programowych , takich jak telefony komórkowe i PDA ), a nawet implementacje sprzętowe, takie jak Jazelle .
Dostępność implementacji maszyn wirtualnych Java dla różnych środowisk operacyjnych jest kluczem do przenośności Javy , głoszonej w haśle write raz, uruchamianej wszędzie . Maszyna wirtualna w rzeczywistości tworzy jednorodne środowisko wykonawcze, które ukrywa przed oprogramowaniem Javy (a więc przed programistą) wszelką specyfikę systemu operacyjnego :
| Oprogramowanie aplikacji Java |
|---|
| Maszyna wirtualna Java |
| System operacyjny |
Implementacje
OpenJDK i HotSpot
Oprócz obsługi specyfikacji maszyn wirtualnych Java, Oracle zapewnia implementację o nazwie HotSpot, która jest bezpłatna i częściowo open source. Część niedystrybucyjna dotyczy czcionek, dźwięku, bezpieczeństwa i szyfrowania [2] [3] ; Implementacje Oracle są zwykle postrzegane jako implementacje referencyjne , ale są również szeroko stosowane przez użytkowników końcowych, firmy i instytucje.
IcedTea i Zero
Aby zastąpić części HotSpota, które były objęte nieotwartą licencją, narodził się projekt IcedTea. [4] Maszyna wirtualna opracowana w ramach tego projektu nazywa się HotSpot Zero Assembly, również po prostu nazywana Zero. [5] Projekt ma również na celu wsparcie większej liczby rodzin procesorów niż maszyna wirtualna Oracle. Aby to zrobić, cały kod asemblera obecny w HotSpot został przepisany w C++, dzięki czemu można go kompilować na wielu architekturach. [6]
Pozostałe implementacje
Wiele innych stron regularnie dostarcza implementacje maszyn wirtualnych Java, zazwyczaj z zamiarem konkurowania wydajnością z implementacją Oracle; w niektórych przypadkach są to wdrożenia komercyjne. Dostępne są również inne implementacje open source ; wśród najbardziej znanych można wymienić Wabę [7] . Specyfikacje JVM są dyktowane i aktualizowane przez Oracle jako inicjatora i opiekuna projektu, ale często są lekceważone przez wiele implementacji JVM innych niż Oracle , które istnieją, zwłaszcza jeśli chodzi o framework , który zawiera każda JVM. W związku z tym różne maszyny JVM nie są ze sobą całkowicie kompatybilne i należy zachować ostrożność podczas pisania programów, jeśli chcesz, aby działały na każdej JVM. W tym celu najlepiej byłoby nie używać najnowszych funkcji językowych wprowadzonych przez Oracle w najnowszych maszynach JVM i korzystać ze „stabilnych” API , to znaczy, które były obecne w Oracle JVM w różnych wersjach.
Kompilacja Just-In-Time
Pierwszymi implementacjami wirtualnej maszyny Javy były interpretery . Rozwiązanie to okazało się jednak nieefektywne, ponieważ interpretowane programy były nadal bardzo powolne. Z tego powodu wszystkie ostatnie implementacje maszyn wirtualnych Java zawierają kompilator just -in-time ( kompilator JIT ), tj. kompilator wewnętrzny, który podczas uruchamiania w locie tłumaczy program kodu bajtowego Java na normalny program w języku maszynowym. [8] . Ponadto ta rekompilacja jest dynamiczna, to znaczy maszyna wirtualna stale analizuje model wykonania kodu ( profilaktycznie ) i dodatkowo optymalizuje najczęściej wykonywane części podczas działania programu.
Środki te, za cenę niewielkiego oczekiwania w fazie uruchamiania programu, pozwalają na posiadanie znacznie szybszych i lżejszych aplikacji Java. Jednak nawet w ten sposób Java pozostaje mniej wydajnym językiem niż poprawnie skompilowane języki takie jak C++ , biorąc pod uwagę fakt posiadania dodatkowych warstw abstrakcji i zaimplementowania szeregu automatyzmów, takich jak garbage collector , które z jednej strony oszczędzają pieniądze, czas i błędy w fazie tworzenia programów, z drugiej zaś zużywają pamięć i czas procesora w fazie wykonania gotowego programu.
Notatki
- ^ Simon Maple, przewodnik dla programistów przygód po językach JVM , na stronie zeroturnaround.com . Źródło 30 maja 2015 .
- ^ OtwórzJDK
- ^ Oracle America kontra Google , Federalny Sąd Apelacyjny, 9 maja 2014 r.
- ^ Projekt IcedTea zarchiwizowany 6 października 2014 r. w Internet Archive .
- ^ Zero i rekin FAQ
- ^ Zero i Shark: Zero- Assembly Port OpenJDK .
- ^ Waba
- ^ Haase, C. Consumer JRE: Leaner, Meaner Java Technology , Sun Microsystem, 2007 . Źródło 30 maja 2015 .
Bibliografia [1]
- ( EN ) Tim Lindholm, Frank Yellin, Gilad Bracha, Alex Buckley, Java Virtual Machine Specification , Java SE 8 Edition, 2014. Pobrano 3 października 2014 .
- ( EN ) Seth Sachin , Understanding Java virtual machine , Alpha Science International Ltd, 2013 . Źródło 3 października 2014 .
Powiązane pozycje
- ^ Ensemble Modo Antiquo., Muzyka krzyżowców. , Amadeus DARP, 2000. Źródło 22 września 2022 .