백준 문제 풀다가 python으로 돌리면 시간이 터지는데 같은 코드를 pypy로 돌리니까 통과하는 문제가 있었다. 그래서 pypy가 뭔지 궁금해졌다.
애초에 python은 뭐지? 알아보자.
https://velog.io/@happycyc/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%98-%EA%B5%AC%ED%98%84%EC%B2%B4
https://namu.wiki/w/Python/%EA%B5%AC%ED%98%84%EC%B2%B4
파이썬 처음 배울 때 뭐 파이썬은 인터프리터 언어고, C는 컴파일러고 뭐고 하면서 둘의 차이를 비유로 설명들었던 기억이 난다. 잠깐 돌이켜보자,
중국인이 중국어로 한국인에게 말을 거는 상황을 가정하자.
어떻게 하면 한국인이 중국인의 말을 알아들을까?
-> 그래서 파이썬은 컴파일 과정이 없어 생산속도는 빠르지만, 한줄한줄 읽고 실행해야 하기 때문에
실행속도는 이미 전부 기계코드로 변환된 것을 실행하기만 하면 되는 컴파일러(C)보다 느리다! 고 배웠다.
띠용? 파이썬도 C로 만들었네? 뭐야
그렇다. 파이썬은 사실 파이썬 코드를 전부 바이트 코드로 변환한 뒤에 바이트 코드를 한줄씩 해석하는 녀석이다. (뭐야?)
이 컴파일 과정을 보고도 파이썬 = 인터프리터 라고 하는 이유는 파이썬의 구현방식이 인터프리터 방식이기 때문이다.
(참조)
즉, 파이썬의 소스코드가 바이트코드로 컴파일 과정이 일어난다 할지라도
이는 CPU에 의해 동작되는 것이 아닌 가상머신 위에서 동작되며
사용자에게는 암시적으로 단순하게 .py라는 파일만 실행을 하기 때문에 인터프리터의 구현방식이라고 말을 할 수 있다.
바이너리 코드 -> CPU가 이해할 수 있는 이진 코드
ex)0101010....
바이트 코드 -> 가상머신이 이해할 수 있는 이진 코드
ex)0101010....
우리는 파이썬을 다운받을 때 인터프리터만 다운받지 않는다.
파이썬 인터프리터 + 가상머신 + 컴파일러를 패키지로 다운받는다.
이렇게 파이썬의 철학을 구현한 구현체에는 종류가 있고, Python과 PyPy모두 이런 구현체의 일부이다. 일반적으로 Python하면 표준인 CPython을 말한다.

▶ 파이썬의 공식 구현체로, c/c++로 작성된 인터프리터이다. 즉, 가장 일반적으로 사용되는 파이썬 버전이다.
▶ CPython은 인터프리터 이면서 컴파일러이다. 우리가 작성하는 Python 코드를 bytecode로 컴파일 하고 실행한다. 다시 말해, python 코드를 C언어로 바꾸는 것이 아니라 컴파일하여 bytecode로 바꾸고 그 다음에 interpreter(virtual machine)가 실행한다.
그렇다면 PyPy는 뭘까?

▶ 파이썬으로 구현한 파이썬이다! (신기해라)
▶ Just-In-Time(JIT) 컴파일러를 사용해서 CPython보다 빠르단다.
C나 C++에서 하는 것처럼 프로그램을 실행하기 전에 처음 한 번 컴파일하는 대신, 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식을 말한다.
보통 인터프리터 방식의 언어 구현들이 성능 향상을 목적으로 도입하는 경우가 많은데, JIT 컴파일러는 같은 코드를 매번 해석하는 대신 처음 실행될 때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한 뒤, 이후에는 캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있다. 바이트코드 컴파일을 사용하는 Java도 바이트코드를 기계어로 번역할 때 JIT 컴파일러를 사용한다.