Wirtualna maszyna Javy

maszyna wirtualna zdolna wykonywać instrukcje w języku bajtowym Java

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 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.

Przegląd edytuj

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 edytuj

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 edytuj

Implementacje istniejących języków na JVM
Język Implementacja JVM
Common Lisp ABCL
Erlang Erjang
JavaScript Rhino
Pascal Free Pascal
PHP Resin
Python Jython
Ruby JRuby
Tcl Jacl

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 edytuj

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ż edytuj

Przypisy edytuj

  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.).