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/9ffdb397-d02d-4c8f-9e1d-5e28584b1a7en%40googlegroups.com.
