답변:
Java 구현은 일반적으로 2 단계 컴파일 프로세스를 사용합니다. Java 소스 코드는 Java 컴파일러에 의해 바이트 코드로 컴파일됩니다 . 바이트 코드는 JVM (Java Virtual Machine)에 의해 실행됩니다. 최신 JVM은 JIT (Just-in-Time) 컴파일 기술 을 사용하여 런타임시 하드웨어 CPU가 이해하는 기본 명령어로 바이트 코드를 컴파일합니다.
JVM의 일부 구현은 바이트 코드를 기계 코드로 컴파일하여 직접 실행하는 대신 바이트 코드를 해석하도록 선택할 수 있습니다. 이것은 여전히 "통역사"로 간주되지만, 고급 소스 코드를 읽고 실행하는 인터프리터와는 상당히 다릅니다 (이 경우 Java 소스 코드는 직접 해석되지 않으며, 바이트 코드, Java 컴파일러의 출력).
기술적으로 Java를 원시 코드로 미리 컴파일하고 결과 바이너리를 실행할 수 있습니다. Java 코드를 직접 해석 할 수도 있습니다.
실행 환경에 따라 바이트 코드는 다음과 같습니다.
Java로 작성된 코드는 다음과 같습니다.
Java는 언제 바이트 코드를 해석하고 언제 컴파일합니까? 애플리케이션 코드는 처음에 해석되지만 JVM은 자주 실행되는 바이트 코드 시퀀스를 모니터하고이를 하드웨어에서 직접 실행하기 위해 머신 코드로 변환합니다. 몇 번만 실행되는 바이트 코드의 경우 컴파일 시간이 절약되고 초기 대기 시간이 줄어 듭니다. 자주 실행되는 바이트 코드의 경우 JIT 컴파일은 느린 해석의 초기 단계 후에 고속으로 실행하는 데 사용됩니다. 또한 프로그램이 소수의 코드를 실행하는 데 대부분의 시간을 소비하므로 컴파일 시간이 단축됩니다. 마지막으로, 초기 코드 해석 중에 컴파일 전에 실행 통계를 수집하여보다 나은 최적화를 수행 할 수 있습니다.
프로그래밍 언어가 해석 및 / 또는 컴파일 될 수 있으므로 "통역 언어"또는 "컴파일 언어"라는 용어는 의미가 없습니다.
기존 Java 구현의 경우 대부분 바이트 코드 컴파일 단계가 포함되므로 컴파일이 포함됩니다. 런타임은 또한 바이트 코드를 동적으로로드 할 수 있으므로 항상 어떤 형태의 바이트 코드 인터프리터가 필요합니다. 해당 인터프리터는 내부 코드로 컴파일을 사용하거나 사용하지 않을 수 있습니다.
요즘에는 부분적 적시 컴파일이 JavaScript와 같이 한 번 "해석"된 것으로 여겨지는 많은 언어에 사용됩니다.
Java는 바이트 코드로 컴파일 된 다음이를 해석하는 Java VM으로 이동합니다.
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와 같은 최신 프로그래밍 언어 구현에서 플랫폼이 두 옵션을 모두 제공하는 것이 점차 인기를 얻고 있습니다.
Java는 Java Virtual Machine 이라는 플랫폼을 대상으로하는 바이트 컴파일 언어 이며 스택 기반이며 많은 플랫폼에서 매우 빠른 구현을 제공합니다.
인용 : https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster
응용 프로그램 개발자는 현재 시장에 나와있는 다양한 OS에서 응용 프로그램 코드를 개발할 수 있습니다. Java 언어는이 단계에서 OS에 독립적입니다. Java 응용 프로그램 개발자가 작성한 화려한 소스 코드는 이제 Java 용어로 클라이언트 측 컴파일이라고하는 Java 바이트 코드로 컴파일됩니다. Java 바이트 코드로의이 컴파일은 Java 개발자가 '한 번 작성'할 수있게합니다. Java 바이트 코드는 호환 가능한 모든 OS 및 서버에서 실행될 수 있으므로 소스 코드를 OS / Server와 무관하게 만들 수 있습니다. Java 바이트 코드 생성 후 Java 응용 프로그램과 기본 OS / 서버 간의 상호 작용이 더 친밀합니다. 여정은 계속됩니다. 엔터프라이즈 애플리케이션 프레임 워크는 JVM (Java Virtual Machine) 또는 Java Runtime Environment (JRE)로 알려진 런타임 환경에서 이러한 Java 바이트 코드를 실행합니다. JVM은 OS 및 서버에서 제공하는 리소스를 활용하기 때문에 기본 OS 및 하드웨어와 밀접한 관련이 있습니다. Java 바이트 코드는 이제 플랫폼 별 기계 언어 실행 가능 코드로 컴파일됩니다. 이것을 서버 측 컴파일이라고합니다.
그래서 Java는 분명히 컴파일 된 언어라고 말할 것입니다.