py2wasm - Python to WASM 컴파일러 공개
(wasmer.io)- 파이썬 프로그램을 WebAssembly로 변환해주는 컴파일러
- 인터프리터 오버헤드를 없애서 CPython(WASM) 보다는 3배 빠르게 동작
- CPython(Native) 대비해서는 약 60% 속도임
- Python을 WebAssembly에서 빠르게 실행하는 데는 여러 가지 방법이 있음
- 성능이 좋은 코드로 컴파일될 수 있는 Python 부분 집합 사용 : CPython, RPython(PyPy) 및 Codon
- Python 내부에서 JIT 사용 : PyPy
- 정적 분석을 사용하여 생성된 코드 최적화 : mypy & mypy-c, Nuitka
- 여기서 최종으로 파이썬 최적화 컴파일러인 Nuitka를 이용하기로 함
Nuitka
- Nuitka는 프로그램이 수행하는 Python 호출을 내부 CPython API 호출을 사용하여 C로 변환하여 작동함
- 대부분의 Python 프로그램을 지원하며, Python 코드를 해당 CPython 호출로 변환함
- 코드 난독화기로도 작동할 수 있음(아무도 프로그램을 디컴파일할 수 없음!)
- 모든 옵션을 깊이 분석한 결과, WebAssembly에서 Python을 실행하는 가장 빠른 방법은 아마도 Nuitka를 사용하는 것이라는 것을 깨달음
Nuitka를 사용하여 Python을 WebAssembly로 컴파일
- Nuitka는 Python 코드를 기본 CPython 인터프리터 호출로 변환하는 대부분의 작업이 이미 완료되었기 때문에 WebAssembly 컨텍스트에서 Python 속도를 높이는 가장 쉬운 옵션인 것 같음
- Nuitka는 아직 Python 3.12에서 작동하지 않으므로 Python을 3.11로 WASI에 재컴파일하고 생성된 libpython.a 아카이브를 사용해야 했음
- 생성된 Wasm 파일을 실행하려고 하면 또 다른 문제가 있었어서, Nuitka에 변경 사항을 업스트림하기 위해 PR을 제출
- 현재 py2wasm은 Nuitka의 포크를 사용하고 있지만, 변경 사항이 업스트림으로 통합되면 py2wasm을 Nuitka 위에 얇은 계층으로 만들 계획
- Python 실행을 최대한 가속화해서 Python Django 백엔드를 Google Cloud에서 Wasmer Edge로 이동하는게 우리의 초기 요구사항이었음
- py2wasm은 Python 백엔드 앱을 Edge에서 놀라운 성능으로 실행하는 데 한 걸음 더 가까워지게 해서, 현재 클라우드 제공업체보다 이러한 앱을 호스팅하기 위한 훨씬 저렴한 대안을 제공할 수 있게 도움을 줄 것
향후 로드맵
- 향후 py2wasm을 Wasmer 패키지로 게시하여 다음 명령을 실행하기만 하면 실행할 수 있기를 바람
wasmer run py2wasm --dir=. -- myfile.py -o myfile.wasm