과거에는 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와 같은 최신 프로그래밍 언어 구현에서 플랫폼이 두 옵션을 모두 제공하는 것이 점차 인기를 얻고 있습니다.