[java] Java는 컴파일 된 또는 해석 된 프로그래밍 언어입니까?

과거에는 C ++을 프로그래밍 언어로 사용했습니다. C ++로 작성된 코드는 객체 코드 “machine code”가 될 때까지 컴파일 프로세스를 거칩니다.

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



답변

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

JVM의 일부 구현은 바이트 코드를 기계 코드로 컴파일하여 직접 실행하는 대신 바이트 코드를 해석하도록 선택할 수 있습니다. 이것은 여전히 ​​”통역사”로 간주되지만, 고급 소스 코드를 읽고 실행하는 인터프리터와는 상당히 다릅니다 (이 경우 Java 소스 코드는 직접 해석되지 않으며, 바이트 코드, Java 컴파일러의 출력).

기술적으로 Java를 원시 코드로 미리 컴파일하고 결과 바이너리를 실행할 수 있습니다. Java 코드를 직접 해석 할 수도 있습니다.

실행 환경에 따라 바이트 코드는 다음과 같습니다.

  • 미리 컴파일되어 네이티브 코드로 실행 (대부분의 C ++ 컴파일러와 유사)
  • 적시에 컴파일 및 실행
  • 해석
  • 지원되는 프로세서에서 직접 실행 (바이트 코드는 일부 CPU의 기본 명령어 세트 임)

답변

여기에 이미지 설명을 입력하십시오

Java로 작성된 코드는 다음과 같습니다.

  • 먼저 위 이미지의 왼쪽 섹션에 표시된대로 javac 라는 프로그램에 의해 바이트 코드로 컴파일 됩니다 .
  • 그런 다음 위 이미지의 오른쪽 섹션에 표시된 것처럼 java 라는 다른 프로그램 이 Java 런타임 환경을 시작 하고 Java Interpreter / JIT Compiler를 사용하여 바이트 코드를 컴파일 및 / 또는 해석 할 수 있습니다 .

Java는 언제 바이트 코드를 해석하고 언제 컴파일합니까? 애플리케이션 코드는 처음에 해석되지만 JVM은 자주 실행되는 바이트 코드 시퀀스를 모니터하고이를 하드웨어에서 직접 실행하기 위해 머신 코드로 변환합니다. 몇 번만 실행되는 바이트 코드의 경우 컴파일 시간이 절약되고 초기 대기 시간이 줄어 듭니다. 자주 실행되는 바이트 코드의 경우 JIT 컴파일은 느린 해석의 초기 단계 후에 고속으로 실행하는 데 사용됩니다. 또한 프로그램이 소수의 코드를 실행하는 데 대부분의 시간을 소비하므로 컴파일 시간이 단축됩니다. 마지막으로, 초기 코드 해석 중에 컴파일 전에 실행 통계를 수집하여보다 나은 최적화를 수행 할 수 있습니다.


답변

프로그래밍 언어가 해석 및 / 또는 컴파일 될 수 있으므로 “통역 언어”또는 “컴파일 언어”라는 용어는 의미가 없습니다.

기존 Java 구현의 경우 대부분 바이트 코드 컴파일 단계가 포함되므로 컴파일이 포함됩니다. 런타임은 또한 바이트 코드를 동적으로로드 할 수 있으므로 항상 어떤 형태의 바이트 코드 인터프리터가 필요합니다. 해당 인터프리터는 내부 코드로 컴파일을 사용하거나 사용하지 않을 수 있습니다.

요즘에는 부분적 적시 컴파일이 JavaScript와 같이 한 번 “해석”된 것으로 여겨지는 많은 언어에 사용됩니다.


답변

Java는 바이트 코드로 컴파일 된 다음이를 해석하는 Java VM으로 이동합니다.


답변

Java는 컴파일 된 프로그래밍 언어이지만 실행 가능한 기계어 코드로 직접 컴파일하는 것이 아니라 JVM 바이트 코드라는 중간 이진 형식으로 컴파일됩니다. 바이트 코드는 프로그램을 실행하기 위해 컴파일 및 / 또는 해석됩니다.


답변

둘 다. 먼저 자바 컴파일 된 (일부는 “번역됨”)을 바이트 코드로 변환 한 다음 JIT의 분위기에 따라 컴파일하거나 해석합니다.


답변

Java는 컴파일과 해석을 모두 수행합니다.

Java에서 프로그램은 실행 파일로 컴파일되지 않습니다 . 그것들은 바이트 코드컴파일되며 (이전에 논의 된 바와 같이) JVM (Java Virtual Machine)은 런타임에 해석 / 실행됩니다. javac 컴파일러를 사용하면 Java 소스 코드가 바이트 코드로 컴파일됩니다. 바이트 코드는 파일 확장자가 .class 인 디스크에 저장됩니다 .

프로그램이 실행될 때 바이트 코드가 변환 됩니다. JIT (Just-In-Time) 컴파일러를 사용하여 바이트 코드가 변환 될 수 있습니다. 결과적으로 머신 코드가 생성되어 메모리에 공급되어 실행됩니다.

Javac 는 Java 코드를 바이트 코드로 컴파일 하는 Java 컴파일러 입니다. JVM은 바이트 코드를 원시 시스템 코드로 실행 / 해석 / 변환하는 Java Virtual Machine입니다. Java에서는 인터프리터 언어로 간주되지만 바이트 코드가 JVM에있을 때 JIT (Just-in-Time) 컴파일을 사용할 수 있습니다. JIT 컴파일러는 많은 섹션에서 (또는 전체는 드물게) 바이트 코드를 읽고 머신 코드로 동적으로 컴파일하므로 프로그램을 더 빠르게 실행 한 다음 다시 컴파일 할 필요없이 나중에 캐시하고 재사용 할 수 있습니다. 따라서 JIT 컴파일은 컴파일 된 코드의 속도와 해석의 유연성을 결합합니다.

해석 언어는 이전에 기계어 명령으로 프로그램을 컴파일하지 않고, 그 구현의 대부분은 직접 자유롭게 명령을 실행하는 언어 프로그래밍의 유형입니다. 인터프리터는 프로그램을 직접 실행하여 각 명령문을 기계 코드로 이미 컴파일 된 하나 이상의 서브 루틴 시퀀스로 변환합니다.

컴파일 된 언어 (미리 입력 런타임 변환이 일어나지 않는다 소스 코드 단계별 실행기) 그 구현 일반적 컴파일러 (소스 코드에서 머신 코드를 생성 번역)되지 통역되는 프로그래밍 언어

Java와 같은 최신 프로그래밍 언어 구현에서 플랫폼이 두 옵션을 모두 제공하는 것이 점차 인기를 얻고 있습니다.