Python을 WebAssembly로 컴파일하는 중
파이썬 2.7 코드를 웹어셈블리로 변환하는 것이 가능하다는 것을 읽었지만, 그렇게 하는 방법에 대한 확실한 가이드를 찾을 수 없습니다.
지금까지 Emscripten과 필요한 모든 구성 요소를 사용하여 웹 어셈블리에 C 프로그램을 컴파일했기 때문에 작동하는 것으로 알고 있습니다(가이드: http://webassembly.org/getting-started/developers-guide/) .
Ubuntu 컴퓨터에서 이 작업을 수행하려면 어떤 단계를 수행해야 합니까?파이썬 코드를 LLVM 비트코드로 변환한 후 Emscripten을 사용하여 컴파일해야 합니까?그렇다면 제가 이를 어떻게 달성할 수 있을까요?
WebAssembly 대 asm.js
먼저 WebAssembly가 원칙적으로 asm.js와 어떻게 다른지, 그리고 기존 지식과 툴링을 재사용할 수 있는 가능성이 있는지 알아보겠습니다.다음은 꽤 좋은 개요를 제공합니다.
WebAssembly(MVP는 로드맵에 대한 내용이 더 많기 때문에)의 개요를 다시 살펴보겠습니다.
- 는 정적 타이핑을 가진 AST의 이진 포맷으로, 기존의 자바스크립트 엔진(따라서 JIT-able 또는 컴파일된 AOT)에 의해 실행될 수 있습니다.
- 자바스크립트보다 10-20% 더 콤팩트하고(gziped comparison) 파싱이 훨씬 빠릅니다.
- 자바스크립트 구문에 맞지 않는 더 낮은 수준의 연산을 표현할 수 있으며 asm.js로 읽힙니다(예: 64비트 정수, 특수 CPU 명령어, SIMD 등).
- 는 asm.js 로 (어느 정도) 변환 가능합니다.
따라서 현재 WebAssembly는 asm.js에서 반복되며 C/C++(및 유사 언어)만을 대상으로 합니다.
파이썬 온 더 웹
GC만이 파이썬 코드가 WebAssembly/asm.js를 목표로 하는 것을 막는 유일한 것은 아닌 것 같습니다.둘 다 낮은 수준의 정적으로 입력된 코드를 나타내며, 파이썬 코드는 (현실적으로) 표현할 수 없습니다.현재 WebAssembly/asm.js의 툴체인은 LLVM을 기반으로 하고 있기 때문에 LLVM IR로 쉽게 컴파일할 수 있는 언어를 WebAssembly/asm.js로 변환할 수 있습니다.하지만 안타깝게도, 파이썬은 너무 역동적이어서 그것에 맞지 않습니다. 언라덴 스왈로우와 여러 번의 파이파이 시도에서 입증되었습니다.
이 asm.js 프레젠테이션에는 동적 언어의 상태에 대한 슬라이드가 있습니다.즉, 현재 전체 VM(C/C++ 언어 구현)을 WebAssembly/asm.js로 컴파일하고 원본 소스를 해석(가능한 경우 JIT로)하는 것만 가능합니다.Python의 경우 몇 가지 기존 프로젝트가 있습니다.
PyPy:PyPy.js (PyCon에서의 저자 강연)발매 레포입니다.메인 JS파일,
pypyjs.vm.js
, 13MB(이후 2MB)입니다.gzip -6
) + Python stdlib + 기타 항목.C-Python : 피오다이드, EmPython, C-Python-Emscripten, EmC-Python 등
empython.js
5.8MB(이후 2.1MB)입니다.gzip -6
), nostdlib.마이크로파이썬: 이 포크.
거기에는 구축된 JS 파일이 없어서, 이미 만들어진 엠스크립트엔 툴체인으로 구축할 수 있었습니다.다음과 같은 경우:
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 # to run REPL: npm install && nodejs server.js
생산합니다.
micropython.js
1.1MB(이후 225KB)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
, 이 파일들을 사용하는 방법을 알아봅니다.이렇게 하면 웹어셈블리에서 PyPy 및 CPython을 구축하여 호환 브라우저에서 Python 응용 프로그램을 해석할 수도 있습니다.
여기서 또 다른 잠재적으로 흥미로운 것은 Python to C++ 컴파일러인 Nuitka입니다.잠재적으로 파이썬 앱을 C++로 빌드한 다음 엠스크립트로 CPython과 함께 컴파일하는 것이 가능할 수 있습니다.하지만 실제로는 어떻게 하는지 전혀 모르겠습니다.
해결책
당분간, 수 메가바이트의 JS 파일을 다운로드하는 것이 거의 선택 사항이 아닌 기존 웹 사이트 또는 웹 앱을 구축하는 경우, Python-to-JavaScript 트랜스필러(예: Transcrypt) 또는 JavaScript Python 구현(예: Brython)을 살펴봅니다.또는 자바스크립트로 컴파일되는 언어 목록에서 다른 사람들에게 행운을 빌어보세요.
그렇지 않으면 다운로드 크기가 문제가 되지 않고 여러 가지 어려운 문제를 해결할 준비가 되었다면 위의 세 가지 중에서 하나를 선택합니다.
2020년 3분기 업데이트
자바스크립트 포트는 MicroPython에 통합되었습니다.항구/자바스크립트에 서식합니다.
이 포트는 MicroPython.js라는 npm 패키지로 제공됩니다.런킷에서 해보실 수 있습니다.
러스트에는 러스트파이톤(RustPython)이라는 파이썬(Python) 구현체가 활발하게 개발되어 있습니다.러스트는 공식적으로 WebAssembly를 컴파일 대상으로 지원하기 때문에, Readme의 맨 위에 데모 링크가 있는 것도 놀랄 일이 아닙니다.아직은 이르긴 하지만요.그들의 면책 조항은 다음과 같습니다.
RustPython은 개발 단계에 있으므로 생산에 사용하거나 내결함성 설정에 사용해서는 안 됩니다.
우리의 현재 빌드는 파이썬 구문의 하위 집합만 지원합니다.
2023년 1분기 업데이트
파이썬 3.11은 문서에 두 개의 웹어셈블리 "플랫폼"을 인식하고 리눅스 및 유닉스와 같은 다른 플랫폼들 사이에서 API 가용성을 문서화합니다(자세한 내용은 이 PR 참조). 또한 다음을 기반으로 Pyodide(모질라에서)와 PyScript(아나콘다에서)를 추천합니다.
웹 어셈블리 플랫폼
wasm32-emscripten
(엠스크립트엔) 및wasm32-wasi
(WASI)는 POSIX API의 서브셋을 제공합니다.WebAssembly 실행 시간 및 브라우저는 샌드박스 처리되며 호스트 및 외부 리소스에 대한 액세스가 제한됩니다.프로세스, 스레드, 네트워킹, 신호 또는 기타 형태의 프로세스 간 통신(IPC)을 사용하는 Python 표준 라이브러리 모듈은 사용할 수 없거나 다른 Unix와 같은 시스템에서 작동하지 않을 수 있습니다.[...]
브라우저의 파이썬의 경우 Pyodide 또는 PyScript를 고려해야 합니다.PyScript는 Python과 Emscripten 위에 구축된 Pyodide 위에 구축됩니다.Pyodide는 자바스크립트의 XMLHtpRequest 및 Fetch API로 제한된 네트워킹 기능뿐만 아니라 브라우저의 JavaScript 및 DOM API에 대한 액세스를 제공합니다.
간단히 말해서:트랜스필러도 있지만 임의의 파이썬을 웹어셈블리로 자동 변환할 수는 없고, 앞으로도 오랫동안 변환이 가능할지 의문입니다.이론적으로는 언어가 동등하게 강력하고 항상 수동 번역이 가능하지만, Python은 매우 똑똑한 언어 간 컴파일러(또는 트랜스필러)가 필요한 일부 데이터 구조와 표현 모드를 허용합니다 [아래 참조].Python-to-C 기술이 상당히 성숙하기 때문에 해결책은 Python-to-C to Web Assembly가 될 수 있지만, Python-to-C도 취약하기 때문에 일반적으로 작동하지 않습니다(아래 참조).
WebAssembly는 http://webassembly.org/docs/high-level-goals/ 에서 볼 수 있듯이 특히 C와 유사한 언어를 대상으로 합니다.
파이썬에서 C로 번역하는 것은 PyPy와 같은 도구를 사용할 수 있는데, PyPy는 오랫동안 개발 중이지만 임의의 파이썬 코드에서는 여전히 작동하지 않습니다.이에 대한 몇 가지 이유가 있습니다.
- 파이썬은 매우 편리하고 추상적이며 좋은 데이터 구조를 가지고 있지만 정적 코드로 변환하기는 어렵습니다.
- 파이썬은 동적 가비지 컬렉션에 의존합니다.
- 대부분의 파이썬 코드는 다양한 라이브러리에 크게 의존하며, 각 라이브러리마다 고유한 특징과 문제(예: C로 작성되거나 심지어 어셈블러로 작성되는 등)를 가지고 있습니다.
Python-to-C(또는 Python-to-C+)가 왜 그렇게 까다로웠는지 좀 더 자세히 들여다보면 이 간결한 답변 뒤에 숨겨진 자세한 이유를 알 수 있지만, 저는 그것이 질문의 범위를 벗어난다고 생각합니다.
웹 어셈블리에서 가비지 컬렉션을 구현할 때까지는 불가능합니다.여기서 진행 상황을 확인할 수 있습니다. https://github.com/WebAssembly/proposals/issues/16
가장 먼저 떠오르는 것은 파이파이와 rpython이고, 그 후에 저는 발견했습니다.
https://github.com/soIu/rpython
우리는 임의의 파이썬 코드를 rpython으로 바꿀 수 없습니다.그러나 러스트나 어셈블리스크립트가 아닌 대체 언어가 필요하다면 rpython이 방향이 될 수 있습니다.
따라서 저는 python/js/rust with wasm을 샌드박스로 사용할 수 있고 rpython과 같은 매우 피톤적인 언어로 코딩할 수 있습니다.적어도 저는 정수 과잉에 대해 걱정할 필요가 없습니다.
Python은 WASM에 대해 너무 동적이므로 WASM에서 인터프리터만 구현할 수 있지만 코드는 컴파일되지 않았습니다.
다른 방법으로 Python을 툴링 언어로 사용하고 자신의 모델 컴파일러를 WASM에 쓸 수 있습니다.제 말은 소스-투-WASM 컴파일이 아니라 애플리케이션의 모델을 WASM 또는 다른 하위 언어인 Rust 또는 C++로 변환하는 컴파일러를 의미합니다.
이러한 모델은 모듈, 클래스, API 인터페이스, GUI 요소 등 응용 프로그램의 일부를 설명하는 개체에서 결합된 데이터 구조로 구현할 수 있습니다.이러한 개체는 상태와 동작을 낮은 수준의 코드 조각에 쓰는 방법을 "아는" 코드 생성 방법을 가지고 있어야 합니다.
다음으로 이렇게 생성된 코드 조각을 프로젝트에 결합하여 수동으로 응용 프로그램을 구축할 수 있습니다. WASM 지원 컴파일러를 사용하거나 WAT 파일만 사용할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/44761748/compiling-python-to-webassembly
'code' 카테고리의 다른 글
700M 행의 Oracle 테이블에서 실행되는 업데이트 SQL을 최적화하는 방법 (0) | 2023.09.15 |
---|---|
EF Core - 표 '*._EF 마이그레이션'History'가 존재하지 않습니다. (0) | 2023.09.15 |
이미지 버튼에 재료 디자인 터치 리플 적용? (0) | 2023.09.10 |
Windows Forms 응용프로그램에 응용프로그램 설정을 저장하려면 어떻게 해야 합니까? (0) | 2023.09.10 |
parcelable에서 IOException이 발생했습니다. serialable object get activity()를 기록했습니다. (0) | 2023.09.10 |