LINUX.ORG.RU
ФорумTalks

Дистрибутив с пакетным менеджером WAPM

 


0

2

Предлагаю сделать. Всё компилировать в WASM,
многопоточность пострадает, но на что не пойдёшь ради великой цели.
Программы, скомпилированные в WASM, теоретически могут работать на любой платформе (x86, ARM, RISC-V) и любой ОС без перекомпиляции.

Wasmer — это специально спроектированный «универсальный рантайм» для WebAssembly, который работает на Windows, Linux и macOS
Wasmer может компилировать WASM-пакет в нативный исполняемый файл для ОС (wasmer create-exe my_package), Slint + Wasmer + winit = десктопное WASM-приложение без браузера.

wapm — это полноценный менеджер пакетов для WebAssembly от компании Wasmer

ecmaOS: операционная среда (ОС), работающая в браузере, но ключевой момент — ее нативным форматом бинарных файлов является WebAssembly

WASM (в его стандартной модели) не имеет доступа к системным вызовам ОС напрямую.
Все взаимодействие идет через специальный «интерфейс» — WASI (WebAssembly System Interface). wasi-2d для 2D-графики (экспериментально)
wasi-webgpu для 3D-ускорения (proposal)
существует WASI window proposal.

linux-wasm: linux-wasm пытается сделать ядро Linux, которое нативно запускает WASM.
Добавляет в ядро Linux поддержку архитектуры WebAssembly и позволяет запускать .wasm-файлы как обычные исполняемые.
WASI уже умеет wasi-input — ввод через клавиатуру и мышь. Полноценная реализация всех возможностей POSIX (fork, exec, pipes и т.д.) — это колоссальный объем работы. Проект linux-wasm — как раз попытка решить эту проблему на уровне ядра.
Инструменты сборки (например, wasi-libc) развиваются, но они пока не обеспечивают 100% совместимости со всем софтом, написанным на C/C++.

в классическом WASM (WASI Preview 1) поддержка многопоточности очень ограничена или отсутствует.
Это архитектурная проблема, над которой работают, но она не решена полностью.
В ближайшем будущем нас ждут кооперативные потоки (WASIp3),
В LLVM добавляются инструкции для переключения между виртуальными стеками (stack switching).
в долгосрочной перспективе — настоящая многопоточность через shared-everything-threads, она требует изменений в ядре рантайма и, вероятно, будет готова не раньше, чем через несколько лет.

Реализация всего этого не требуется, оно само. Главное быть морально готовым.


Больше абстракций, больше слоёв!

А можно будет в wasm приложение на электрон упаковать?

skyman ★★★★★
()
Ответ на: комментарий от madcore

Node.js — это не WASM это среда выполнения JavaScript (и только JS), построенная на движке V8.
Движок V8 написан на C++. Это означает, что он труп и будет заменён на Rust.
WASM может выполняться внутри Node.js (через WebAssembly API), но
это не делает их одной технологией.


WASM — это низкоуровневый «виртуальный процессор» второго (после Java) поколения.
1995, Java Virtual Machine — стековая машина, интерпретирующая байт-код.
2017, WebAssembly — виртуальный RISC-подобный процессор с линейной памятью (heap) и стеком для структур управления (блоки, циклы).

у WASM нет прямого доступа к ОС, памяти хоста, регистрам CPU. Это песочница. Каждый инстанс модуля полностью изолирован (своя память, свои таблицы). Модуль видит только свой буфер (несколько страниц по 64 КБ). Адреса в нём — это смещения внутри буфера, не настоящие указатели ОС. Прыжки внутри модуля — только по таблице функций (indirect call), нет вычисляемых адресов перехода как в реальном ассемблере. Это предотвращает ROP-атаки. Нельзя открыть сокет, файл, создать поток ОС (без импортированных хостовых функций). модуль может общаться с внешним миром ТОЛЬКО через функции переданные через JS import.

атомики и разделяемая память есть в proposal

Отказались от объектной модели ради максимальной близости к реальному CPU, инструкции работают с локальными переменными и стеком значений. Начальный запуск быстрее, чем JVM (минимальный рантайм — десятки КБ). LLVM-бэкенд компилирует многие языки в WASM. Загрузка и компиляция «just-in-time» до уровня нативного кода тоже есть, как и в Java.


Haskell — это квинтэссенция академической строгости, чистоты и математической красоты.
Но ещё это один из языков со сборкой мусора, как lisp и другие популярные языки.

GHCJS компилирует в JavaScript

ghc-wasm-meta (и ранее asterius, ныне интегрирован в GHC) позволяет компилировать Haskell-код напрямую в .wasm-модули

конкурентный код с легковесными потоками (async) и программной транзакционной памятью (STM) удобно писать в Haskell
библиотеки reflex или Miso, уже позволяют создавать фронтенд-приложения на Haskell
     https://reflex-frp.org/
wasm-opt и техники агрессивной оптимизации удаление ненужных частей рантайма позволяют оптимизировать размер.


Таким образом, идеальная технология - это GC на Rust + Haskell, скомпилированные в WASM

Saakx
() автор топика
Последнее исправление: Saakx (всего исправлений: 1)
Ответ на: комментарий от Saakx

это не делает их одной технологией.

да?
т.е., у тебя уже есть реализация wasm-машины, но без блекджека и дамского общества?

madcore ★★★★★
()

Всё компилировать в WASM,

многопоточность пострадает

Почему?

pikabu
()
Ответ на: комментарий от madcore

== wasmer create-exe ==

Команда выполняет несколько этапов:

  • AOT-компиляция WASM → объектный файл;
  • Создаёт программу на C wasmer_main.c
  • линкует.

Даже после AOT-компиляции в машинный код, .wasm модуль не может работать сам по себе — ему нужен рантайм для управления памятью, системными вызовами (WASI) и безопасностью.

Программа на Си:

  • Инициализирует движок Wasmer;
  • Вызывает точку входа программы.

Движок:

  • Настраивает окружение WASI (файловая система, аргументы);
  • Выделяет память для WASM-модуля;
  • При системных вызовах перенаправляет их в ОС.

Были некоторые грабли, но это мелочи.

  1. В Wasmer 7.1.0 команда create-exe отключена разработчиками (закомментирована в коде).

  2. Нашёл точный коммит, где команду отключили,
    02a831e9c06 («feature: disable crate-exe and create-obj subcommands»).
    После этого я откатился на версию v6.1.0.

  3. Понял, что проблема была в привязке к бэкенду Cranelift

    Полностью исключил бэкенд Cranelift из сборки.

    • В файле lib/cli/src/backend.rs изменил порядок бэкендов в функции enabled(), поставив Self::LLVM первым.
    • Затем я зачистил все Cargo.toml (lib/cli, lib/api, lib/c-api), убрав зависимости wasmer-compiler-cranelift и убрав упоминания cranelift из секций features и default.
  4. Пересобрал статическую библиотеку libwasmer-headless.a для своего окружения. В lib/c-api/build.rs я добавил в функцию main() строки для принудительной линковки с системными библиотеками:

    println!("cargo:rustc-link-lib=stdc++");
    println!("cargo:rustc-link-lib=z");
    println!("cargo:rustc-link-lib=zstd");
    println!("cargo:rustc-link-lib=ffi");
    println!("cargo:rustc-link-lib=tinfo");
    

    После этого я пересобрал wasmer-c-api с нужным набором фич:

    cargo build --release -p wasmer-c-api \
        --no-default-features \
        --features "llvm,singlepass,wasmparser,wasi,static-artifact-load,wasmer-artifact-load"
    
  5. Исправил ошибки линковки. Ключевым моментом было исправление в lib/cli/src/commands/create_exe.rs. В функции link_objects_system_linker изменил линковщик с cc на c++. Это решило все проблемы с неразрешёнными символами C++ из библиотек LLVM.

  6. После всех исправлений я собрал wasmer-cli и создал бинарник, явно указав все необходимые библиотеки:

     wasmer create-exe hello.wasm -o hello_bin \
        --library-path ~/.wasmer/lib/libwasmer-headless.a \
        --libraries stdc++ z zstd ffi tinfo \
        --use-system-linker
    

    В результате получил полностью автономный исполняемый файл
    hello_bin, который работает без установленного Wasmer
    (т.е. может автономно и быстро запускаться в докере).

Ещё бывает:

  • утилита Wasmtime (требует линковки с libwasmtime.so)
  • WAMR даёт маленький бинарник, но имеет ограниченную поддержку WASI

(их использование оставляется читателю в качестве упражнения)

ВЫВОД: существование wasmer create-exe в версии 6.1.0 доказывает, что получить единый нативный бинарник из WebAssembly можно.

$ du -h hello_bin 
187M	hello_bin

А раз результат единый и нативный,
node.js не нужна.

Saakx
() автор топика
Последнее исправление: Saakx (всего исправлений: 8)

Мне приходила в голову идея пакетов, подготавливаемых в промежуточное представление Clang/LLVM, а доделывать уже на целевой платформе. А тут вон оно как.

Psilocybe ★★★★★
()
Ответ на: комментарий от Saakx

Почему бы не написать дистрибутив на node.js? Это гораздо перспективнее, тогда можно будет запускать не только на любой платформе, но и просто в браузере!

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Почему бы не написать дистрибутив на node.js?

@@@@@@@@   @@@@@@@  @@@@@@@@@@    @@@@@@    @@@@@@    @@@@@@   
@@@@@@@@  @@@@@@@@  @@@@@@@@@@@  @@@@@@@@  @@@@@@@@  @@@@@@@   
@@!       !@@       @@! @@! @@!  @@!  @@@  @@!  @@@  !@@       
!@!       !@!       !@! !@! !@!  !@!  @!@  !@!  @!@  !@!       
@!!!:!    !@!       @!! !!@ @!@  @!@!@!@!  @!@  !@!  !!@@!!    
!!!!!:    !!!       !@!   ! !@!  !!!@!!!!  !@!  !!!   !!@!!!   
!!:       :!!       !!:     !!:  !!:  !!!  !!:  !!!       !:!  
:!:       :!:       :!:     :!:  :!:  !:!  :!:  !:!      !:!   
 :: ::::   ::: :::  :::     ::   ::   :::  ::::: ::  :::: ::   
: :: ::    :: :: :   :      :     :   : :   : :  :   :: : :    
                                                               
🐉  EXPERIMENTAL 🐉
@ecmaos/kernel@0.11.0 [@xterm/xterm@6.0.0, @zenfs/core@2.4.4]
Made with ❤️  by Jay Mathis <code@mathis.network>
https://github.com/ecmaos/ecmaos

Known Issues
- To disable known issues, type `touch /etc/noissues`
- It's best to stick to Chromium-based browsers for the most features
- Keyboard is broken on mobile; ecmaOS is not mobile-friendly at this time
- Don't expect any sort of POSIX compliance at this stage
- Most commands/devices are very basic implementations, not complete reproductions
- CTRL-C will return you to a prompt, but doesn't currently interrupt a process
- Lots of unfinished work; watch your step

Tips
- To disable tips, type `touch /etc/notips`
- ecmaos.sh has no backend server; all data is stored and processed entirely in your browser
- If it ever fails to boot, check your logs, try clearing all data, try incognito mode, or try another browser
- You can switch between TTYs using CTRL+SHIFT+<0-9>
- You can change the terminal theme with the `theme` command
- You can run some devices that offer a CLI - e.g. '/dev/battery --help'
- Use the 'install' command to install packages - e.g. 'install @ecmaos-apps/news'
- You can install any NPM package - e.g. 'install jquery'
- You can use the 'mount' command to view and mount filesystems (/etc/fstab supported)
- Use the 'news' command to see the latest news about ecmaOS
- Type 'ls /bin' to see all built-in commands
- Type 'ls /usr/bin' to see all installed commands
- Type 'ls /dev' to see all available devices
- You can set your environment variables in ~/.env (try setting PROMPT to a PS1-like format)
- You can register and login with a passkey: 'passkey register' and 'passkey list'
- The 'man' command can be used to view the manual pages for packages: 'man @ecmaos/kernel'
- Try 'fetch /xkcd-os.sixel'

🗓️  06/05/2026, 07:04:25 AM
🔒  http://localhost:30443
👤  Username: root
🔑  Password: 
root:/# uptime
 07:07:38 up 3 minutes, 14 seconds
root:/# install my-ecmaos-app --registry http://localhost:4873
Installing my-ecmaos-app v1.0.0 from http://localhost:4873...
Installed my-ecmaos-app v1.0.0 to /usr/lib/my-ecmaos-app/1.0.0
Linked my-ecmaos-app to /usr/bin/my-ecmaos-app
root:/# ls /usr/lib/my-ecmaos-app/1.0.0
Name          Size    Modified             Mode        Owner      Info              
hello.wasm    1.67 M  2026-06-05 04:47:02  -rw-r--r--  root:root  WebAssembly Module
package.json  318     2026-06-05 04:47:02  -rw-r--r--  root:root  JSON Data         
root:/# chmod +x /usr/lib/my-ecmaos-app/1.0.0/hello.wasm
root:/# /usr/lib/my-ecmaos-app/1.0.0/hello.wasm
Привет, WebAssembly!
Работает через GHC 9.14.1
Haskell → WASM → Verdaccio → ecmaOS → 🚀
root:/# 

Verdaccio - локальный npm-реестр, тоже работает.

Тут такое дело, WAPM/Wasmer сами по себе не предназначены для работы внутри WASM-песочницы.

WAPM — это клиент к облачному сервису. wapm install обращается к удалённому API для разрешения имён пакетов, скачивания метаданных и получения URL для загрузки. Клиент должен выполнять HTTPS-запросы к registry.wapm.io.

Браузер при помощи технологии CORS (Cross-Origin Resource Sharing) блокирует запросы к https://registry.wapm.io из скрипта, загруженного с http://localhost:30443.

registry.wapm.io больше не работает
Cloudflare: Ошибка 522 Connection timed out
(переехал на https://wasmer.io/search)

Использовать WAPM просто скомпилировав не получается, но можно доработать!
install сейчас работает линейно. Для подхода похожего на Portage нужна поддержка Slot’ов (установка нескольких версий пакета одновременно), USE-флагов (тонкая настройка функционала пакета) и разрешение конфликтов зависимостей.
Это звучит как вполне достижимая цель.

@dataman судя по твоему смайлику клоуна, ты не согласен с чем-то из написанного.

Saakx
() автор топика
Последнее исправление: Saakx (всего исправлений: 2)

Тебе будет тяжело (если вообще возможно) сделать полностью дистр на WAPM. Это всё-таки не системный пакетный менеджер. Правильнее будет использовать Nix/Guix для сборки системы, а внутри WAPM для сборки WASM пакетов. Идея кстати совершенно правильная.

yvv1
()
Ответ на: комментарий от yvv1

Тебе будет тяжело (если вообще возможно) сделать полностью дистр на WAPM.

Это какое-то психологическое давление без предъявления аргументов почему тяжело.

Это всё-таки не системный пакетный менеджер

Он способен запускаться первым процессом в Docker, а этого уже достаточно для счастья.

для сборки системы, а внутри WAPM для сборки WASM пакетов.

Все языки программирования компилируются в WASM.

WASM — это не «байт-код Java 1995 года». Это полноценная целевая платформа LLVM. Rust, C/C++, Go, Zig, Haskell, OCaml, Swift, C#, Kotlin/Native — всё это уже компилируется в WASM.

Дистрибутив, где всё компилируется в WASM - это перспективно для облачных/edge-окружений

Запуск первым процессом в Docker доказывает, что WAPM-пакет может быть корнем иерархии процессов. Docker не требует systemd, glibc, /bin/bash — только ENTRYPOINT.

WASI Preview 2 (стабилен с 2024 года) уже даёт:

  • Файловый ввод-вывод (open, read, write, seek)
  • Сокеты (TCP, UDP)
  • Переменные окружения
  • Аргументы командной строки
  • Часы/timers

Это почти всё, что нужно для системы инициализации.

fork() и exec() в WASI Preview 2 — нет

Невозможно запустить systemd или runit (им нужен fork())

WASI не даёт io_uring, epoll, ptrace, perf_event_open.

Это мешает запускать реальные серверные базы данных или отладчики.

Правильнее будет использовать Nix/Guix

Нет. Nix это не правильно, правильно это Haskell.

Nix — это не «функциональный пакетный менеджер», это языковое гетто, это vendor lock-in по языку программирования.

Guix — использует Guile Scheme (ещё один странный язык). Не лучше.

Haskell вместо Nix — это инженерное решение, стандартный синтаксис, известный миллионам программистов.
Экосистема - Hackage, Stackage, тысячи библиотек
Тестирование в HUnit, QuickCheck, Tasty
любой парсинг конфигов - Megaparsec, Happy, Alex, aeson для JSON, cassava для CSV
Haskell как DSL для описания пакетов - это «декларативно и воспроизводимо»

Это уже делали
NixOS Haskell rewrite — в 2010-х была идея переписать Nix на Haskell

Идея кстати совершенно правильная.

Какая из идей?

Моя идея лучше. Я не просто Haskell предлагаю, а Haskell поверх Rust.

Saakx
() автор топика
Последнее исправление: Saakx (всего исправлений: 4)
Ответ на: комментарий от Saakx

WAPM это WASM специфичный пакетный менеджер. Это не сборщик системы, как Nix. Для того чтобы собрать ОС на WAPM, тебе нужно переизобрести Nix. А он уже есть. И даже форк в виде Guix есть. Хочешь ещё один форк на хаскеле, или что там ещё модного есть, флаг в руки. Информируй, как идут дела.

yvv1
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)