2009-08-25 2 views
103

이전에는 C++을 프로그래밍 언어로 사용했습니다. 나는 C++로 작성된 코드가 객체 코드 "machine code"가 될 때까지 컴파일 과정을 거친다는 것을 알고 있습니다.Java는 컴파일 된 언어 또는 해석 된 프로그래밍 언어입니까?

나는 그 점에서 Java가 어떻게 작동하는지 알고 싶습니다. 사용자가 작성한 Java 코드는 컴퓨터에서 어떻게 실행됩니까?

+12

C++을 해석 할 수 있습니다. 거기에 약간의 C 통역이 있습니다. –

답변

38

Java가 바이트 코드로 컴파일 된 다음 Java VM에 들어가서 해석됩니다.

+0

간단하고 좋은 답변 –

+24

...하지만 정확하지 정확합니다. –

+1

JVM은 바이트 코드를 해석하지 않기로 선택할 수 있습니다. JIT로 컴파일하고 직접 실행할 수 있습니다. –

10

Java는 컴파일 된 프로그래밍 언어이지만 실행 가능한 기계 코드로 곧바로 컴파일되는 것이 아니라 JVM 바이트 코드라는 중간 바이너리 형식으로 컴파일됩니다. 그런 다음 바이트 코드를 컴파일 및/또는 해석하여 프로그램을 실행합니다.

0

자바는 Java Virtual Machine이라는 플랫폼을 목표로하는 바이트 컴파일 언어로 스택 기반이며 많은 플랫폼에서 매우 빠르게 구현됩니다.

+0

"바이트 컴파일 된"의미는 무엇입니까? – Jesper

+2

@Jesper : "바이트 컴파일"은 일반적으로 "바이트 코드로 컴파일"을 의미합니다. "바이트 코드"는 비 텍스트 중간 코드 (일반적으로 기계 실행 가능하지 않은)의 모든 종류를 포괄하는 일반적인 용어입니다. –

12

모두의 종류. 먼저 컴파일 된 자바 (일부는 "번역"이라고 말하기를 선호합니다)를 바이트 코드로 컴파일 한 다음 JIT의 분위기에 따라 해석합니다.

+22

그것은 진보 된 소프트웨어의 진보 된 부분입니다. – Thorarin

+4

JIT는 실제로 실시간 정보 (프로파일 러와 같은)에 기반한 최적화를 수행 할 수있는 매우 정교한 소프트웨어입니다. 이는 사전 컴파일러가 ' do (사전에 프로그램의 런타임 동작에 대한 정보가 없으므로). 하지만 실제로는별로 기분이 들지 않습니다. :-) – Jesper

141

Java 구현은 일반적으로 2 단계 컴파일 프로세스를 사용합니다. Java 소스 코드는 자바 컴파일러에 의해 바이트 코드으로 컴파일됩니다. 바이트 코드는 JVM (Java Virtual Machine)에 의해 실행됩니다. 현대의 JVM은 Just-in-Time (JIT) compilation이라는 기술을 사용하여 런타임시 하드웨어 CPU가 이해하는 기본 명령어로 바이트 코드를 컴파일합니다.

JVM의 일부 구현은 바이트 코드를 기계 코드로 컴파일하고 직접 실행하는 JIT 대신 바이트 코드를 해석하도록 선택할 수 있습니다. 여전히 "인터프리터"로 간주되지만, 상위 레벨 소스 코드를 읽고 실행하는 인터프리터와는 매우 다릅니다 (이 경우 자바 소스 코드는 직접 해석되지 않고 자바 컴파일러의 바이트 코드 출력).

자바를 네이티브 코드로 컴파일하고 결과 바이너리를 실행하는 것이 기술적으로 가능합니다. Java 코드를 직접 해석 할 수도 있습니다.

는 실행 환경에 따라 요약하면, 바이트 코드가 될 수 있습니다

  • 미리 컴파일 된 네이티브 코드로 실행 (대부분의 C++ 컴파일러와 유사)
  • 은 적시 (just-in-time) 컴파일 및 실행
  • 직접 (바이트 일부 CPU의 네이티브 인스트럭션 세트이다)
+12

실제로 일부 HotSpot JVM은 바이트 코드를 해석하여 시작하여 컴파일 할 가치가있는 것을 알아 낸 후에 만 ​​원시 코드로 컴파일하고 방법에 대한 통계를 수집합니다 코드가 실행 중입니다. 예 : 각 조건부 분기에서 취한 가장 일반적인 경로를 파악합니다. –

+0

따라서 '핫스팟'이라는 용어는 최적화를 위해 자주 실행되는 항목에 적용됩니다. –

+4

-Xcomp를 사용하여 HotSpot에서 인터프리터를 끌 수 있습니다. 응용 프로그램에서 어떤 나쁜 생각인지 알아볼만한 가치가 있습니다. –

43
지원되는 프로세서에 의해 실행
  • 해석

    "해석 된 언어"또는 "컴파일 된 언어"라는 용어는 의미가 없습니다. 왜냐하면 모든 프로그래밍 언어가 해석되거나 컴파일 될 수 있기 때문입니다.

    Java의 기존 구현에서 바이트 코드 컴파일 단계가 대부분 포함되므로 컴파일이 필요합니다. 런타임은 바이트 코드를 동적으로로드 할 수 있으므로 바이트 코드 인터프리터의 형식이 항상 필요합니다. 그 인터프리터는 내부적으로 네이티브 코드에 컴파일을 사용하거나 사용하지 않을 수 있습니다.

    요즘 부분 적시 컴파일은 한 번 "해석 된"것으로 간주되었던 많은 언어, 예를 들어 자바 스크립트에 사용됩니다.

  • +0

    전체 페이지에서 * 정당하고 정답을 주셔서 감사합니다. 나는 SO 공동체의 지능에 대해 진지하게 질문하기 시작했다. 몇 가지 빠른 추가 기능 : 모든 Java 구현이 JVM 바이트 코드로 컴파일되는 것은 아닙니다. GNU GCJ는 네이티브 코드로 바로 컴파일 할 수 있습니다. 또한, 모든 JVM이 바이트 코드를 해석하는 것은 아닙니다. Sun의 Maxine Research VM에는 인터프리터가 포함되어 있지 않고 대신 다른 JVM이 인터프리터를 사용할 때 사용되는 느린 코드를 생성하는 매우 빠른 코드와 핫스팟 최적화에 사용되는 빠른 코드를 생성하는 느린 코드가 있습니다. . –

    +2

    또한 구글의 V8 자바 스크립트 실행 엔진은 부분적인 (just-in-time) 컴파일을 수행하는 것이 아닙니다. * 항상 * 네이티브 코드로 컴파일됩니다. 사실 V8은 인터프리터를 가지고 있지 않습니다. 컴파일러는 Maxine과 유사하지만 Maxine V8과 달리 컴파일러는 하나뿐입니다. 이 세 가지 예제 (GCJ, Maxine 및 V8)는 해석의 언어 또는 컴파일 된 언어와 같은 것이 없습니다. 언어는 해석되거나 컴파일되지 않습니다. 언어는 단지 *입니다 (실제로 Shriram Krishnamurthi의 인용문입니다). –

    +2

    왜 자바 질문에서 자바 스크립트에 대해 이야기하고 있습니까? –

    -1

    인용에서 : https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

    응용 프로그램 개발자는 시장에서 현재 사용할 수있는 다양한 OS의에서 응용 프로그램 코드를 개발할 수 있습니다. Java 언어는이 단계에서 OS에 대해 불가 지합니다. Java 응용 프로그램 개발자가 작성한 화려한 소스 코드는 Java 용어로 Client Side 컴파일이라고하는 Java Byte 코드로 컴파일됩니다. Java Byte 코드로의이 컴파일은 Java 개발자가 '한 번 쓰는 것'을 가능하게합니다. Java 바이트 코드는 호환 가능한 모든 OS 및 서버에서 실행될 수 있으므로 OS/서버의 소스 코드를 식별 할 수 없게 만듭니다. Post Java Byte 코드 작성, Java 어플리케이션과 기본 OS/서버 사이의 상호 작용은보다 친밀합니다. 이동은 계속됩니다 - 엔터프라이즈 응용 프로그램 프레임 워크는 JVM (Java Virtual Machine) 또는 JRE (Java Runtime Environment)라고하는 런타임 환경에서 이러한 Java 바이트 코드를 실행합니다. JVM은 OS와 서버가 제공하는 리소스를 활용하기 때문에 기본 OS와 하드웨어와 밀접한 관계가 있습니다. Java 바이트 코드는 이제 플랫폼에 특정한 기계 언어 실행 코드로 컴파일됩니다. 이를 서버 측 컴파일이라고합니다.

    그래서 Java는 확실히 컴파일 된 언어입니다. 자바로 작성된

    31

    [1] 이미지 아래에 모든 설명 ...

    enter image description here

    코드는 다음과 같습니다

    • 먼저라는 프로그램에 의해 바이트 코드에를 컴파일 javac 이미지 왼쪽의 그림과 같이 비켜. 상기 이미지의 오른쪽 부분에 도시 된 바와 같이
    • 다음, [2] 및 자바 런타임 환경을 시작자바 불리는 또 다른 프로그램은 그 컴파일 및/또는 자바를 이용하여 바이트 코드 해석 수도 인터프리터/JIT 컴파일러.

    언제 자바 바이트 코드를 해석 않을 때 그것을 컴파일 무엇입니까? 응용 프로그램 코드는 처음에는 해석되지만 JVM은 자주 실행되는 바이트 코드 시퀀스를 모니터하고이를 하드웨어에서 직접 실행하기 위해 컴퓨터 코드로 변환합니다. 단지 몇 번 실행되는 바이트 코드의 경우 컴파일 시간이 절약되고 초기 대기 시간이 줄어 듭니다. 자주 실행되는 바이트 코드의 경우 JIT 컴파일은 느린 해석의 초기 단계 이후에 고속으로 실행되는 데 사용됩니다. 또한 프로그램이 코드의 소수를 실행하는 데 대부분의 시간을 소비하기 때문에 컴파일 시간이 단축됩니다. 마지막으로, 초기 코드 해석 중에 컴파일 전에 실행 통계를 수집 할 수 있으므로 더 나은 최적화를 수행하는 데 도움이됩니다. 참조에 대한 대답에서 첨자 숫자에


    을 클릭합니다.

    +0

    Java가 많은 메모리를 사용하는 캐시 된 바이트 코드 때문입니까? –

    +2

    @sedulam : '많은 메모리'는 퍼지 표현입니다. Java의 메모리 관리는 매우 간단합니다. 3 세대는 JVM이 객체 생성 및 유지 관리에 사용하는 것입니다. 이 [다른 SO 응답] (https://stackoverflow.com/q/3496442)이 유용 할 수 있습니다. – displayName

    +0

    위의 설명과 같이 이론적으로 C++ 컴파일 된 코드는 논리적으로 비슷한 Java 코드보다 빠를 것입니다. JIT가 기계 코드로 변환하지 않기로 결정한 .class 파일의 일부가 항상 있기 때문입니다. 즉, java는 C++이 보여준 베어 메탈 실행 속도를 절대 포착 할 수 없습니다. 이 올바른 가정입니까? – DevdattaK

    관련 문제