Wirtualna maszyna Javy (JVM)
Spis treści
Wirtualna maszyna Javy jest podstawą działania każdego programu napisanego w Javie. W odróżnieniu od języków takich jak np. C, czy C++, gdzie wynikowy program kompilowany jest do kodu maszynowego, czyli takiego, który jest zestawem poleceń, które są zrozumiałe dla komputera, w Javie mamy do czynienia z etapem pośrednim, czyli program jest zestawem poleceń do wykonania na wirtualnej maszynie, a ta w trakcie działania programu interpretuje polecenia i tłumaczy je na instrukcje niższego poziomu.
Wydajność
Pierwsze co może nam przychodzić do głowy w takiej sytuacji, to fakt, że program na pewno będzie wolniejszy niż w przypadku, gdy wirtualna maszyna nie występuje. Między innymi z tego powodu Javie przypisuje się powolność, która wynika raczej z niewiedzy, pewnie każdy kojarzy dowcipy typu:
Puk puk.
- Kto tam?
(długa cisza)
- Java.
Problem w tym, że te mity powielane są najczęściej przez programistów języków takich jak Python, Ruby, czy PHP, które według wielu benchmarków w realnym świecie są nawet kilkukrotnie wolniejsze od Javy (również są to języki interpretowane).
Obecne implementacje JVM dostarczają wielu optymalizacji, więc jeśli maszyna wirtualna "zauważy", że np. pewien fragment kodu powtarzany jest bardzo często w naszym kodzie, to skompiluje go do kodu maszynowego znacząco przyspieszając jego wykonanie - mechanizm taki nazywamy Just in Time compilation (JIT). Część optymalizacji może dotyczyć również "poprawienia" naszego kodu, czyli maszyna wirtualna potrafi wykrywać proste i często powtarzane fragmenty, które upraszcza nie modyfikując samego działania programu.
Odśmiecanie pamięci
Największą zaletą wirtualnej maszyny jest jednak pomoc przy zarządzaniu pamięcią. Oznacza to, że po utworzeniu jakiegoś obiektu (ogólnie zapisaniu pewnych informacji w pamięci komputera) nie musimy w większości przypadków uważać na to, żeby takiego obiektu się samodzielnie pozbyć (zwolnić miejsce dla kolejnego obiektu). Zajmuje się tym specjalny mechanizm nazywany garbage collectorem. Jest on uruchamiany co pewien czas automatycznie i jego zadaniem jest odnajdywanie takich obiektów, co do których mamy pewność, że w naszym programie już nikt nie będzie się odwoływał i usuwanie ich z pamięci. Mechanizm taki znacząco ułatwia i przyspiesza proces wytwarzania oprogramowania.
Inne języki JVM
Wirtualna maszyna Javy dzięki swojej nazwie jest naturalnie kojarzona przede wszystkim z językiem programowania Java. Okazuje się jednak, że wielu ludzi uznało ją za tak przydatną i wydajną, że postanowili stworzyć własne języki programowania, które również kompilowane są do kodu pośredniego (byte kodu) tak samo jak Java i są uruchamiane właśnie na JVM.
Po co robić coś takiego? Przede wszystkim Java jest z założenia językiem, w którym dominującym paradygmatem jest programowanie obiektowe. Od Javy 8 wprowadzono elementy programowania funkcyjnego, jednak wielu osobom nadal brakuje w tym języku wielu funkcjonalności. Z tego powodu powstały języki takie jak np. Scala , czy Groovy, gdzie wiele rzeczy starano się uprościć (z powodzeniem), składnia jest bardziej ekspresywna, a sam kod może być znacząco krótszy. Trzeba tutaj jednak pamiętać, że ostatecznie programy napisane np. w Scali uruchamiane są na dokładnie tej samej maszynie wirtualnej co programy napisane w Javie, kluczową rolę odgrywa tutaj kompilator tłumaczący kod zapisany przez programistę na bytecode rozumiany przez JVM.
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.