Czy JVM to kompilator czy interpreter?

85

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

sns
źródło
16
JVM to maszyna wirtualna. Bytcode wchodzi, pojawiają się obserwowalne efekty programu. Wszystko inne to szczegół implementacji.
1
Tak, nie ma "JVM", jest wiele implementacji specyfikacji.
paxdiablo
@delnan, proszę napisz to jako odpowiedź. Naprawdę chciałbym zagłosować za taką odpowiedzią.
aioobe
@aioobe: Nie będę. Nie sądzę, aby odpowiadało na zadane tutaj pytanie - to bardzo przydatna perspektywa, ale pytanie (wyraźnie podane w tytule i poście) wyraźnie wymaga tych szczegółów implementacji.
Słusznie. Powiedziałbym, że jest to odpowiedź na pytanie „Jeśli nie, to czym właściwie jest JVM?” część choć. (Ponieważ wirtualna maszyna Javy to bardziej specyfikacja niż implementacja.)
aioobe

Odpowiedzi:

172

Najpierw przyjrzyjmy się następującym terminom

Javacis Java Compiler - Kompiluje kod Java do kodu bajtowego

JVMto wirtualna maszyna Java - uruchamia / interpretuje / tłumaczy kod bajtowy na natywny kod maszynowy

JITis 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łumacz

2) what about JIT compiler that exist inside the JVM? - Odp: Jeśli przeczytałeś tę odpowiedź w całości, prawdopodobnie już ją znasz

3) what exactly is the JVM? - Ans:

  • JVM to wirtualna platforma, która znajduje się w pamięci RAM
  • Jego składnik, program ładujący klasy, ładuje .classplik do pamięci RAM
  • Kod Bajt kontrolny elementem kontroli JVM czy są jakieś łamanie ograniczenia dostępu w kodzie. (Jest to jeden z głównych powodów, dla których Java jest bezpieczna)
  • Następnie komponent Execution Engine konwertuje kod bajtowy na wykonywalny kod maszynowy

Mam nadzieję, że ci to pomogło ...

Srikanth Bandaru
źródło
Mówisz, że JVM tłumaczy kod bajtowy na natywny kod maszynowy. Nie jestem pewien, czy termin „tłumaczenie” jest tutaj poprawny.
Koray Tugay
Wysoko cenione. prawie rozwiązałeś moje wątpliwości dotyczące różnicy między kompilacją a interpretacją, kodem bajtowym i kodem m / c. Twoja odpowiedź powiedziała mi, że kod bajtowy jest konwertowany na kod maszynowy przez interpreter, a kompilator konwertuje kod źródłowy na kod bajtowy.
Alwaysalearner
2
Czy możesz mi też powiedzieć, co to jest kod natywny? Czy to oznacza kod maszynowy? Próbuję nauczyć się całego procesu kompilacji i interpretacji, ale te pośrednie terminy są bardzo zagmatwane.
Alwaysalearner
7
Tak więc zarówno JVM, jak i JIT konwertują kod bajtowy na kod maszynowy specyficzny dla platformy. Czym więc się różnią? czy możesz to szeroko wyjaśnić?
Aditya
6
„Uruchamia / interpretuje / tłumaczy kod bajtowy na natywny kod maszynowy” to nonsens. IT albo „uruchamia / interpretuje” lub „przekłada Bytecode do natywnego kodu maszynowego”. Nie jedno i drugie jednocześnie.
user207421
32

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

Mark Peters
źródło
8
@NaeemShah: Jestem zaszczycony, że spodobała Ci się ta odpowiedź na tyle, aby skopiować ją niemal słowo w słowo do posta na blogu pod własnym nazwiskiem. Masz do tego prawo, ale zgodnie ze schematem licencjonowania StackOverflow, jesteś prawnie zobowiązany do podania źródła z powrotem tutaj i musisz licencjonować swój post na blogu na tej samej licencji. Zobacz stopkę tej witryny, która zawiera link do następującej licencji: creativecommons.org/licenses/by-sa/3.0 . Zobacz także ten wpis na blogu: blog.stackoverflow.com/2009/06/attribution-required
Mark Peters
8

Podobnie jak @delnan już wspomniano w sekcji komentarzy, tak nie jest .

JVM to abstrakcyjna maszyna z kodem bajtowym Java .

JVM ma kilka implementacji:

  • HotSpot (interpreter + kompilator JIT )
  • Dalvik (interpreter + kompilator JIT)
  • ART ( kompilator AOT + kompilator JIT)
  • GCJ (kompilator AOT)
  • JamVM (tłumacz)

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

cubuspl42
źródło
1
ART to także interpreter: „Android może faktycznie uruchomić .dexkod bezpośrednio poprzez interpretację lub kompilację Just-In-Time (JIT)…” ( source.android.com/devices/tech/ota/ab/… )
Irfan Latif
5

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.

Paul Cager
źródło
Prawdopodobnie
odnosisz się
5

To jest jedno i drugie. Potrafi interpretować kod bajtowy i kompilować go do kodu natywnego.

Mata
źródło
0

Jak powiedzieli inni, jest to jedno i drugie! Jeśli chcesz się do niego odnieść bardziej szczegółowo, niż widzisz: ten opis IBM

DDC
źródło
0

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

Sarth
źródło
-5

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.

M SANEDEEP KUMAR
źródło
1
Zapomniałeś wyłączyć Caps :)
Aleksej Vasinov
7
Źle, najpierw kompilujesz kod źródłowy do kodu bajtowego (nie ma to nic wspólnego z JVM), a następnie JVM interpretuje kod bajtowy i kompiluje go do kodu natywnego (ale może nie do każdej części).
The_Fox