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.

Reply via email to