포시코딩

JIT vs AOT 컴파일 방식 본문

CS (Computer Science)

JIT vs AOT 컴파일 방식

포시 2022. 11. 21. 12:33
728x90

JIT (Just-In-Time)

의미

C나 C++에서 하는 것처럼 프로그램을 실행하기 전에 처음 한 번 컴파일하는 대신,

프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식을 말한다.

작동방식

프로그램은 크게 두가지 방식으로 실행된다.

1. 컴파일 방식
	프로그램을 실행시키기 전 소스 코드를 기계어로 컴파일하여 오브젝트 파일로 만들어 둠. 
	프로그램 실행 시에는 오브젝트 파일의 기계어를 바로 실행.
	* 오브젝트 파일: 소스 코드를 기계어로 컴파일 한 결과가 저장된 파일
	예시) C, C++ 등
    
2. 인터프리트 방식
	프로그램이 시작되면, 소스 코드(혹은 ByteCode)를 
	진입점(Main 함수 혹은 실행한 파일의 최상단 코드)부터 한 줄씩 해석.

세부방식

JIT는 크게 두가지로 나눌 수 있는데

  1. 메소드(함수) 단위로 JIT 컴파일을 하는 방식 ex) HotSpot VM
  2. 그보다 더 작은 단위에서 프로그램 실행 흐름을 실시간으로 추적하며 컴파일할 코드를 탐색하는 Tracing JIT 방식
    특히, Tracing JIT의 경우에는 실행 시점에만 알 수 있는 정보를 컴파일에 적극적으로 반영하기 때문에
    이론적으로는 정적 컴파일 방식보다 컴파일 속도가 더 빨라질 수 있다. 

장점

JIT 방식은 같은 코드를 매번 해석하는 대신 처음 실행될 때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한 뒤

이후에는 캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있다.

컴파일 방식의 프로그램 실행과 근사한 수준의 실행 속도를 낼 정도.

이 때문에 JIT 방식은 '컴파일 방식과 인터프리트 방식을 섞어놓았다.' 라고 얘기하기도 한다.

1) def f(a, b): 
2)     return a+b
3) 
4) f(1, 2)
5) f(3, 4)
6) f(5, 6)

인터프리트 방식: 4 -> 1 -> 2 -> 5 -> 1 -> 2 -> 6 -> 1 -> 2

JIT 방식: 4 -> 1 -> 2 -> (Caching) -> 5 -> 6

단점

  1. 초기 구동 시에는 소스 코드(혹은 바이트코드)를 실행 단계에서 컴파일하는 데에 시간과 메모리를 소모하기 때문에
    정적 컴파일된 프로그램에 비해 실행 속도 면에서 손해를 본다는 것으로,
    특히 실행 시간이 매우 짧은 경우에는 애써 컴파일된 코드를 제대로 울궈먹기도 전에 프로그램이 끝나는
    배보다 배꼽이 더 큰 상황이 벌어지기도 한다. 
  2. 반복되는 코드가 거의 존재하지 않는 프로그램이라면 캐싱 할 코드가 거의 없으니 속도 향상 효과가 미미하다. 
  3. 미리 컴파일된 코드를 실행하는 것이 아닌, 런타임에 동적으로 코드를 생성하여 실행한다는 특징 때문에
    JIT 컴파일러는 잠재적으로 상당한 보안 문제를 가지고 있다.
    특히, JIT 컴파일러 자체에 버그가 있는 경우 곧바로 보안취약점이 되는 경우가 많다. 

예시

JIT의 대표적 예시로 자바스크립트는 초창기 소스 코드에서 인터프리트 하는 방식 때문에 얼마 못가 사라질 언어라고 생각되었지만

파이어폭스가 JIT 컴파일 방식을 도입했고 구글 크롬이 이를 뒤따르며 어마어마한 속도 향상을 가져옴으로서

자바스크립트의 활용 폭을 엄청나게 넓히게 되었다.

 

 

AOT (Ahead-Of-Time)

의미

소스코드를 '미리' 컴파일 하는 방식이다.

여러 에러들을 빌드 타임에 미리 잡을 수 있기 때문에 실제 프로덕션 과정에서 자주 사용되는 방식이다. 

장점

  1. 빌드 타임에 컴파일이 되기 때문에 기존의 방식에서 컴파일에 소요되는 시간이 빠져 더 빠른 렌더가 가능하다.
  2. 또한, 서버에서 이미 컴파일된 파일을 제공하므로 클라이언트에서 http 요청을 보냈을 때 컴파일러를 보낼 필요가 없다. 
  3. JIT 컴파일러가 런타임 컴파일 하기 때문에 발생하는 성능 이슈가 생기지 않고 거의 네이티브의 성능을 낼 수 있다.

단점

  1. 실행 전에 전체 파일을 빌드해야 하기 때문에 빌드 속도가 느려진다. 
  2. 설치할 때도 JIT 컴파일러를 사용하는 경우 바이트 코드만 받으면 되는 반면
    AOT 컴파일러를 사용하면 기계어로 번역하는 작업까지 포함되기 때문에 느리다. 

 

결론

개발 단계에 JIT 컴파일러를 이용해 수정사항이 빠르게 반영 될 수 있도록 만들고

프로덕션으로 배포하는 경우 AOT 방식으로 빌드해서 런타임 성능을 훼손하지 않도록 구분하면 되겠다.

 

* 여기서 JIT와 AOT의 'Time'은 Runtime. 즉, 실행 시간을 말한다. 

 

 

 

 

https://icepri3535.tistory.com/60

 

JIT vs AOT

JIT (Just-In-Time) 소스코드를 프로그램 실행 시 즉석해서(런타임) 기계어로 컴파일하여 실행시키는 방식 주로 인터프리터 언어에서 프로그램 실행속도를 향상시키기 위해 사용하는 프로그램 실행

icepri3535.tistory.com

728x90

'CS (Computer Science)' 카테고리의 다른 글

캐시(Cache)  (1) 2023.01.07
CPU  (0) 2023.01.07
Database, MongoDB  (0) 2022.12.13
API, RESTful API  (0) 2022.12.01
랜덤이 정말 랜덤일까? - Web Crypto API  (0) 2022.11.22