자바는 .java 파일을 컴파일 하여 .class의 바이트코드를 만든다. JVM은 바이트코드를 JIT, 인터프리터 방식을 통해 바이트 코드를 네이티브 코드로 변경해서 운영체제에게 넘겨 코드를 실행시킨다.
개념
JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.
JIT 컴파일러는 두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
개요
바이트코드 컴파일러는 소스 코드를 중간언어인 바이트코드로 변환한다. 바이트코드는 기계어는 아니지만 가상 머신에 의해 기계어로 손쉽게 변환할 수 있는 코드이다. JIT 컴파일러는 바이트코드를 읽어 빠른 속도로 기계어를 생성할 수 있다. 이런 기계어 변환은 코드가 실행되는 과정에 실시간으로 일어나며(그래서 Just-In-Time이다), 전체 코드의 필요한 부분만 변환한다. 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.
일반적인 인터프러터 언어(예시: 자바스크립트)는 바이트코드나 소스코드를 최적화 과정이 없이 번역하기 때문에 성능이 낮다. 반면 정적으로 컴파일하는 언어(예시: 자바)는 실행 전에 무조건 컴파일을 해야하기 때문에 다양한 플랫폼에 맞게 컴파일을 하려면 시간이 오래 걸린다. 동적 컴파일 환경은 실행 과정에서 컴파일을 할 수 있기 위해 만들어졌다. JIT는 정적 컴파일러 만큼 빠르면서 인터프러터 언어의 빠른 응답속도를 추구하기 위해 사용한다. 바이트코드 컴파일러가 시간이 많이 소요되는 최적화를 미리 해주기 때문에 바이트코드에서 기계어 번역은 훨씬 빠르게 진행될 수 있다. 또한 바이트코드는 이식성이 뛰어나 가상 머신이 설치되어 있으면 빠르게 실행할 수 있다. 플랫폼 별로 가상 머신을 개발하는 과정은 컴파일러를 만드는 것보다 간단한데, 그 이유는
- 복잡한 최적화 과정은 바이트코드 컴파일러가 대신 해주므로 고려하지 않아도 된다.
- 바이트코드는 빠른 기계어 변환을 목적으로 설계되었기 때문에 일반적인 컴파일러보다 제작 과정이 수월하다.
출처 : https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC
JIT 컴파일 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 전통적인 입장에서 컴
ko.wikipedia.org
정리
컴파일 방식은 인터프리트 방식과 정적 컴파일 방식이 있다.
- 인터프리트 방식 : 프로그램 실행시마다 기계어로 변환하는 작업을 수행하는 방식
- 정적 컴파일 방식 : 실행 전 기계어로 미리 변환 후 실행하는 방식이며, 딱 한번만 수행된다.
JIT는 이 두가지를 혼합한 것,
인터프리터는 라인별로 지속적인 변환이 필요하여 속도가 느리지만 이 문제를 해결하기 위해, JIT는 필요한 코드 정보는 캐시에 올려 두었다가 재사용하는 방식으로 속도의 문제를 개선하였다.
'자바 > 개념' 카테고리의 다른 글
[Java] replaceAll 정규 표현식 사용방법 (0) | 2024.12.10 |
---|---|
[Java] 디폴트 메서드(Default Method) 란? (1) | 2024.04.12 |
[Java] 함수형 인터페이스(Functional Interface) 란? (0) | 2024.04.11 |
컴파일(compile)와 인터프리터(interpreter)는 무엇일까? (0) | 2024.04.04 |
Call by Value, Call by Reference 란? (0) | 2024.04.04 |