JVM은 컴파일러입니까 아니면 인터프리터입니까?


85

JVM에 대한 매우 기본적인 질문이 있습니다. 컴파일러입니까 아니면 인터프리터입니까?

인터프리터라면 JVM 내부에 존재하는 JIT 컴파일러는 어떻습니까?
둘 다 없으면 JVM은 정확히 무엇입니까? (바이트 코드를 기계 특정 코드 등으로 변환하는 jVM의 기본 정의를 원하지 않습니다.)


17
JVM은 가상 머신입니다. Bytcode가 들어가면 프로그램의 관찰 가능한 효과가 발생합니다. 그 밖의 모든 것은 구현 세부 사항입니다.

1
예, "the"JVM은 없으며 사양의 여러 구현이 있습니다.
paxdiablo

@delnan, 답으로 써주세요. 나는 정말로 그러한 대답을 찬성하고 싶습니다.
aioobe

@aioobe :하지 않습니다. 나는 그것이 여기에서 묻는 질문에 대답하지 않는다고 생각합니다. 매우 유용한 관점이지만 질문 (제목과 게시물에 명확하게 언급 됨)은 이러한 구현 세부 사항을 명시 적으로 요청합니다.

그럴 수 있지. 나는 말할 것 입니다 에 대한 답변 "어느 쪽도, 다음 정확히없는 경우 JVM?" 그래도 부분. (Java Virtual Machine은 구현보다 사양에
가깝기 때문에

답변:


172

먼저 다음 용어에 대한 명확한 아이디어를 봅시다.

Javacis Java Compiler-Java 코드를 Bytecode 로 컴파일합니다.

JVMis Java Virtual Machine-실행 / 해석 / 바이트 코드를 원시 기계 코드 로 변환

JITJust In Time 컴파일러- 기본적으로 실행 하기 전에 주어진 바이트 코드 명령어 시퀀스를 런타임 에 기계 코드로 컴파일합니다 . 주요 목적은 성능을 크게 최적화하는 것입니다.

이제 질문에 대한 답을 찾아 보겠습니다 ..

1) JVM: is it a compiler or an interpreter? - 답변 : 통역사

2) what about JIT compiler that exist inside the JVM? - 답변 : 이 답글을 완전히 읽으 셨다면 아마 지금 알 것입니다.

3) what exactly is the JVM? - 답변 :

  • JVM은 RAM에 상주하는 가상 플랫폼입니다.
  • 그 구성 요소 인 클래스 로더.class 파일을 RAM에
  • JVM 의 바이트 코드 검증 자 구성 요소는 코드에 액세스 제한 위반이 있는지 확인합니다. (이것은 자바가 안전한 이유 중 하나입니다)
  • 다음으로 Execution Engine 구성 요소는 바이트 코드를 실행 가능한 기계 코드로 변환합니다.

도움이 되었기를 바랍니다 ..


JVM이 바이트 코드를 네이티브 머신 코드로 변환한다고 말합니다. 여기서 "번역"이라는 용어가 올바른지 잘 모르겠습니다.
Koray Tugay

대단히 감사합니다. 당신은 컴파일과 해석, 바이트 코드와 m / c 코드의 차이점에 대한 나의 의심을 거의 제거했습니다. 귀하의 대답은 바이트 코드가 인터프리터에 의해 기계 코드로 변환되고 컴파일러가 소스 코드를 바이트 코드로 변환한다고 말했습니다.
Alwaysalearner

2
네이티브 코드가 무엇인지 말씀해 주시겠습니까? 기계 코드를 의미합니까? 나는이 모든 편집과 해석 과정을 배우려고 노력하고 있지만 이러한 중간 용어는 매우 혼란 스럽습니다.
Alwaysalearner

7
그래서 JVM과 JIT는 모두 바이트 코드를 플랫폼 특정 기계 코드로 변환합니다. 그렇다면 둘 사이의 차이점은 무엇입니까? 광범위하게 설명 할 수 있습니까?
Aditya

6
'Runs / Interprets / translates Bytecode into Native Machine Code'는 말도 안됩니다. 이 '실행 / 해석' 또는 '를 번역 바이트 코드 네이티브 기계 코드로'. 동시에 둘 다 아닙니다.
user207421

32

둘 다 약간이지만 전통적인 의미에서는 아닙니다.

최신 JVM은 바이트 코드를 가져와 처음 필요할 때 네이티브 코드로 컴파일합니다. 이 문맥에서 "JIT"는 "just in time"을 의미합니다. 외부에서는 인터프리터 역할을하지만 실제로는 기계 코드로 컴파일됩니다.

JVM은 소스 코드를 바이트 코드로 컴파일하는 Java 컴파일러와 혼동해서는 안됩니다. 따라서 "컴파일러"라고 생각하는 것은 유용하지 않지만 백그라운드에서 컴파일을 수행한다는 것을 아는 것이 좋습니다.


8
@NaeemShah :이 답변이 당신의 이름으로 블로그 게시물에 거의 한마디로 복사 ​​될만큼 충분히 마음에 들어서 기쁩니다. 그리고 그렇게 할 권리가 있지만 StackOverflow의 라이선스 체계에 따라 법적으로 여기에 귀속을 부여해야하며 동일한 라이선스로 블로그 게시물에 라이선스를 부여해야합니다. 다음 라이센스로 연결되는이 웹 사이트의 바닥 글을 참조하십시오. creativecommons.org/licenses/by-sa/3.0 . 이 블로그 게시물을 참조 : blog.stackoverflow.com/2009/06/attribution-required
마크 피터스

8

마찬가지로 @delnan이 이미 코멘트 섹션에서 언급 한, 그것은 없습니다 .

JVMJava 바이트 코드를 실행하는 추상 기계입니다 .

JVM에는 여러 가지 구현이 있습니다.

  • HotSpot (통역사 + JIT 컴파일러)
  • Dalvik (통역사 + JIT 컴파일러)
  • 예술 ( AOT 컴파일러 + JIT 컴파일러)
  • GCJ (AOT 컴파일러)
  • JamVM (통역사)

... 및 기타 .

JVM에 대해 이야기 할 때 대부분의 답변은 HotSpot 또는 JVM 구현에 대한 위의 접근 방식을 혼합하여 참조합니다.


1
ART는 또한 인터프리터입니다. "Android는 실제로 .dex해석 또는 JIT (Just-In-Time) 컴파일을 통해 코드를 직접 실행할 수 있습니다 ..." ( source.android.com/devices/tech/ota/ab/… )
Irfan Latif

5

둘 다입니다. 바이트 코드를 해석하는 것으로 시작하여 그만한 가치가 있다고 판단되면 해당 바이트 코드를 원시 기계 코드로 컴파일 할 수 있습니다.


당신은 아마 핫스팟 언급하는
cubuspl42

5

둘 다입니다. 바이트 코드를 해석하고 네이티브 코드로 컴파일 할 수 있습니다.


0

다른 사람들이 말했듯이 둘 다입니다! 당신이 볼 수있는 것보다 더 자세하게 참조하고 싶다면 : 이 IBM 설명


0

Javac은 컴파일러이지만 전통적인 컴파일러는 아닙니다. 컴파일러는 일반적으로 실행을 위해 소스 코드를 기계 수준 언어로 변환하며 이는 단일 샷으로 수행됩니다. 즉, 전체 코드를 취해 ONCE에서 기계 수준 언어로 변환합니다. (아래에 더 자세히 설명). 반면 JavaC는이를 머신 레벨 언어 대신 바이트 코드로 변환합니다.

JIT는 Java 컴파일러이지만 인터프리터 역할도합니다. 일반적인 컴파일러는 모든 코드를 한 번에 소스 코드에서 기계 수준 언어로 변환합니다. 대신 JIT는 한 줄씩 이동하고 (한 줄씩 실행은 인터프리터의 기능 임) JavaC에서 생성 된 바이트 코드를 기계 수준 언어로 변환하여 실행합니다. JIT가있는 JVM에는 여러 구현이 있습니다. 핫스팟은 자바 프로그래밍의 주요 요소 중 하나입니다. 핫스팟 구현은 JIT가 반복적 인 코드 덩어리를 머신 레벨 언어로 한 번에 (위에서 언급 한 컴파일러처럼) 변환하여 실행을 최적화하여 코드의 각 라인을 1 씩 변환하는 대신 더 빠르게 실행할 수 있도록합니다. 컴파일러 및 인터프리터의 일반적인 정의와 관련하여 대답은 흑백이 아닙니다.

이것은 여러 온라인 답변, 블로그 등을 읽은 후 이해 한 것입니다. 누군가가 이러한 이해를 향상시킬 제안이 있으면 언제든지 제안하십시오.


-5

JVM에는 컴파일러와 인터프리터가 모두 있습니다. 컴파일러가 코드를 컴파일하고 바이트 코드를 생성하기 때문입니다. 그 후 인터프리터는 바이트 코드를 기계가 이해할 수있는 코드로 변환합니다.

예 : 프로그램을 작성하고 컴파일하면 Windows에서 실행됩니다. .class 파일을 다른 OS (Unix)로 가져 가면 바이트 코드를 기계가 이해할 수있는 코드로 변환하는 인터프리터 때문에 실행됩니다.


1
Caps를 끄는 것을 잊었습니다. :)
Aleksej Vasinov

7
틀린 것은, 먼저 소스 코드를 바이트 코드로 컴파일 한 다음 (JVM과 관련이 없음) JVM이 바이트 코드를 해석하여 네이티브 코드로 컴파일합니다 (모든 부분이 아닐 수도 있음).
The_Fox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.