Mam bardzo podstawowe pytanie dotyczące JVM: czy jest to kompilator czy interpreter?
Jeśli jest to interpreter, to co z kompilatorem JIT, który istnieje w JVM?
Jeśli nie, to czym właściwie jest JVM? (Nie chcę podstawowej definicji JVM konwersji kodu bajtowego na kod specyficzny dla maszyny itp.)
Odpowiedzi:
Najpierw przyjrzyjmy się następującym terminom
Javac
is Java Compiler - Kompiluje kod Java do kodu bajtowegoJVM
to wirtualna maszyna Java - uruchamia / interpretuje / tłumaczy kod bajtowy na natywny kod maszynowyJIT
is Just In Time Compiler - kompiluje podaną sekwencję instrukcji kodu bajtowego do kodu maszynowego w czasie wykonywania przed wykonaniem jej natywnie. Jego głównym celem jest wykonywanie poważnych optymalizacji wydajności.Więc teraz znajdźmy odpowiedzi na twoje pytania ...
1)
JVM: is it a compiler or an interpreter?
- Ans: Tłumacz2)
what about JIT compiler that exist inside the JVM?
- Odp: Jeśli przeczytałeś tę odpowiedź w całości, prawdopodobnie już ją znasz3)
what exactly is the JVM?
- Ans:.class
plik do pamięci RAMMam nadzieję, że ci to pomogło ...
źródło
To trochę z obu, ale nie w tradycyjnym sensie.
Nowoczesne maszyny JVM pobierają kod bajtowy i kompilują go do kodu natywnego, gdy jest potrzebny. „JIT” w tym kontekście oznacza „w samą porę”. Działa jako interpreter z zewnątrz, ale naprawdę za kulisami kompiluje go do kodu maszynowego.
Nie należy mylić maszyny JVM z kompilatorem języka Java, który kompiluje kod źródłowy do kodu bajtowego. Dlatego nie warto uważać go za „kompilator”, ale raczej wiedzieć, że w tle wykonuje on jakąś kompilację.
źródło
Podobnie jak @delnan już wspomniano w sekcji komentarzy, tak nie jest .
JVM to abstrakcyjna maszyna z kodem bajtowym Java .
JVM ma kilka implementacji:
... i wiele innych .
Większość innych odpowiedzi, gdy mowa o JVM, odnosi się albo do HotSpot, albo do mieszanki powyższych podejść do implementacji JVM.
źródło
.dex
kod bezpośrednio poprzez interpretację lub kompilację Just-In-Time (JIT)…” ( source.android.com/devices/tech/ota/ab/… )To jest jedno i drugie. Rozpoczyna się od interpretacji kodu bajtowego i może (jeśli uzna, że warto), a następnie skompilować ten kod bajtowy do natywnego kodu maszynowego.
źródło
To jest jedno i drugie. Potrafi interpretować kod bajtowy i kompilować go do kodu natywnego.
źródło
Jak powiedzieli inni, jest to jedno i drugie! Jeśli chcesz się do niego odnieść bardziej szczegółowo, niż widzisz: ten opis IBM
źródło
Javac jest kompilatorem, ale nie jest tradycyjnym kompilatorem. Kompilator zazwyczaj konwertuje kod źródłowy do języka na poziomie maszyny w celu wykonania i jest to wykonywane w jednym ujęciu, tj. Cały kod jest pobierany i konwertowany na język na poziomie maszyny RAZ. (więcej na ten temat poniżej). Podczas gdy JavaC konwertuje go na kod bajtowy zamiast języka na poziomie komputera.
JIT to kompilator języka Java, ale działa również jako interpreter. Typowy kompilator konwertuje cały kod naraz z kodu źródłowego na język na poziomie komputera. Zamiast tego JIT przechodzi wiersz po wierszu (wykonanie wiersz po wierszu jest funkcją interpreterów) i konwertuje kod bajtowy wygenerowany przez JavaC na język na poziomie maszyny i wykonuje go. JVM z JIT ma wiele implementacji. Hotspot jest jednym z głównych w programowaniu w Javie. Implementacja Hotspot sprawia, że JIT optymalizuje wykonanie przez konwersję fragmentów kodu, które są powtarzalne na język poziomu maszyny (jak wspomniany powyżej kompilator), tak aby można je było wykonać szybciej, zamiast konwertować każdą linię kodu 1 na 1. Tak więc, odpowiedź nie jest czarno-biała w odniesieniu do typowych definicji kompilatora i interpretera.
Tak rozumiem po przeczytaniu kilku odpowiedzi online, blogów itp. Jeśli ktoś ma sugestie dotyczące poprawy tego zrozumienia, nie krępuj się zasugerować.
źródło
JVM ma zarówno kompilator, jak i interpreter. Ponieważ kompilator kompiluje kod i generuje kod bajtowy. Następnie interpreter konwertuje kod bajtowy na kod zrozumiały maszynowo.
Przykład: Napisz i skompiluj program, który działa w systemie Windows. Przenieś plik .class do innego systemu operacyjnego (Unix) i uruchomi się z powodu interpretera, który konwertuje kod bajtowy na kod zrozumiały maszynowo.
źródło