Compiler, Interpreter, Just-in-Time Compiler 차이점

Choi Yeonung·2021년 6월 3일

CPython과 PyPy의 차이점을 알아보다가 CPython은 interpreter이고 PyPy는 just-in-time compiler라는 사실을 발견했다.

'둘 다 코드를 부분마다 실행하는 건 비슷해 보이는데 도대체 뭐가 달라?'라는 생각이 들었다.

Interpreter와 JIT compiler에 대해 보다가 compiler라는 개념이 또 헷갈려서 다시 정리한다.

Compiler

간단하게 말해서 한 언어를 다른 언어로 바꾸는 프로그램이다. 나는 compiler가 무조건 코드를 기계어로 바꾸는 것을 말하는 줄 알았는데 아니었다. Translation 목적 언어가 꼭 기계어가 될 필요는 없다. 예를 들어, CPython은 compiler를 사용해 Python 코드를 bytecode로 바꾼 후, interpreting 한다.

Interpreter

Interpreter는 프로그래밍 언어나 스크립트 언어를 미리 기계어로 컴파일 할 필요 없이 바로 실행하는 컴퓨터 프로그램(실행하기 위해 기계어로 컴파일은 필요하나 '미리'하지 않는다)이다. 다음 세 가지 중 전략 중 하나를 사용한다.
1. 소스 코드를 파싱하고 바로 실행한다.
2. 소스 코드를 좀 더 효율적인 형태로 바꾸고 실행한다.
3. 컴파일러로 precompile 된 코드를 실행한다.

Just-in-Time Compiler

Just-in-time이라는 말이 말해주듯이, 프로그램 실행 시간에 컴파일을 하고 실행하는 것이다.

JIT compilation은 compiled code의 속도와 interpretation의 flexibility를 합친 것이다. 따라서 interpreter overhead와 compiling, linking overhead를 가지고 있다.

Interpreter와 Just-in-Time Compiler의 차이점

여기까지 읽어도 JIT compiler와 interpreter가 헷갈릴텐데, 나 같은 경우에는 interpreter도 어차피 실행할 때 기계어로 바꾸고, JIT compiler도 실행 시간에 기계어로 바꿔서 실행하는 건 같은데 왜 다르다고 하는 건지 궁금했다.

Stack Overflow 답변을 보니 Interpreter는 어떤 코드가 실행될 때마다 기계어로 바꾸는 데 반면에 JIT compiler는 코드가 실행되면 그 코드를 기계어로 바꿔두고 재실행될 때 그 부분을 다시 컴파일 하는 것이 아니라 기계어를 바로 실행(캐시된 기계어를 실행)한다는 점에서 다르다고 한다.

참고

https://en.wikipedia.org/wiki/Compiler
https://en.wikipedia.org/wiki/Interpreter_(computing)
https://en.wikipedia.org/wiki/Just-in-time_compilation
https://en.wikipedia.org/wiki/CPython
https://stackoverflow.com/questions/2426091/what-are-the-differences-between-a-just-in-time-compiler-and-an-interpreter

profile
Code as a hobby

0개의 댓글