Как написать свой Wine для браузера: опыт разработки на TypeScript

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

Как написать свой Wine для браузера: опыт разработки на TypeScript

Запуск старых 32-битных игр на современных компьютерах, особенно на Mac, часто превращается в настоящий квест: то не хватает библиотек, то система не поддерживает старые форматы, то эмуляторы требуют сложной настройки. Один разработчик решил эту проблему радикально — он написал собственную реализацию Windows API, которая работает прямо в браузере на TypeScript. В этой статье мы разберем, как ему удалось создать этот проект, с какими трудностями он столкнулся и почему это может изменить подход к совместимости программного обеспечения.

Свой Wine для браузера: как это работает

Автор проекта, чью статью на Habr мы анализируем, провел полгода, отлаживая чужие игры двадцатилетней давности, и в итоге создал реализацию Windows API, работающую прямо в браузере. Основная идея — не эмулировать всю систему, а перехватывать вызовы Win32 API и транслировать их в веб-технологии, такие как WebAssembly и JavaScript. Это позволяет запускать старые игры без установки дополнительного ПО, просто открыв страницу в браузере.

Проект написан на TypeScript, что обеспечивает типизацию и удобство разработки. Архитектура построена на модульной системе: каждый модуль отвечает за определенный аспект Windows API — от управления окнами до обработки графики и звука. Благодаря этому можно постепенно добавлять поддержку новых функций, не ломая уже работающие.

Ключевой компонент — трансляция вызовов. Игра, скомпилированная для Windows, обращается к функциям kernel32.dll, user32.dll и другим. Разработчик написал свои реализации этих функций, которые взаимодействуют с DOM-элементами и WebGL. Например, функция CreateWindow создает HTML-элемент с нужными стилями, а BitBlt копирует пиксели на canvas.

Предыстория и контекст

Проблема запуска старых игр на современных системах существует давно. С выходом 64-битных операционных систем многие 32-битные приложения перестали работать без специальных прослоек. Wine — популярное решение для Linux и macOS, но он требует установки и настройки. В браузере же нет необходимости в установке — все работает через интернет.

Проект автора — не первый в этой области. Существуют проекты типа emscripten, которые компилируют C/C++ код в WebAssembly, но они требуют перекомпиляции исходников. Здесь же подход другой: запуск немодифицированных бинарников Windows. Это ближе к проектам типа v86 (эмулятор x86 в браузере), но с фокусом на Windows API, а не на аппаратное обеспечение.

Интересно, что автор начал проект из личной ностальгии по игре «Harry Potter and the Philosopher’s Stone» от KnowWonder. Это подчеркивает, как личные проекты могут вырасти в нечто значимое для сообщества.

Чем отличается от существующих решений?

Wine для браузера отличается от традиционного Wine тем, что не требует установки и работает на любой платформе с современным браузером. В отличие от облачных игровых сервисов, здесь нет задержек сети, так как все вычисления происходят локально в песочнице браузера. Также это более безопасно: нет необходимости запускать непроверенный код на уровне ОС.

Однако есть и ограничения: производительность ниже, чем у нативного Wine, из-за оверхеда WebAssembly. Но для старых игр, которые не требовательны к ресурсам, этого достаточно.

Технические подробности: как устроен проект

Разработчик использовал WebAssembly для выполнения 32-битного кода игры. Для этого он написал интерпретатор x86 инструкций, который переводит их в WebAssembly на лету. Это сложная задача, но позволяет выполнять код без модификации.

Графика реализована через WebGL, что позволяет аппаратно ускорять 2D и 3D рендеринг. Звук — через Web Audio API. Ввод с клавиатуры и мыши обрабатывается через стандартные события браузера.

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

Отладка заняла полгода, потому что ошибки проявлялись неявно: игра могла вылететь из-за неправильной обработки какого-нибудь редкого вызова. Приходилось анализировать дампы памяти и логи вызовов. В итоге автор накопил обширную базу знаний о внутренностях Windows API.

Кого затронет и как

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

Для пользователей macOS и Linux это может стать альтернативой Wine, особенно когда нужно быстро запустить одну игру без установки. Для бизнеса, который поддерживает легаси-приложения, это потенциальный способ продлить жизнь старому ПО, не поддерживая отдельные виртуальные машины.

В России и СНГ эта тема тоже актуальна: многие до сих пор играют в старые игры, а пиратские копии не всегда работают на новых системах. Браузерное решение снимает проблему совместимости.

Что будет дальше

Автор планирует продолжать развивать проект, добавляя поддержку новых игр и улучшая производительность. Возможно, в будущем появится публичный сервис, где можно будет запускать игры прямо с сайта. Также вероятно, что проект привлечет внимание сообщества open source, и другие разработчики начнут вносить свой вклад.

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

Итог

Проект показывает, что даже самые сложные задачи совместимости можно решить нестандартными методами. Написание собственной реализации Windows API в браузере — это смелый шаг, который открывает новые возможности для запуска старого ПО на любых устройствах. Следить за развитием этого проекта стоит всем, кто интересуется эмуляцией, веб-технологиями и сохранением цифрового наследия.