CPython과 PyPy의 차이점을 알아보다가 CPython은 interpreter이고 PyPy는 just-in-time compiler라는 사실을 발견했다.
'둘 다 코드를 부분마다 실행하는 건 비슷해 보이는데 도대체 뭐가 달라?'라는 생각이 들었다.
Interpreter와 JIT compiler에 대해 보다가 compiler라는 개념이 또 헷갈려서 다시 정리한다.
간단하게 말해서 한 언어를 다른 언어로 바꾸는 프로그램이다. 나는 compiler가 무조건 코드를 기계어로 바꾸는 것을 말하는 줄 알았는데 아니었다. Translation 목적 언어가 꼭 기계어가 될 필요는 없다. 예를 들어, CPython은 compiler를 사용해 Python 코드를 bytecode로 바꾼 후, interpreting 한다.
Interpreter는 프로그래밍 언어나 스크립트 언어를 미리 기계어로 컴파일 할 필요 없이 바로 실행하는 컴퓨터 프로그램(실행하기 위해 기계어로 컴파일은 필요하나 '미리'하지 않는다)이다. 다음 세 가지 중 전략 중 하나를 사용한다.
1. 소스 코드를 파싱하고 바로 실행한다.
2. 소스 코드를 좀 더 효율적인 형태로 바꾸고 실행한다.
3. 컴파일러로 precompile 된 코드를 실행한다.
Just-in-time이라는 말이 말해주듯이, 프로그램 실행 시간에 컴파일을 하고 실행하는 것이다.
JIT compilation은 compiled code의 속도와 interpretation의 flexibility를 합친 것이다. 따라서 interpreter overhead와 compiling, linking overhead를 가지고 있다.
여기까지 읽어도 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