====== Maszyna Wirtualna =====

To ogólna nazwa dla programów tworzących środowisko uruchomieniowe dla innych programów. Maszyna wirtualna kontroluje wszystkie odwołania uruchamianego programu bezpośrednio do sprzętu lub systemu operacyjnego i zapewnia ich obsługę. Dzięki temu program uruchomiony na maszynie wirtualnej "myśli", że działa na rzeczywistym sprzęcie, podczas gdy w istocie pracuje na sprzęcie wirtualnym, "udawanym" przez odpowiednie oprogramowanie (maszynę wirtualną).

{{:języki_i_techniki_programowania:mv.png|:języki_i_techniki_programowania:mv.png}}

Wykonywanym programem może być zarówno pojedyncza aplikacja jak i cały system operacyjny lub nawet kolejna maszyna wirtualna. Są one zupełnie odizolowane przez maszynę wirtualną od maszyny fizycznej, w odróżnieniu od klasycznego systemu operacyjnego, który tylko zarządza uruchamianiem aplikacji na maszynie fizycznej.

====== Rodzaje VM ======

     *interpretery
     *kompilatory JIT
     *emulatory

//Interpreter// to rodzaj programu komputerowego (translatora), który analizuje kod źródłowy a przeanalizowane fragmenty (zazwyczaj jedna instrukcja) są wykonywane. Wykonanie powtórnie tego samego fragmentu wymaga powtórnej analizy.

//JIT-metoda// wykonywania programów polegająca na kompilacji do kodu maszynowego w locie, czyli bezpośrednio przed wykonaniem danego fragmentu kodu.

//Emulator// duplikuje funkcje jednego systemu w innym. Jedną z form emulatorów są programy, które umożliwiają uruchamianie aplikacji na komputerze lub systemie operacyjnym innym niż ten na który zostały napisane. 


====== Działanie ======

Maszyny wirtualne pozwalają uruchamiać programy napisane dla innych architektur bez żadnych zmian lub tylko z niewielkimi modyfikacjami (parawirtualizacja). Daje to dużą niezależność od fizycznego sprzętu, choć kosztem dodatkowej warstwy abstrakcji, która wiąże się z pewnymi niedogodnościami: oprogramowanie wirtualizujące samo wymaga części czasu procesora i pamięci operacyjnej, zwiększa także stopień komplikacji układu, a więc i ryzyko błędu.

Idealna maszyna wirtualna w pełni naśladuje działanie fizycznego sprzętu, teoretycznie możliwe jest więc dowolne i nieograniczone kombinowanie różnych warstw wirtualizacji, w tym np. rekursywne uruchamianie wirtualnych maszyn. Jest to możliwe dzięki przeźroczystości maszyny wirtualnej: każda kolejna maszyna wirtualna zachowuje się tak, jakby działała na sprzęcie fizycznym, nawet jeśli jego rolę pełni inna maszyna wirtualna. Ograniczeniem jest jedynie ilość dostępnych fizycznych zasobów systemowych sprzętu.


====== Zastosowanie =====

     * uruchamianie istniejących aplikacji i systemów operacyjnych w innych środowiskach niż pierwotne 
     * zapewnienie uniwersalnego środowiska uruchomieniowego 
     * bezpieczne rozdzielanie zasobów dużych maszyn (mainframe, superkomputery) 
     * jednoczesne uruchamianie różnych systemów operacyjnych na jednym komputerze 
     * uruchamianie na jednym komputerze programowych klastrów 
     * uzyskanie pełnej kontroli nad systemem operacyjnym, np. podczas analizowania jego pracy 
     * optymalizacja pracy programów, poprzez kontrolę ich środowiska działania i procesu translacji kodu 



====== Przykład ======

Kompilator języka Java wytwarza tzw. kod pośredni (ang. bytecode), który zawiera instrukcje wykonywane przez maszynę wirtualną Javy (JVM). Aby program w języku Java mógł być wykonywany na jakiejś platformie, musi na niej działać JVM. Maszyna wirtualna JVM działa na wielu platformach. Urządzenia specjalizowane (telefony komórkowe) mogą być wyposażone w mikroprocesory wykonujące jako rdzenne instrukcje kod pośredni Javy. Maszyna wirtualna implementuje z użyciem stosu zbiór rozkazów zawierający niezbędne działania arytmetyczne, logiczne, operacje przemieszczania danych oraz rozkazy sterujące. Ponieważ jest to maszyna wirtualna, może również realizować instrukcje, które są zbyt złożone, aby można było wbudować je w sprzęt, w tym instrukcje tworzenia obiektów i działań na obiektach. 

W Javie korzysta się z kompletnego środowiska realizowanego przez maszyne wirtualną. Kod pośredni jest na przykład sprawdzany pod kątem występowania rozkazów mogących naruszyć bezpieczeństwo lub niezawodność podstawowej maszyny.

Dzięki zrealizowaniu języka Java w konwencji maszyny wirtualnej powstało wydajne, dynamiczne, bezpieczne i przenośne udogodnienie obiektowe. Programy w języku java są wydajniejsze od tych interpretowanych i mają kilka zalet w stosunku do programów kompilowanych.

====== Techniki programowania w Javie ======

  * Klasa Object
    Najbardziej ogólna klasa w hierarchii klas. Wszystkie pozostałe klasy dziedziczą jej zachowanie.
  * Interfejsy 
    Zbiór metod wskazujący dodatkowe zachowania klasy (oprócz tych, dziedziczonych z klasy nadrzędnej). Metody wchodzące w skład interfejsu nie definiują zachowań.
  * Serializacja
    Obiekt przesyłany (zapisywany) z wykorzystaniem strumieni obiektowych musi implementować interfejs //Serializable//.
  * Pakiety
    Wykorzystywane do pogrupowania powiązanych klas i interfejsów
  * Kontenery (kolekcje)
    Pozwalają przechowywać obiekty oraz udostępniają mechanizm manipulowania.
  * Modyfikatory
    (public, protected, private, static, final, abstract, synchronized, volatile)
  * Mechanizm odbicia (odzwierciedlania)
    Technika pozwalająca klasie poznać właściwości innej klasy.
  * Klasy wewnętrzne
    Zdefiniowane wewnątrz innych klas. Są niewidoczne dla innych klas oraz posiadają dostęp do wszystkich atrybutów klasy górnego poziomu.
  * Obsługa zdarzeń
  * Aplety
    Uruchamiane są w dowolnej przeglądarce sieciowej. Kod umieszczany jest na stonie WWW za pomocą odpowiednich znaczników HTML.
  * Odśmiecanie pamięci
    Zarządzanie pamięcią jest dynamiczne i odbywa się całkowicie automatycznie.
  * Obsługa wyjątków
    (bloki try-catch, klauzule finally, throws)