Post

Compiler vs Interpreter vs JIT

우린 여러 프로그래밍 언어를 사용해 개발을 합니다. 우리가 프로그래밍 언어로 코드를 작성하면 컴퓨터는 그것을 바로 실행할 수 없습니다. 우리가 사용하는 언어들은 우리가 읽고, 사용할 수 있는 언어이기 때문입니다. 그렇기 때문에 컴퓨터가 읽을 수 있도록 기계어로 변환을 한 후 실행 가능하다고 생각하면 됩니다. 그 역할을 Compiler(컴파일러)와 Interpreter(인터프리터)가 하는 것입니다. 그럼 왜 한 가지 역할을 두고 나눠져 있을까요? 그건 작동 방식에 따라 분류됩니다. 어떤 공통점이 있고 어떤 차이가 있는지 아래에서 보도록 하겠습니다.

Compiler, Interpreter, JIT의 공통점

사람이 사용하는 프로그래밍 언어(고급 언어)를 컴퓨터가 읽고 실행할 수 있는 언어(저급 언어)로 변환해줍니다.

Compiler와 Interpreter의 흐름도

flow

Compiler(정적 컴파일)

  1. 모든 코드를 한번에 컴파일 후 실행 파일 생성 및 실행
  2. 컴파일 단계와 실행 단계 분리해 다른 단계로 봄
  3. 장점
    • 컴파일을 마친 후 생성된 실행 파일은 실행 속도가 향상됨
    • 코드가 길수록, 규모가 클수록 더 좋은 효과를 볼 수 있음
  4. 단점
    • OS에 의존적임. 예를 들어 Windows에서 컴파일 된 파일은 Mac에서 실행 불가능

Interpreter

  1. 코드를 한 줄 단위로 변환 후 실행
  2. 컴파일 단계와 실행 단계를 한 과정으로 봄
  3. 장점
    • 별도 컴파일을 위한 선행 처리 시간이 필요하지 않음
    • 실시간 컴파일+실행으로 OS의 영향을 받지 않음
  4. 단점
    • 매번 컴파일+실행이 반복되어 실행 속도 저하
    • 중복 함수 등에 대한 별도 처리 없이 기계어 코드 생성(중복 생성)

JIT(Just-In-Time) Compiler(동적 컴파일)

  1. 정적 컴파일러만큼 빠른 컴파일, 인터프리터의 빠른 응답 속도를 추구하기 위해 혼합
  2. 바이트 코드 컴파일러가 먼저 모든 코드를 바이트 코드로 컴파일. 바이트 코드 실행 시점에서 JIT 컴파일러가 바이트 코드를 기계어로 번역하며 캐싱
  3. 장점
    • 같은 함수가 여러 번 불릴 때 캐싱된 코드를 재사용하여 매번 기계어 코드가 생성되는 것을 방지
    • 바이트 코드의 뛰어난 이식성으로 가상 머신이 설치 돼 있다면 다른 OS로 이식 후 별도 컴파일 없이 실행 가능
  4. 단점
    • 리소스 소모가 다른 것들보다 큼
This post is licensed under CC BY 4.0 by the author.