Wirtualna maszyna Javy

Przegląd architektury JVM. Kod programu napisanego np. w Javie lub Pythonie jest kompilowany do postaci kodu bajtowego, który następnie może być wykonany przez maszynę wirtualną na różnych urządzeniach. Maszyna wirtualna jest odpowiedzialna za ukrycie różnic między poszczególnymi platformami tak, że teoretycznie ten sam program można uruchomić w każdym miejscu.

Wirtualna maszyna Javy (ang. Java Virtual Machine, JVM) – maszyna wirtualna oraz środowisko zdolne do wykonywania kodu bajtowego Javy. Według szacunków różnych firm i autorów publikacji, liczba urządzeń wyposażonych w JVM wynosi 10 miliardów, w tym 1 miliard komputerów, a liczba programistów tworzących oprogramowanie na tę platformę – 6,5 do 9 milionów[1][2].

Przegląd

Wirtualna maszyna Javy to zestaw aplikacji napisanych na tradycyjne urządzenia i systemy operacyjne. Dostarcza środowiska, w którym może się wykonywać program skompilowany do postaci kodu bajtowego Javy, zapewniając takie usługi, jak odśmiecanie pamięci czy obsługę wyjątków oraz bibliotekę standardową. W zależności od potrzeb i liczby dostępnych narzędzi, wyróżniane są dwie główne dystrybucje:

  • Java Runtime Environment (JRE) – zawiera wyłącznie narzędzia niezbędne do uruchomienia aplikacji, tzw. środowisko uruchomieniowe;
  • Java Development Kit (JDK) – zawiera również narzędzia dla programistów pozwalające na tworzenie aplikacji na platformę JVM.

Wirtualna maszyna Javy nie jest nazwą konkretnego produktu. Dostępna publicznie specyfikacja pozwala różnym producentom oprogramowania na tworzenie własnych maszyn wirtualnych pracujących pod kontrolą różnych środowisk i urządzeń. Firma Oracle Corporation, twórca i właściciel znaku towarowego Java, udostępnia swoją maszynę wirtualną, ale inne firmy także mogą używać go w swoich produktach pod warunkiem, że ściśle przestrzegają oficjalnej specyfikacji i dodatkowych regulacji. Począwszy od Javy 7, wzorcową implementacją JVM jest OpenJDK będąca wolnym oprogramowaniem[3].

Elementy składowe

W skład maszyny wirtualnej Java wchodzą następujące elementy:

  • Interpreter – wykonuje krok po kroku instrukcje programu zapisane w postaci kodu bajtowego,
  • kompilator JIT – opcjonalny komponent wchodzący w skład części implementacji, który kompiluje najczęściej wykonywane fragmenty kodu do postaci kodu maszynowego, dzięki czemu mogą być one wykonywane bezpośrednio przez procesor komputera. Pozwala na zwiększenie wydajności,
  • Zarządca pamięci – zarządza stertą, na której przechowywane wszystkie obiekty wykonywanej aplikacji oraz zapewnia automatyczne zwalnianie nieużywanej pamięci,
  • Weryfikator kodu bajtowego – kluczowym dla bezpieczeństwa aspektem jest weryfikacja kodu bajtowego przed jego uruchomieniem, której celem jest sprawdzenie poprawności wszystkich odwołań oraz upewnienie się, że wykonanie danego fragmentu nie zaszkodzi stabilności lub bezpieczeństwu systemu, na którym uruchamiana jest maszyna wirtualna.
  • Java API – zestaw bibliotek programistycznych udostępniających takie usługi, jak obsługę plików czy GUI, z których korzystają wykonywane aplikacje. Większość biblioteki standardowej napisana jest w języku Java, dlatego maszyny wirtualne nie muszą dostarczać własnej implementacji.

Języki JVM

Implementacje istniejących języków na JVM
JęzykImplementacja JVM
Common LispABCL
ErlangErjang
JavaScriptRhino
PascalFree Pascal
PHPResin
PythonJython
RubyJRuby
TclJacl

Wirtualna maszyna Javy została pierwotnie stworzona do wykonywania programów napisanych w języku Java. Z biegiem czasu pojawiły się jednak kompilatory potrafiące kompilować wiele istniejących języków do postaci kodu bajtowego maszyny wirtualnej. Lista najważniejszych implementacji zawarta jest w tabelce obok. W ostatniej dekadzie powstało także kilka nowych języków zaprojektowanych z myślą o wykonywaniu na JVM:

Choć JVM została zaprojektowana z myślą o językach statycznie typowanych, z powodzeniem udało się zaimplementować na niej również języki typowane dynamicznie poprzez obejście części ograniczeń wprowadzanych przez specyfikację kodu bajtowego. W specyfikacji Java 7 po raz pierwszy pojawiło się wsparcie dla takich języków w postaci instrukcji invokedynamic, która pozwala na natywne wywoływanie metod pozbawionych informacji o typach argumentów[4][5].

Maszyny wirtualne

Referencyjną implementacją JVM począwszy od Javy 7 jest OpenJDK, otwarta implementacja powstała w wyniku stopniowego otwierania kodu źródłowego oryginalnej maszyny HotSpot stworzonej przez Sun Microsystems i zastępowania występujących w niej komponentów własnościowych[6]. Zamknięta wersja HotSpot jest w dalszym ciągu rozwijana przez firmę Oracle. Do niezależnych implementacji zaliczają się Kaffe oraz IBM J9.

Zobacz też

Przypisy

  1. Matt Raible: What's happening in the Java world. java.dzone.com, 2010-03-18. [dostęp 2011-11-12]. (ang.).
  2. JavaOne 2013 Review: Java Takes on the Internet of Things
  3. Moving to OpenJDK as the official Java SE 7 Reference Implementation. blogs.oracle.com, 2011-06-09. [dostęp 2011-11-12]. (ang.).
  4. Joab Jackson: Oracle ships Java 7 RC. javaworld.com, 2011-07-07. [dostęp 2011-11-12]. (ang.).
  5. John R. Rose: A renaissance VM: One Platform, Many Languages. oracle.com. [dostęp 2011-11-12]. (ang.).
  6. Sun Opens Java. Sun Microsystems, 2006-11-13. [dostęp 2011-11-12]. (ang.).

Media użyte na tej stronie

Java virtual machine architecture.svg
Autor: Dcoetzee (File:Computer-blue.svg by OpenClipart, File:Phone-blackberry-bold.svg by User:Techtoucian), Licencja: CC0
Diagram of the Java virtual machine (JVM) architecture. Source files in various languages are compiled into Java bytecode using compilers such as Javac and Jython. Any platform with a JVM can run the bytecode, by first passing it through a bytecode verifier and then either interpreting or compiling it to that platform's machine code on-the-fly with a JIT compiler. The Java APIs together with the JVM form the JRE (Java runtime environment). Both the JVM and APIs typically run as native code on top of the platform's operating system. Uses two public domain icons, File:Phone-blackberry-bold.svg and File:Computer-blue.svg.
Duke (Java mascot) waving.svg
Autor: sbmehta converted to SVG from Sun Microsystems AI version., Licencja: BSD
Duke, the Java Mascot, in the waving pose. Duke images are now Free Graphics see duke:Project Home Page for more details.