WebAssembly 대 asm.js
먼저, 원칙적으로 WebAssembly 가 asm.js 와 어떻게 다른지 , 기존 지식과 도구를 재사용 할 가능성이 있는지 살펴 보겠습니다 . 다음은 꽤 좋은 개요를 제공합니다.
요약하자면 WebAssembly ( 대략 로드맵에 더 많은 것이 있으므로 MVP ) :
- 기존 JavaScript 엔진 (따라서 JIT 가능 또는 컴파일 된 AOT)에 의해 실행될 수있는 정적 유형이있는 AST의 이진 형식입니다.
- 10-20 % 더 간결하고 (gzipped 비교) JavaScript보다 훨씬 빠르게 구문 분석 할 수 있습니다.
- JavaScript 구문에 맞지 않는 더 낮은 수준의 작업을 표현할 수 있으며 asm.js를 읽을 수 있습니다 (예 : 64 비트 정수, 특수 CPU 명령, SIMD 등).
- asm.js에서 (어느 정도) 변환 가능합니다.
따라서 현재 WebAssembly는 asm.js의 반복이며 C / C ++ (및 유사한 언어) 만 대상으로합니다.
웹에서의 Python
GC가 Python 코드가 WebAssembly / asm.js를 대상으로하는 것을 막는 유일한 방법은 아닌 것 같습니다. 둘 다 파이썬 코드를 (실제적으로) 표현할 수없는 저수준 정적으로 형식화 된 코드를 나타냅니다. 현재 WebAssembly / asm.js의 툴체인은 LLVM 기반이므로 LLVM IR로 쉽게 컴파일 할 수있는 언어를 WebAssembly / asm.js로 변환 할 수 있습니다. 그러나 슬프게도 Python은 Unladen Swallow 와 PyPy의 여러 시도 에 의해 입증 된 것처럼 너무 동적으로 적용 할 수 없습니다 .
이 asm.js 프레젠테이션에는 동적 언어의 상태에 대한 슬라이드가 있습니다 . 이것이 의미하는 바는 현재 전체 VM (C / C ++의 언어 구현)을 WebAssembly / asm.js로 컴파일하고 가능한 경우 JIT로 원본 소스를 해석하는 것만 가능하다는 것입니다. Python의 경우 기존 프로젝트가 여러 개 있습니다.
PyPy : PyPy.js ( PyCon 의 저자 강연 ). 여기에 릴리스 저장소가 있습니다. 기본 JS 파일 pypyjs.vm.js
은 13MB (2MB 이후 gzip -6
) + Python stdlib + 기타 항목입니다.
CPython : pyodide , EmPython , CPython-Emscripten , EmCPython 등 empython.js
은 5.8MB ( 이후 2.1MBgzip -6
)이며 stdlib는 없습니다.
Micropython : 이 포크 .
거기에는 빌드 된 JS 파일이 없었기 때문에 trzeci/emscripten/
기성품 인 Emscripten 툴체인 으로 빌드 할 수있었습니다 . 다음과 같은 것 :
git clone https://github.com/matthewelse/micropython.git
cd micropython
docker run --rm -it -v $(pwd):/src trzeci/emscripten bash
apt-get update && apt-get install -y python3
cd emscripten
make -j
그것은 생산 micropython.js
1.1 MB (후 2백25킬로바이트의 gzip -d
). 후자는 stdlib없이 매우 호환되는 구현 만 필요한 경우 이미 고려할 사항입니다.
WebAssembly 빌드를 생성하려면 13 행을 다음 Makefile
으로 변경할 수 있습니다.
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
그런 다음 다음을 make -j
생성합니다.
113 KB micropython.js
240 KB micropython.wasm
의 HTML 출력 emcc hello.c -s WASM=1 -o hello.html
을보고 이러한 파일을 사용하는 방법을 확인할 수 있습니다.
이러한 방식으로 WebAssembly에서 PyPy 및 CPython을 잠재적으로 빌드하여 호환 브라우저에서 Python 애플리케이션을 해석 할 수 있습니다.
여기서 흥미로운 또 다른 점은 Python to C ++ 컴파일러 인 Nuitka 입니다. 잠재적으로 Python 앱을 C ++로 빌드 한 다음 Emscripten을 사용하여 CPython과 함께 컴파일 할 수 있습니다. 그러나 실제로 나는 그것을하는 방법을 모릅니다.
솔루션
당분간 수 메가 바이트 크기의 JS 파일을 다운로드 할 수없는 기존 웹 사이트 또는 웹 앱을 구축하는 경우 Python-JavaScript 트랜스 파일러 (예 : Transcrypt ) 또는 JavaScript Python 구현 (예 : Brython)을 살펴보십시오. ). 또는 JavaScript로 컴파일되는 언어 목록 에서 다른 사람들과 함께 행운을 시험해보십시오 .
그렇지 않고 다운로드 크기가 문제가되지 않고 많은 거친 가장자리를 해결할 준비가 되었다면 위의 세 가지 중에서 선택하십시오.
2020 년 3 분기 업데이트
JavaScript 포트 가 MicroPython 에 통합 되었습니다. 그것은에 살고있는
포트 / 자바 스크립트 .
이 포트는 MicroPython.js 라는 npm 패키지로 제공됩니다 . RunKit 에서 시험해 볼 수 있습니다 .
Rust에는 RustPython 이라는 적극적으로 개발 된 Python 구현이
있습니다. Rust는 공식적으로 WebAssembly를 컴파일 대상 으로 지원하기 때문에 readme 상단에 데모 링크 가 있다는 것은 놀라운 일이 아닙니다 . 하지만 일찍입니다. 그들의 면책 조항은 다음과 같습니다.
RustPython은 개발 단계에 있으며 프로덕션 또는 내결함성 설정에서 사용해서는 안됩니다.
현재 빌드는 Python 구문의 하위 집합 만 지원합니다.