That is great. Just to save time, I am happy to list the existent wasm builds of the most important ones:
- gap wasm builds doc: https://github.com/gap-system/gap/tree/master/etc/emscripten - gap wasm demo: https://wangyenshu.github.io/gap-wasm/ and web sources and some instructions: https://github.com/wangyenshu/gap-wasm/tree/gh-pages - ecl wasm builds resources: https://turtleware.eu/posts/Common-Lisp-and-WebAssembly.html - flint wasm builds resources: https://github.com/flintlib/python-flint/blob/main/.github/workflows/ci-emscripten.yml As far as I know, only singular has no wasm build. On Sunday, February 22, 2026 at 10:41:15 PM UTC+8 [email protected] wrote: > As a continuation of the experiment, I tried to see what packages are > missing from emscripten-forge to satisfy all of sage's dependencies (see > https://github.com/sagemath/sage/pull/41680). Here is the result: > ``` > error libmamba Could not solve for environment specs > The following packages are incompatible > ├─ 4ti2 =* * does not exist (perhaps a typo or a missing channel); > ├─ autoconf =* * does not exist (perhaps a typo or a missing channel); > ├─ automake =* * does not exist (perhaps a typo or a missing channel); > ├─ bliss =* * does not exist (perhaps a typo or a missing channel); > ├─ c-compiler =* * does not exist (perhaps a typo or a missing > channel); > ├─ cddlib =* * does not exist (perhaps a typo or a missing channel); > ├─ cibuildwheel =* * is not installable because it requires > │ └─ bashlex =* *, which does not exist (perhaps a missing channel); > ├─ cliquer =* * does not exist (perhaps a typo or a missing channel); > ├─ cxx-compiler =* * does not exist (perhaps a typo or a missing > channel); > ├─ cypari2 >=2.2.1 * does not exist (perhaps a typo or a missing > channel); > ├─ ecl =* * does not exist (perhaps a typo or a missing channel); > ├─ eclib =* * does not exist (perhaps a typo or a missing channel); > ├─ ecm =* * does not exist (perhaps a typo or a missing channel); > ├─ fflas-ffpack =* * does not exist (perhaps a typo or a missing > channel); > ├─ fortran-compiler =* * does not exist (perhaps a typo or a missing > channel); > ├─ fpylll >=0.5.9 * does not exist (perhaps a typo or a missing > channel); > ├─ gap-defaults =* * does not exist (perhaps a typo or a missing > channel); > ├─ gfan =* * does not exist (perhaps a typo or a missing channel); > ├─ givaro =* * does not exist (perhaps a typo or a missing channel); > ├─ iml =* * does not exist (perhaps a typo or a missing channel); > ├─ ipykernel >=5.2.1 * is not installable because there are no viable > options > │ ├─ ipykernel [6.15.0|6.15.1|...|6.29.5] would require > │ │ └─ psutil =* *, which does not exist (perhaps a missing channel); > │ ├─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require > │ │ └─ __win =* *, which is missing on the system; > │ ├─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require > │ │ └─ __linux =* *, which is missing on the system; > │ └─ ipykernel [6.30.0|6.30.1|...|7.2.0] would require > │ └─ __osx =* *, which is missing on the system; > ├─ jupyter-sphinx =* * is not installable because there are no viable > options > │ ├─ jupyter-sphinx [0.3.2|0.4.0|0.5.3] would require > │ │ └─ nbconvert >=5.5 * but there are no viable options > │ │ ├─ nbconvert [6.4.5|6.5.0|...|7.9.2] would require > │ │ │ └─ nbconvert-pandoc [==6.4.5 pyhd8ed1ab_2|==6.5.0 > pyhd8ed1ab_0|...|==7.9.2 pyhd8ed1ab_0], which requires > │ │ │ └─ pandoc =* *, which does not exist (perhaps a missing > channel); > │ │ ├─ nbconvert [5.5.0|5.6.0] would require > │ │ │ └─ pandoc >=1.12.1,<3.0.0 *, which does not exist (perhaps > a missing channel); > │ │ ├─ nbconvert 5.6.1 would require > │ │ │ └─ jinja2 >=2.4,<3a0 * but there are no viable options > │ │ │ ├─ jinja2 [2.10|2.10.1|...|2.11.3] would require > │ │ │ │ └─ markupsafe >=0.23,<2 *, which does not exist > (perhaps a missing channel); > │ │ │ └─ jinja2 2.11.3 would require > │ │ │ └─ markupsafe >=0.23,<2.1 *, which does not exist > (perhaps a missing channel); > │ │ └─ nbconvert 7.0.0 would require > │ │ └─ lxml <5.2.0a0 *, which does not exist (perhaps a > missing channel); > │ ├─ jupyter-sphinx 0.5.3 would require > │ │ └─ ipykernel >=4.5.1 *, which cannot be installed (as previously > explained); > │ └─ jupyter-sphinx [0.2.4|0.3.1|0.3.2] would require > │ └─ sphinx >=2,<4 *, which requires > │ └─ docutils >=0.12,<0.17 *, which does not exist (perhaps a > missing channel); > ├─ jupyter_client =* * is not installable because there are no viable > options > │ ├─ jupyter_client [7.3.2|7.3.3|...|8.6.3] would require > │ │ └─ pyzmq >=23.0 *, which does not exist (perhaps a missing > channel); > │ ├─ jupyter_client [8.7.0|8.8.0] would require > │ │ └─ pyzmq >=25.0 *, which does not exist (perhaps a missing > channel); > │ ├─ jupyter_client [5.2.3|5.2.4|...|7.1.2] would require > │ │ └─ pyzmq >=13 *, which does not exist (perhaps a missing > channel); > │ └─ jupyter_client [7.2.0|7.2.1|7.2.2|7.3.0|7.3.1] would require > │ └─ pyzmq >=22.3 *, which does not exist (perhaps a missing > channel); > ├─ lcalc =* * does not exist (perhaps a typo or a missing channel); > ├─ libblas =* *_openblas does not exist (perhaps a typo or a missing > channel); > ├─ libbraiding =* * does not exist (perhaps a typo or a missing > channel); > ├─ libbrial =* * does not exist (perhaps a typo or a missing channel); > ├─ libflint =* * does not exist (perhaps a typo or a missing channel); > ├─ libgd =* * does not exist (perhaps a typo or a missing channel); > ├─ libhomfly =* * does not exist (perhaps a typo or a missing channel); > ├─ linbox =* * does not exist (perhaps a typo or a missing channel); > ├─ lrslib =* * does not exist (perhaps a typo or a missing channel); > ├─ m4ri =* * does not exist (perhaps a typo or a missing channel); > ├─ m4rie =* * does not exist (perhaps a typo or a missing channel); > ├─ maxima <5.48.0 * does not exist (perhaps a typo or a missing > channel); > ├─ meson-python =* * is not installable because it requires > │ └─ ninja =* *, which does not exist (perhaps a missing channel); > ├─ meson =* * is not installable because it requires > │ └─ ninja >=1.8.2 *, which does not exist (perhaps a missing > channel); > ├─ mpfi =* * does not exist (perhaps a typo or a missing channel); > ├─ nauty =* * does not exist (perhaps a typo or a missing channel); > ├─ ninja =* * does not exist (perhaps a typo or a missing channel); > ├─ ntl =* * does not exist (perhaps a typo or a missing channel); > ├─ palp =* * does not exist (perhaps a typo or a missing channel); > ├─ pari =* * does not exist (perhaps a typo or a missing channel); > ├─ pkg-config =* * does not exist (perhaps a typo or a missing > channel); > ├─ pkgconfig =* * is not installable because it requires > │ └─ pkg-config =* *, which does not exist (perhaps a missing > channel); > ├─ planarity =* * does not exist (perhaps a typo or a missing channel); > ├─ pplpy >=0.8.6 * does not exist (perhaps a typo or a missing > channel); > ├─ primecount =* * does not exist (perhaps a typo or a missing > channel); > ├─ primecountpy =* * does not exist (perhaps a typo or a missing > channel); > ├─ primesieve =* * does not exist (perhaps a typo or a missing > channel); > ├─ pycosat >=0.6.3 * does not exist (perhaps a typo or a missing > channel); > ├─ python-lrcalc [=* *|~=2.1 *] does not exist (perhaps a typo or a > missing channel); > ├─ python =3.12 * does not exist (perhaps a typo or a missing channel); > ├─ rpy2 >=3.3 * does not exist (perhaps a typo or a missing channel); > ├─ ruff =* * does not exist (perhaps a typo or a missing channel); > ├─ rw =* * does not exist (perhaps a typo or a missing channel); > ├─ singular =* * does not exist (perhaps a typo or a missing channel); > ├─ sirocco =* * does not exist (perhaps a typo or a missing channel); > ├─ sympow =* * does not exist (perhaps a typo or a missing channel); > ├─ tachyon =* * does not exist (perhaps a typo or a missing channel); > ├─ ty >=0.0.12 * does not exist (perhaps a typo or a missing channel); > └─ uv =* * does not exist (perhaps a typo or a missing channel). > ``` > > Some of them are most likely false negative (eg python, meson-python, > ninja) and a few others are no hard requirements for us (uv, ruff, jupyter > stuff, autoconf). The most important ones to attack would be gap, > ecl/maxima, flint, singular - at least a couple of them already provide > wasm builds, so adding them to emscripten-forge doesn't seem to be > impossible. If someone feels motivated to contribute those packages, I > would join the effort, definitely from the side of the sage build script > and CI. > > On Sunday, February 15, 2026 at 5:47:36 PM UTC+1 parisse wrote: > >> On Sunday, February 15, 2026 at 2:22:32 AM UTC+1 [email protected] >> wrote: >> >> I think this is because WebAssembly-built sympy uses pyodide, which is >> compiled to wasm directly, so it runs almost natively in your CPU. However, >> SageMath-in-Browser runs code in the CPU emulated by v86. I think in order >> to achieve the same performance as WebAssembly-built sympy, SageMath must >> be compiled directly to wasm using tools like emscripten >> <https://emscripten.org/index.html>. But that is far more challenging >> than the current SageMath-in-Browser approach. >> >> >> CPython can be compiled to wasm by emscripten, therefore you get an >> acceptable perfomance penalty. For example inverting a 50x50 matrix with >> integer coefficients in -99..99 takes about 3 seconds on my laptop with >> sympy live, vs about 1.3 second (native python3 interpreter) vs 0.01s >> (Giac/Xcas compiled to wasm) vs 0.004s (sage native) or 0.0012s (Giac/Xcas >> native). But sympy remains Python interpreted code and does not include >> advanced maths algorithms, so it will be slow except for small inputs. >> > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/sage-devel/5efc54f6-0e10-4985-8a6f-7f5dc7908693n%40googlegroups.com.
