- PVSM.RU - https://www.pvsm.ru -

Всё было предельно просто. Но те времена давно ушли.
Современный браузер эволюционировал в сложнейшую мета-систему, которая по объёму кода превосходит ядра многих ОС. Более того, браузер де-факто может работать как операционная система. И не только в Linux-виртуалке (как ChromeOS), но как реальная платформа для запуска настоящих приложений, в том числе нативных программ на C, C++, Go и Node.js.
Для доказательства этой концепции был разработан экспериментальный проект Browsix [1]. Мотивы создания Browsix и архитектура системы описаны в научной статье [2] (doi: 10.1145/3037697.3037727 [3]). Очень странно, но этот уникальный проект 2017 года ни разу не упомянут на Хабре [4].
Если в двух словах, Browsix запускает оригинальные, немодифицированные программы C, C++, Go и Node.js в браузере клиента как процессы Web Workers [5] в окружении POSIX, работающие параллельно друг с другом и с основным браузерным потоком, который рендерит страницы.

Browsix перехватывает системные вызовы и обеспечивает программам доступ к стандартным сервисам ОС, таким как общая файловая система и процессы. Есть также ограниченная поддержка синхронного I/O и сокетов TCP/IP.
В отличие от интерпретаторов типа Cygwin [6], сам Browsix не выполняет интерпретацию кода. Он предоставляет общее ядро и примитивы вроде системных вызовов для существующих интерпретаторов и режимов выполнения, ориентированных на JavaScript.
Основные модули Browsix написаны на TypeScript (первые три строки в таблице).
| Компонент | Строк кода |
|---|---|
| Ядро | 2249 |
| Модификации BrowserFS | 1231 |
| Общий модуль syscall | 421 |
| Интеграция с Emscripten (поддержка С/С++) | 1557 |
| Интеграция с GopherJS (поддержка Go) | 926 |
| Интеграция с Node.js | 1742 |
| Всего | 8126 |
Например, разработчики расширили компиляторы GopherJS [7] и Emscripten, чтобы они могли работать с их общим ядром, так что процессы, написанные на C и Go, могут работать параллельно (в отдельных веб-воркерах) и взаимодействовать через каналы, сокеты и файловую систему в браузере (как в стандартной среде Unix).
В современной концепции разработки интерактивные веб-приложения обычно разделяются на серверную и клиентскую части:
Browsix позволяет всё выполнять в браузере у клиента, без традиционного бэкенда. Теоретически — такой цельный подход без разделения приложения на две части способен упростить веб-разработку и сократить издержки на поддержку бэкенда.
Вместо того чтобы поддерживать серверную часть приложения из существующих Unix-программ, разработчик просто переносит их в браузер клиента. Кроме всего прочего, это устраняет целый класс проблем безопасности (программы явно будут иметь доступ только к данным текущего пользователя на вкладке браузера) и масштабирования.
Посмотрим на примеры приложений, которые работают внутри Browsix.

Исходный код [9]

(скриншот с офсайта)
Сейчас редактор запускается не во всех браузерах (у нас не загрузилось в Firefox Nightly 105.0a1 и Chrome 104.0.5112.81). Но по старым скриншотам видно, что его функциональность сравнима с коммерческими веб-редакторов LaTeX, таких как Overleaf [13]:

Overleaf
Теоретически, в Browsix можно загрузить любую программу. Хотя разработчики давно не обновляли движок и он сейчас немного глючит. Но это эксперимент, который демонстрирует, что запуск произвольных бинарников в принципе возможен.
Терминал Browsix — не единственная реализация консоли Unix в браузере. Из известных разработок вспоминается утилита GoTTY [14], которая отправляет выдачу консоли в браузер клиента:

А если объединить этот инструмент с эмулятором операционной системы в браузере, то получается нечто такое [15].
JavaScript позволяет реализовать в браузере вполне правдоподобное десктопное окружение. Это отличная демонстрация современных веб-технологий. Хотя понятно, что JS работает на порядок медленнее, чем любой нативный код.
Среди таких любительских проектов — DaedalOS [16], написанный одним программистом в течение года [17], см. исходный код [18].
Если развернуть на весь экран и пощёлкать по иконкам, то создаётся смутное впечатление обычного десктопа Windows, только на очень старом железе (из-за больших лагов). А так тут есть меню «Пуск», папки, рабочий софт, игры.

Ещё один похожий проект — Puter [19], тоже сделанный за год [20] одним человеком. Только здесь GUI рабочего стола больше напоминает macOS или Linux, и кажется немного симпатичнее. Создаётся ощущение, что здесь лаги поменьше. Например, изменение размера окон и перемещение их по экрану вообще не тормозит. Правда, встроенный набор приложений гораздо более скудный. Ни игр, ни другого софта, только консоль.

В отличие от разработчиков консоли Browsix, здесь автор реально принимает баги, извиняется [21] и исправляет ошибки. Десктоп нормально работает во всех основных браузерах последних версий.
Примеры создания полноценных десктопных окружений внутри браузера демонстрируют в том числе невероятную сложность современного браузера. То есть браузер — это альтернативная (универсальная) платформа для разработки приложений. Там можно реализовать все функции нативных программ Linux, Windows или macOS.
В принципе, в браузере можно запустить эмулятор конкретной операционной системы — и уже в нём запускать все нативные программы, в том числе другие браузеры, а в них другие операционные системы и так далее. Как шутят на реддите, главное — не гуглить Google, запустив браузер внутри браузера, и не вешать чужие терминалы командой rm -rf /.
Ещё в далёком 2012 году JSLinux [22] от Фабриса Беллара стал первым эмулятором, способным загружать в браузер произвольные операционные системы. Он изначально поддерживал следующие ОС:
| CPU | ОС | Интерфейс | Доступ к VFsync [23] | Ссылка на загрузку | Конфигурация TEMU [24] | Комментарий автора |
|---|---|---|---|---|---|---|
| x86 | Alpine Linux 3.12.0 | Консоль | Да | нажмите здесь [25] | url [26] | |
| x86 | Alpine Linux 3.12.0 | X Window | Да | нажмите здесь [27] | url [28] | Правая кнопка мыши вызывает меню. |
| x86 | Windows 2000 | Graphical | Нет | нажмите здесь [29] | url [30] | Дисклеймер о снятии ответственности [31] |
| x86 | FreeDOS | Текстовый VGA | Нет | нажмите здесь [32] | url [33] | |
| riscv64 | Buildroot (Linux) | Консоль | Да | нажмите здесь [34] | url [35] | |
| riscv64 | Buildroot (Linux) | X Window | Да | нажмите здесь [36] | url [37] | Правая кнопка мыши вызывает меню. |
| riscv64 | Fedora 33 (Linux) | Консоль | Да | нажмите здесь [38] | url [39] | Предупреждение: долгое время загрузки. |
| riscv64 | Fedora 33 (Linux) | X Window | Да | нажмите здесь [40] | url [41] | Предупреждение: долгое время загрузки. Правая кнопка мыши вызывает меню. |
Более современная версия этого эмулятора — виртуальный x86 [42], на который можно загрузить 25 разных операционных систем, включая Arch Linux [43] и Damn Small Linux [44]. Всё это работает чисто в браузере.
Для удалённого управления другим компьютером тоже не требуется ничего, кроме браузера — см. Apache Guacamole [45], который поддерживает все стандартные протоколы типа VNC, RDP и SSH.
В принципе, через Guacamole можно управлять «настольными компьютерами», которые физически даже не существуют, а живут в облаке или в контейнере на каком-нибудь , то есть виртуальными системами.
Кстати, из этой невероятной функциональности современного браузерного движка следует вывод, что разработать с нуля ещё одну махину, сравнимую с Chromium, очень трудно. И если исчезнет единственный на платформе x86 альтернативный движок Gecko [48] (Firefox, FirefoxOS), то уже никто не сможет составить ему конкуренцию.
Ну а по сути современный браузер — уже сам по себе операционная система. Программы любой сложности при желании можно переписать на WebAssembly, asm.js или скомпилировать в JavaScript — и они будут работать в браузере.
Автор: Анатолий Ализар
Источник [49]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/virtualizatsiya/378182
Ссылки в тексте:
[1] Browsix: https://github.com/plasma-umass/browsix
[2] научной статье: https://browsix.org/powers2017-browsix.pdf
[3] 10.1145/3037697.3037727: https://dl.acm.org/doi/10.1145/3037697.3037727
[4] ни разу не упомянут на Хабре: https://www.google.com/search?q=browsix+site%3Ahabr.com
[5] Web Workers: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
[6] Cygwin: https://www.cygwin.com/
[7] GopherJS: https://github.com/bpowers/browsix-gopherjs
[8] Терминал: https://unix.bpowers.net/
[9] Исходный код: https://github.com/plasma-umass/browsix/tree/master/app/elements/browsix-terminal
[10] Редактор LaTeX: https://browsix.org/latex-demo-sync/
[11] TeX Live: https://www.tug.org/texlive/
[12] исходный код приложения: https://github.com/plasma-umass/browsix/tree/master/examples/latex-editor
[13] Overleaf: https://www.overleaf.com/
[14] GoTTY: https://github.com/yudai/gotty
[15] нечто такое: https://rkeene.dev/js-repl/?arg=bash
[16] DaedalOS: https://dustinbrett.com/
[17] одним программистом в течение года: https://news.ycombinator.com/item?id=29783914
[18] исходный код: https://github.com/DustinBrett/daedalOS
[19] Puter: https://puter.com/
[20] за год: https://www.reddit.com/r/programming/comments/v45rb6/i_spent_a_year_building_a_desktop_environment/
[21] извиняется: https://www.reddit.com/r/programming/comments/v45rb6/comment/ib6q5xr/
[22] JSLinux: https://bellard.org/jslinux/
[23] VFsync: https://vfsync.org
[24] TEMU: https://bellard.org/tinyemu
[25] нажмите здесь: http://vm.html?url=alpine-x86.cfg&mem=192
[26] url: http://alpine-x86.cfg
[27] нажмите здесь: http://vm.html?url=alpine-x86-xwin.cfg&mem=256&graphic=1
[28] url: http://alpine-x86-xwin.cfg
[29] нажмите здесь: http://vm.html?url=win2k.cfg&mem=192&graphic=1&w=1024&h=768
[30] url: http://win2k.cfg
[31] Дисклеймер о снятии ответственности: http://disclaimer.html
[32] нажмите здесь: http://vm.html?url=freedos.cfg&mem=64&graphic=1&w=720&h=400
[33] url: http://freedos.cfg
[34] нажмите здесь: http://vm.html?cpu=riscv64&url=buildroot-riscv64.cfg&mem=256
[35] url: http://buildroot-riscv64.cfg
[36] нажмите здесь: http://vm.html?cpu=riscv64&url=buildroot-riscv64-xwin.cfg&graphic=1&mem=256
[37] url: http://buildroot-riscv64-xwin.cfg
[38] нажмите здесь: http://vm.html?cpu=riscv64&url=fedora33-riscv.cfg&mem=256
[39] url: http://fedora33-riscv.cfg
[40] нажмите здесь: http://vm.html?cpu=riscv64&url=fedora33-riscv-xwin.cfg&graphic=1&mem=256
[41] url: http://fedora33-riscv-xwin.cfg
[42] виртуальный x86: https://copy.sh/v86/
[43] Arch Linux: https://copy.sh/v86/?profile=archlinux
[44] Damn Small Linux: https://copy.sh/v86/?profile=dsl
[45] Apache Guacamole: https://guacamole.apache.org/
[46] Видео с демонстрацией: https://player.vimeo.com/video/116207678
[47] хостинге: https://www.reg.ru/?rlink=reflink-717
[48] Gecko: https://developer.mozilla.org/en-US/docs/Glossary/Gecko
[49] Источник: https://habr.com/ru/post/682782/?utm_source=habrahabr&utm_medium=rss&utm_campaign=682782
Нажмите здесь для печати.