Compiler vs Interpreter vs JIT
우린 여러 프로그래밍 언어를 사용해 개발을 합니다. 우리가 프로그래밍 언어로 코드를 작성하면 컴퓨터는 그것을 바로 실행할 수 없습니다. 우리가 사용하는 언어들은 우리가 읽고, 사용할 수 있는 언어이기 때문입니다. 그렇기 때문에 컴퓨터가 읽을 수 있도록 기계어로 변환을 한 후 실행 가능하다고 생각하면 됩니다. 그 역할을 Compiler(컴파일러)와 Interpreter(인터프리터)가 하는 것입니다. 그럼 왜 한 가지 역할을 두고 나눠져 있을까요? 그건 작동 방식에 따라 분류됩니다. 어떤 공통점이 있고 어떤 차이가 있는지 아래에서 보도록 하겠습니다.
Compiler, Interpreter, JIT의 공통점
사람이 사용하는 프로그래밍 언어(고급 언어)를 컴퓨터가 읽고 실행할 수 있는 언어(저급 언어)로 변환해줍니다.
Compiler와 Interpreter의 흐름도
Compiler(정적 컴파일)
- 모든 코드를 한번에 컴파일 후 실행 파일 생성 및 실행
- 컴파일 단계와 실행 단계 분리해 다른 단계로 봄
- 장점
- 컴파일을 마친 후 생성된 실행 파일은 실행 속도가 향상됨
- 코드가 길수록, 규모가 클수록 더 좋은 효과를 볼 수 있음
- 단점
- OS에 의존적임. 예를 들어 Windows에서 컴파일 된 파일은 Mac에서 실행 불가능
Interpreter
- 코드를 한 줄 단위로 변환 후 실행
- 컴파일 단계와 실행 단계를 한 과정으로 봄
- 장점
- 별도 컴파일을 위한 선행 처리 시간이 필요하지 않음
- 실시간 컴파일+실행으로 OS의 영향을 받지 않음
- 단점
- 매번 컴파일+실행이 반복되어 실행 속도 저하
- 중복 함수 등에 대한 별도 처리 없이 기계어 코드 생성(중복 생성)
JIT(Just-In-Time) Compiler(동적 컴파일)
- 정적 컴파일러만큼 빠른 컴파일, 인터프리터의 빠른 응답 속도를 추구하기 위해 혼합
- 바이트 코드 컴파일러가 먼저 모든 코드를 바이트 코드로 컴파일. 바이트 코드 실행 시점에서 JIT 컴파일러가 바이트 코드를 기계어로 번역하며 캐싱
- 장점
- 같은 함수가 여러 번 불릴 때 캐싱된 코드를 재사용하여 매번 기계어 코드가 생성되는 것을 방지
- 바이트 코드의 뛰어난 이식성으로 가상 머신이 설치 돼 있다면 다른 OS로 이식 후 별도 컴파일 없이 실행 가능
- 단점
- 리소스 소모가 다른 것들보다 큼
This post is licensed under CC BY 4.0 by the author.