WebAssembly vs asm.js
İlk olarak, WebAssembly’ın prensip olarak asm.js’den nasıl farklı olduğuna ve mevcut bilgi ve araçları yeniden kullanma potansiyeli olup olmadığına bir bakalım . Aşağıdakiler oldukça iyi bir genel bakış sağlar:
Özetleyelim, WebAssembly (MVP, yol haritasında daha fazlası olduğu için kabaca):
- mevcut JavaScript motorları (ve dolayısıyla JIT uyumlu veya derlenmiş AOT) tarafından yürütülebilen statik tiplemeli bir ikili AST formatıdır,
- % 10-20 daha kompakttır (gzip ile sıkıştırılmış karşılaştırma) ve ayrıştırılması JavaScript'ten daha hızlıdır,
- JavaScript sözdizimine uymayan daha düşük seviyeli işlemleri ifade edebilir, asm.js okuyabilir (örn. 64 bit tam sayılar, özel CPU talimatları, SIMD, vb.)
- asm.js'ye (bir dereceye kadar) dönüştürülebilir.
Bu nedenle, şu anda WebAssembly asm.js üzerinde bir yinelemedir ve yalnızca C / C ++ (ve benzer dilleri) hedefler.
Web'de Python
Python kodunun WebAssembly / asm.js'yi hedeflemesini engelleyen tek şey GC gibi görünmüyor. Her ikisi de, Python kodunun (gerçekçi olarak) temsil edilemediği düşük seviyeli statik olarak yazılmış kodu temsil eder. WebAssembly / asm.js'nin mevcut araç zinciri LLVM'ye dayandığından, LLVM IR'ye kolayca derlenebilen bir dil WebAssembly / asm.js'ye dönüştürülebilir. Ancak ne yazık ki, Unladen Swallow ve birkaç PyPy girişimiyle kanıtlandığı gibi Python da buna sığamayacak kadar dinamiktir .
Bu asm.js sunumunda dinamik dillerin durumu hakkında slaytlar vardır . Bunun anlamı, şu anda yalnızca tüm VM'yi (C / C ++ dil uygulaması) WebAssembly / asm.js'ye derlemek ve orijinal kaynakları yorumlamak (mümkün olduğunda JIT ile) mümkündür. Python için birkaç mevcut proje vardır:
PyPy: PyPy.js (yazarın PyCon'daki konuşması ). İşte sürüm deposu . Ana JS dosyası pypyjs.vm.js
13 MB (2MB sonra gzip -6
) + Python stdlib + diğer şeylerdir.
CPython: pyodide , EmPython , CPython-Emscripten , EmCPython , vb. empython.js
5,8 MB (2,1 MB sonra gzip -6
), stdlib yok.
Micropython: bu çatal .
Orada yerleşik bir JS dosyası yoktu, bu yüzden onu trzeci/emscripten/
hazır bir Emscripten araç zinciri ile oluşturabildim. Gibi bir şey:
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 (sonra 225 KB gzip -d
) üretir . Stdlib olmadan yalnızca çok uyumlu bir uygulamaya ihtiyacınız varsa, ikincisi zaten dikkate alınması gereken bir şeydir.
WebAssembly üretmek amacıyla satır 13 değiştirebilir inşa Makefile
etmek
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
Ardından make -j
şunları üretir:
113 KB micropython.js
240 KB micropython.wasm
emcc hello.c -s WASM=1 -o hello.html
Bu dosyaların nasıl kullanılacağını görmek için HTML çıktısına bakabilirsiniz .
Bu şekilde, Python uygulamanızı uyumlu bir tarayıcıda yorumlamak için WebAssembly içinde potansiyel olarak PyPy ve CPython da oluşturabilirsiniz.
Buradaki potansiyel olarak ilginç bir başka şey de Python'dan C ++ 'ya derleyici Nuitka'dır . Potansiyel olarak Python uygulamanızı C ++ 'ya oluşturmak ve daha sonra Emscripten ile CPython ile birlikte derlemek mümkün olabilir. Ama pratikte nasıl yapılacağına dair hiçbir fikrim yok.
Çözümler
Şimdilik, birkaç megabaytlık JS dosyası indirmenin pek mümkün olmadığı geleneksel bir web sitesi veya web uygulaması oluşturuyorsanız, Python'dan JavaScript'e aktarıcılara (örn. Transcrypt ) veya JavaScript Python uygulamalarına ( örn.Brython ). Ya da şansınızı JavaScript'e derleyen diller listesinden başkalarıyla deneyin .
Aksi takdirde, indirme boyutu bir sorun değilse ve birçok pürüzle başa çıkmaya hazırsanız, yukarıdaki üçü arasından seçim yapın.
Q3 2020 güncellemesi
JavaScript portu MicroPython'a entegre edildi. Portlarda / javascript'te yaşıyor
.
Bağlantı noktası, MicroPython.js adlı bir npm paketi olarak mevcuttur . Sen bunu deneyebilirsiniz runkit .
Rust'ta RustPython adında aktif olarak geliştirilmiş bir Python uygulaması var
. Rust , derleme hedefi olarak WebAssembly'ı resmi olarak desteklediğinden, benioku'nun en üstünde demo bağlantısı olması şaşırtıcı değil. Yine de erken. Feragatnameleri aşağıdaki gibidir.
RustPython bir geliştirme aşamasındadır ve üretimde veya hataya tahammülsüz bir ortamda kullanılmamalıdır.
Mevcut yapımız yalnızca bir Python sözdizimi alt kümesini destekler.