# py2wasm - Python to WASM 컴파일러 공개

> Clean Markdown view of GeekNews topic #14461. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14461](https://news.hada.io/topic?id=14461)
- GeekNews Markdown: [https://news.hada.io/topic/14461.md](https://news.hada.io/topic/14461.md)
- Type: news
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2024-04-23T11:04:17+09:00
- Updated: 2024-04-23T11:04:17+09:00
- Original source: [wasmer.io](https://wasmer.io/posts/py2wasm-a-python-to-wasm-compiler)
- Points: 17
- Comments: 0

## Topic Body

- 파이썬 프로그램을 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  
  ```

## Comments



_No public comments on this page._
