10 August 2020 : now WaPy can load as an es6 module, it also feature step-debugging for synchronous code.
3 June 2020 : https://github.com/pmp-p/wapy/tree/wapy-wipdonotuse is quite stable and can run 2x to 5x slower than cpython native
5x slower means full preemption like micropython.schedule can do on MCU except there it returns to js coroutines.
so time.sleep, open(file & sockets), import are going to be implemented with "aio" functions (POSIX.1-2001, POSIX.1-2008)
the ffi/ctypes support seems enough to run some PySDL2 samples ( ctypes wrapper for CPython and SDL2 )
demo: https://pmp-p.github.io/wapy/minide/
to build : apply https://patch-diff.githubusercontent.com/raw/pmp-p/wapy/pull/3.diff on a micropython-master tree named build-no_nlr
Neither micropython/micropython or pfalcon/pycopy seem actually attracted to have a bare metal preemptible VM :
micropython/micropython#4131 (comment)
I don't see much point to bother integrate in upstream "ports" folder : so future of wapy could well be wasi-header-only or an arduino lib tied to Wasm3 which should allow to write wapy drivers directly with bare-metal C or arduino.
1 May 2020 : Project lives again, but is not compatible with either micropython or pycopy because of adoption of a no nlr, registers and a heavily customized vm.c i'll se how to integrate again when time comes. Meanwhile i'll try to maintain prebuilt and testsuite here https://github.com/pmp-p/wapy
20 august 2019 : blocked again https://bugs.llvm.org/show_bug.cgi?id=43060
16 august 2019 : retrying stackless with clang CI intregration this is using emsdk tot-upstream (tip of tree) not latest-upstream (yet)
10 august 2019 : currently paused because reached somehow limit of emscripten compiler by abusing jump tables meanwhile trying new upstream clang with micropython no nlr branch which is better for stackless https://github.com/pmp-p/micropython/tree/wasm-nonlr/ports/wasm-no-nlr
old working versions always stored in branches.
wasm is a virtual machine for internet browsers which run bytecode closer to native speeds see https://webassembly.org/
but we want to run python virtual machine and its own bytecode ;) so thanks to micropython we'll be able to by compiling micropython core to wasm bytecode first.
-
Linux OS with gcc/clang, a decent build environnement and libltdl-dev
-
have python3 in your path 3.6 should do it but 3.7 / 3.8 are safer.
-
Follow the instructions for getting started with Emscripten here.
Get the content of https://github.com/pmp-p/pmp-p.github.io/tree/master/wapy.es6 and hack it to your liking.
( does not apply to wapy, involves compilation )
Beware this is not a micropython fork : it's a port folder to add support to official micropython for a new "machine"
You first need to get easy building your own official micropython and its javascript port
Follow the instructions for getting started with micropython unix build
https://github.com/micropython/micropython/
to check if your emscripten build works ( facultative, FYI last test on emscripten 1.38.31 was ok )
https://github.com/micropython/micropython/tree/master/ports/javascript
but i suggest using emmake make -C ports/javascript PYTHON=python2
instead of just make
What are the differences between this repo and the official javascript port?
see #4
now you're ready to build the port, you can run
# micropython-ports-wasm will go in micropython/ports/wasm
# as it's not a fork but a drop in target port we need to checkout a full microPython
# get the micropython core.
# official ( should always work ! )
git clone --recursive --recurse-submodules https://github.com/micropython/micropython
cd micropython
# or lvgl enabled ( wip could not work )
# git clone --recursive --recurse-submodules https://github.com/littlevgl/lv_micropython.git
# cd lv_micropython
# git checkout lvgl_javascript
# git submodule update --recursive --init
# if you want to use asyncio with lvgl just add the patch https://patch-diff.githubusercontent.com/raw/littlevgl/lv_binding_micropython/pull/30.diff
# that allows you to service with SDL.run_once()
#build host tools
make -C mpy-cross
make -C ports/unix
#add the target port
cd micropython/ports
git clone https://github.com/pmp-p/micropython-ports-wasm.git wasm
cd wasm
#transpile the mixed python/C module to pure C
#use a python3 version with annotations support !
# . modgen.sh
. /path/to/emsdk/emsdk_set_env.sh
# for LVGL support use "./rebuild.sh LVGL=1" instead
# test will be run automatically.
# emmake make USER_C_MODULES=cmod && . runtest.sh
# modgen and make have been merged in rebuild-upsteam.sh script
chmod +x *sh
# avoid using ./rebuild-fastcom.sh
# only there for testing clang 8-10 and binaryen discrepancy
./rebuild-upstream.sh
# fast rebuild
# ./rebuild-upstream.sh fast=1
# using asyncfy (bad perf even on upstream) avoid fast=1 when changing
# mode
# ./rebuild-upstream.sh ASYNCIFY=1
now you can navigate http://127.0.0.1:8000/index.html
to edit code samples look in micropython/*.html
copy the 4 files located in micropython folder found inside the build folder
pythons.js micropython.js micropython.data micropython.wasm
and drop them where your main let's say myupython.html file will be
now you have 3 options to run code :
-
from the web via arguments ( sys.argv ) with a call myupython.html?full_url_to_the_script.py
-
from a <script type="text/µpython> tag
-
interactively from repl with xterm.js
for 1&2 you will need to provide a javascript term_impl(text) function that output stdout stream where you want it to go
codebase https://github.com/matthewelse/micropython
Micropython webassembly target micropython/micropython#3313
Support for Emscripten micropython/micropython#2618
RFC: emscripten: Got something to compile and link. micropython/micropython#1561
Javascript Port - MicroPython transmuted into Javascript by Emscripten. micropython/micropython#3575
Emscripten
MicroPython and emscripten
https://www.bountysource.com/issues/5037165-emscripten
https://github.com/kkimdev/epsilon
Explicit exceptions : https://github.com/dpgeorge/micropython/tree/py-remove-nlr
Using requestIdleCallback : https://developers.google.com/web/updates/2015/08/using-requestidlecallback
multi core interpreters : https://github.com/ericsnowcurrently/multi-core-python/wiki
Multiplexed rpc : https://brionv.com/log/2019/05/10/wasm-rpc-thoughts/
A C api for pythons ? https://github.com/pyhandle/hpy
native code compiler ? https://github.com/windelbouwman/ppci-mirror
integrated gui https://github.com/littlevgl/lv_binding_micropython
various shared/distributed memory objects related subjects. https://github.com/apache/arrow https://capnproto.org/ http://doc.pypy.org/en/latest/stm.html#python-3-cpython-and-others
mesh network https://github.com/chr15m/bugout https://chr15m.github.io/bep44-for-decentralized-applications.html
This is a research project aimed toward a cooperative multitasking multicore/multinode python solution. Though still keeping some level of preemption over coroutines at byte code level for soft-rt purpose.
testing on browser+wasm makes it easier than baremetal.
meet me on #microPython or #micropython-fr on freenode
https://kiwi.freenode.net/?nick=upy-wasm-guest&channel=#micropython-fr