컴파일러와 인터프리터, 그리고 JIT 컴파일

succeeding·2022년 6월 9일
1

전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있다.

  • 정적 컴파일 방식
  • 인터프리트 방식

컴파일러

정적 컴파일 방식을 사용하는 언어 번역 프로그램

정적 컴파일 방식

실행하기 전에 프로그램 코드(원시 코드)를 기계어와 같은 목적 코드로 번역
  • 원시 코드(소스 코드)
    • 고급 프로그래밍 언어로 작성된 원래의 코드
  • 목적 코드
    • 저급 프로그래밍 언어로 작성된 실행 가능한 코드
    • 주로 다른 프로그램이나 하드웨어가 처리하기에 용이한 형태로 출력

고급 프로그래밍 언어
  - 사람이 이해하기 쉽게 작성된 프로그래밍 언어
  - C, 자바 등등...
  - 추상화 수준이 높을수록 높은 수준의 언어
  - 장점
    - 가독성이 높음
    - 유지 보수가 간단
  - 단점
    - 느린 속도

저급 프로그래밍 언어
  - 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어
  - 일반적으로 기계어나 어셈블리어를 일컬음
  - 장점
    실행 속도가 매우 빠름
  - 단점
    - 배우기 어려움
    - 유지 보수가 힘듬

인터프리터

인터프리트 방식을 사용하여 소스 코드를 바로 실행하는 프로그램

인터프리트 방식

  실행 중 프로그래밍 언어를 한줄 씩 읽어가면서
  해당 기능에 대응하는 기계어 코드를 실행

컴파일과 인터프리트 비교

출처

  • 크기가 큰 소스 코드에서 수정이 빈번하게 일어나는 경우는 인터프리터가 유리
    • 컴파일이 반복적으로 이루어지며 컴파일 속도가 오래 걸리기 때문

JIT 컴파일

JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.

  • JIT 컴파일러는 정적 컴파일 방식과 인터프리트 방식을 혼합한 방식으로 생각할 수 있다.
    • 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성함과 동시에 그 코드를 캐싱한다.
    • 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
  • 자바의 경우 다음 순서를 거친다.
    1. 자바 컴파일러가 자바 소스 코드를 바이트 코드로 변환하며 최적화한다.
    2. 바이트 코드가 실행되는 과정에서 실시간으로 JIT컴파일러가 바이트 코드를 기계어로 변환한다.
      • 실행되는, 즉 필요한 부분만 변환된다.
      • 변환된 기계어 코드는 캐싱되어 다시 컴파일할 필요가 없다.

JIT의 장점

  • 기존의 방식들보다 나은 점: 실행 과정에서 필요한만큼만 컴파일한다!
    • 인터프리트 방식은 소스코드를 최적화 과정이 없이 번역하기 때문에 성능이 낮음
    • 정적 컴파일언어는 실행 전에 무조건 컴파일을 했기 때문에, 다양한 플랫폼에 맞게 컴파일을 하기 위해 많은 시간 소요
  • 보통 인터프리터에 비해 빠른 수준이며, 경우에 따라 정적 컴파일러보다 빠르기도 함.

현대에 들어 자바 가상머신과 V8과 같은 많은 인터프리터가 JIT컴파일 등의 기술로 실시간 컴파일을 수행하므로, 컴파일러와 인터프리터 사이의 기술적 구분은 사라져 가는 추세이다.

참고자료

0개의 댓글