컴파일러와 인터프리터는 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 과정에 관여하는 프로그램
전체 변환
소스코드 전체를 읽어 한번에 기계어로 변환 변환 과정을 거친 후, 생성된 기계어 코드를 실행 함
속도
컴파일 과정 자체는 시간이 걸리지만, 변환된 코드는 직접 실행되므로 실행 시간은 빠름
(컴파일 과정이란 - 고수준의 소스코드를 전처리, 컴파일러, 어셈블러, 링커의 과정을 거쳐 저수준언어로 만들고 실행할 수 있는 프로그램을 만드는 과정)
사용 예
C, C++, GO, Rust 등의 언어가 컴파일러를 사용 함
한 줄씩 변환
소스코드를 한 줄씩 읽어가며 바로 기계어로 변환하고 실행 함
속도
컴파일 단계가 없으므로 초기 시작은 빠르지만, 전체 코드 실행 시간은 컴파일러를 사용할 때 보다 느릴 수 있음 코드를 실행 할 때마다 변환 과정을 거치기 떄문
사용 예
python이 대표적으로 인터프러터 방식을 사용 함
코드를 수정했을 때 컴파일 과정이 필요하지 않음
JIT 컴파일러는 인터프리터와 컴파일러의 중간 형태라고 볼 수 있음
코드 분석
실행 시점에 프로그램 코드를 분석하여, 어떤 부분이 가장 자주 실행되는지(hot spot) 판단(즉, 실행전 코드를 분석하지 않음)
동적 컴파일
분석 결과에 기반하여, 자주 실행되는 코드(hot spot)만을 선별적으로 기계어로 변환 이 과정은 프로그램 실행 중에 실시간으로 이루어짐
최적화
컴파일 과정에서 다양한 최적화 기법을 적용 (ex. 메모리 접근 패턴을 분석, 가비지 컬렉션의 오버헤드 최소화 등….)
실행
컴파일된 기계어 코드를 실행 프로그램이 계속 실행되면서 새로운 핫 스팟이 발견되면, 해당 부분도 JIT 컴파일을 통해 최적화 됨
ex) JVM(자바가상머신), .NET, V8(node.js 엔진)

자주 사용되는 코드(HOT CODE)의 실행 속도가 크게 향상되는 것이라는 장점과 컴파일 된 코드를 메모리에 저장해 캐싱하기 때문에 인터프리터 방식에 비해 더 많은 메모리를 소비한다는 단점이 있음