PyPy RPython Translation Toolchain

그 동안 PyPy를 단순히 JIT을 지원하는 빠른 python implementation 이라고만 알고 있었다.그런데 알고 보니 단순한 python implementation 이상의 의미를 갖는 상당히 멋있는 프로젝트였다.

PyPy는 2가지 파트로 나뉜다.
1. RPython 문법으로 작성된 Python Interpreter
2. RPython Translation Toolchain

1번의 python interpreter를 2번의 toolchain에 넣으면, JIT, garbage collector 등의 기능이 첨가된 C언어로 된 interpreter가 결과로서 나온다.
???!! 매우 놀라울 것이다. 2번의 toolchain은 Python 소스 코드나 syntax trees 에 대한 정보는 전혀 가지고 있지 않는다. 그런데 JIT과 garbage collector를 비롯한 기능들을 첨가해준다니?!
그래서 내가 멋있다고 한 것이다...


(출처 : https://www.toptal.com/python/why-are-there-so-many-pythons)

PyPy의 구조를 그림으로 보자면 위와 같다. (PyPy Interpreter가 1번, PyPy compiler가 2번에 해당한다.)


(출처 : http://rpython.readthedocs.io/en/latest/translation.html)

RPython translation toolchain의 실제 플로우를 그림으로 보자면 위와 같다. 기본적으로 RPython으로 작성된 interpreter 코드가 필요하고 추가적으로 low level hint들을 통해 세부적인 과정에 참여할 수 있다. 그리고 translation toolchain의 backend는 현재 C언어만 가능하지만, 설계 상 더 추가가 가능한 구조이다.
그리고 이러한 RPython Translation Toolchain을 이용하면 Python 뿐만 아니라 모든 언어들의 'JIT'ed Interpreter를 얻을 수 있다.
https://bitbucket.org/brownan/pypy-tutorial/src/cbd43582d96947c4150109a21c7b2e828a92b64f/example2.py
위 소스코드는 아주 아주 간단한 언어의 interpreter이다. 보면 그냥 python으로 작성된 interpreter처럼 보일 것이다.
그러나 사실은 rpython으로 작성된 interpreter이고, 이 interpreter를 translation toolchain에 의해 translate가능하다. (관련 링크 : https://morepypy.blogspot.kr/2011/04/tutorial-writing-interpreter-with-pypy.html)
참 마법같다. 이러한 마법을 이용해서 만들어지는 다양한 interpreter들이 있다. (그 중에 하나가 PyPy인 것이다.)(관련 링크 : http://rpython.readthedocs.io/en/latest/examples.html)

RPython Translation Toolchain을 활용하면 interpreter 언어의 개발이 쉬워질 것으로 보인다.
LLVM도 그렇고, RPython도 그렇고, 점점 compiler/VM의 back-end 부분은 좋은 framework들을 활용하는 방향으로 가는 것 같다. 프로그래밍 언어에 대한 아이디어와 설계만 있다면 parsing과 중간언어 생성정도만 직접적으로 하고 세부적인 최적화등은 다른 framework들을 활용하면 되니.. 프로그래밍 언어를 만드는 꿈도 그렇게 어렵게 만은 느껴지지 않는다. 다양한 언어들을 깊게 판 뒤 문제점이랑 아이디어를 모아서 언젠가 나만의 언어를 만들어보고 싶다.

댓글