В Leaning Technologies создали виртуальную бессерверную среду Linux, которая запускает немодифицированные двоичные файлы Debian в браузере. Подробностями делимся к старту курса по Fullstack-разработке на Python.


Веб находится на пути к тому, чтобы стать доминирующей платформой распространения приложений. Хотя эта тенденция очевидна уже давно, она ускорилась после стандартизации WebAssembly — это новый язык программирования, поддерживаемый всеми современными браузерами и предназначенный для ускорения крупномасштабных веб-приложений. WebAssembly вносит инновации в мир браузеров, а также меняет перспективы и обязательства.

Традиционно ожидается, что движки будут выжимать производительность из плохо написанного людьми JavaScript. Но WebAssembly разработан как цель компиляции. За достижение высокого уровня производительности во время выполнения отвечает в основном компилятор. 

При выполнении WebAssembly движки могут избегать дорогостоящих проверок и быстро генерировать нативный код высокого качества. В конечном счёте это позволяет доставлять через Web гораздо более сложные приложения.

Хотя подавляющее большинство генерирующих WebAssembly инструментальных цепочек нативные и используют компиляцию перед выполнением, это не обязательно. Мы считаем, что JIT-компилированный WebAssembly — это ключ к реализации концепции запуска любого приложения в браузере.

Миссия Leaning Technologies заключается в обеспечении работы существующих приложений без модификаций и перекомпиляции, полностью на стороне клиента.

Несколько месяцев назад мы выпустили демонстрацию REPL и доказали, что наша технология виртуализации CheerpX x86-to-WebAssembly может использоваться для запуска нескольких различных REPL в браузере без посредничества конкретного языка.

Сегодня мы с гордостью объявляем о важном шаге на пути к реализации нашего ви́дения — это WebVM, полноценная виртуальная машина с Debian на базе CheerpX, работающая в браузере.

Подробности о CheerpX

CheerpX — это виртуальная машина x86, написанная на C++ и с помощью компилятора Cheerp скомпилированная в комбинацию JavaScript и WebAssembly.

Разработка CheerpX велась более трёх лет, и она уже используется в производственной среде как часть CheerpX for Flash — корпоративного решения для запуска устаревшего контента Adobe Flash. CheerpX — это:

  • эффективный интерпретатор для x86, используемый для запуска редко выполняемого кода и обнаружения структуры горячего кода с целью управления JIT-компиляцией;

  • сложный JIT-компилятор x86-to-Wasm, который из горячего x86-кода на лету генерирует новые модули WebAssembly. Хотя JIT-компилятор имеет некоторую специализированную для x86 логику, он в основном не зависит от цели;

  • слой эмуляции системных вызовов Linux, который используется для преодоления разрыва между немодифицированными двоичными файлами x86 и веб-окружением;

  • бэкенд блочной файловой системы на базе Ext2. Образы дисков — это статические ресурсы, распространяемые по HTTP и CloudFlare CDN. Ext2 выбрана за проверенный дизайн и расширяемость, и со временем можно легко расширить возможности для совместимости с более современными форматами Ext3 и Ext4, не переписывая весь код;

  • сохраняющий конфиденциальность метод хранения изменённых блоков на основе IndexedDB. Эта используемая только на стороне клиента технология позволяет сохранять любые изменения в файловой системе, но только в браузере. Иными словами, мы не видим и не храним ваши данные.

CheerpX — это очень сложная система с множеством движущихся частей. Она корректно работает с такими сложными ситуациями, как самомодифицирующийся код, многопоточность, многопроцессорность и межпроцессное взаимодействие. Несмотря на сложность, CheerpX уже достигла высокого уровня стабильности. И сейчас самое время выпустить самую сложную демоверсию — WebVM.

Что же такое WebVM?

Если вы видели нашу предыдущую демонстрацию REPL, то могли заметить, что концептуально WebVM не сильно отличается от неё. Используются те же основные компоненты:

  • CheerpX — механизм выполнения API JavaScript, в частности, cx.run (...) используется для запуска и перезапуска процесса bash. По мере набора команд пользователем bash может запускать другие процессы.

  • Xterm.js — основной компонент пользовательского интерфейса. Он заботится об интерпретации терминальных символов экранирования, используемых такими приложениями, как vim, а также отправляет пользовательский ввод в CheerpX. Входные данные предоставляются приложениям через их стандартный дескриптор входного файла.

  • Образ диска Debian buster в формате ext2 и с множеством установленных пакетов. Для максимальной масштабируемости этот образ поставляется через CDN.

WebVM фактически бессерверная, она не имеет активного компонента на стороне сервера. Все пользователи получают доступ к одному и тому же образу диска из CDN, при этом их индивидуальные изменения сохраняются в браузере, локально. Это означает, что с минимальными затратами можно поддерживать даже миллионы пользователей одновременно.

Предыдущие демонстрации задуманы как моментальные снимки прогресса CheerpX, то есть демонстрации потенциала технологии. WebVM отличается тем, что она рассматривается как интерактивная демонстрация, которую мы будем развивать. Также мы приветствуем отзывы и сообщения об ошибках:

До сих пор CheerpX подвергалась воздействию пользователей только относительно контролируемым образом: это было единственное применение за один раз. WebVM впервые предоставляет контроль широкой публике, и мы ожидаем, что возникнут проблемы. Но отзывы сообщества позволят обнаружить гораздо больше ошибок и, в конечном итоге, создать более надёжное решение.

Что я могу сделать с помощью WebVM прямо сейчас?

Мы полагаем, что демо, скорее всего, будет говорить само за себя. Если вы не уверены, попробуйте эти команды:

# Run a short python program
python3 examples/python3/fibonacci.py
# Compile a small C example using gcc
gcc -o helloworld examples/c/helloworld.c
# Run it!
./helloworld
# Dump the code, to verify this is actually an x86 binary
objdump -d ./helloworld
# Edit the helloworld.c file, and try again
vim examples/c/helloworld.c

Файлы примеров на различных языках расположены в каталоге examples. Если вам не нравится gcc, свободно пробуйте clang!

Где можно запустить WebVM

WebVM и CheerpX совместимы с любыми браузерами, как настольными (Chrome/Chromium, Edge, Firefox, Safari), так и мобильными (Chrome, Safari), при условии поддержки SAB и достаточного объёма памяти на устройстве.

Это всё?

Этот релиз WebVM на самом деле только первый шаг. Мы планируем развивать WebVM, и отзывы пользователей будут направлять наши усилия. В краткосрочной перспективе конвейер следующих функций WebVM и CheerpX выглядит так:

  • HTTP-серверы (микросервисы). Объединив сервис-воркеров с виртуализированными TCP-сокетами, мы позволим HTTP-серверам внутри WebVM быть доступными прямо из браузера. Будет открыт JavaScript API, позволяющий подключать iframe к внутренним серверам. В основном эта функция уже поддерживается, хотя и не отображается на текущей демонстрационной странице. Поскольку сервис-воркеры также обрабатывают запросы fetch/XHR, аналогичное решение можно использовать для поддержки микросервисов REST.

  • Графические приложения Linux. CheerpX скоро позволит запускать в WebVM приложения Xorg. Xorg взаимодействует с X-клиентами через UNIX-сокеты, которые уже поддерживаются. Для реального отображения графики нам потребуется эмулировать устройство Linux, с которым Xorg сможет общаться. Лучшим решением представляется использование устройств KMS. Достижение базового уровня поддержки для работы графического вывода в основном сводится к выделению фреймбуфера, который сможет использовать Xorg, и его передаче в canvas HTML5 для отображения.

  • Приложения и игры Windows. Использование WINE, то есть бинарно-совместимой реализации библиотек Windows API. Аналогично Xorg WINE использует сокеты UNIX для координации приложений с wineserver, который в целом эквивалентен ядру Windows. Что касается поддержки CheerpX, возможно, поскольку WINE требует тщательного контроля над адресным пространством процесса, потребуется некоторая тонкая настройка нашей реализации mmap. Также могут потребовать доработки некоторые специализированные возможности сокетов UNIX, например передача дескрипторов файлов. Тем не менее всё это будут небольшие улучшения существующей инфраструктуры.

Свободно экспериментируйте и сообщайте об ошибках.

Источник

А продолжить погружение в IT вы сможете на наших курсах:

Узнайте подробности здесь.

Другие профессии и курсы