Servo: браузерный движок, который переписали правильно
Вы когда-нибудь задумывались, почему современные браузеры так прожорливы к ресурсам? Открываешь десяток вкладок — и вот уже вентиляторы ноутбука взлетают, как на космодроме. А всё потому, что большинство браузерных движков проектировались ещё в те времена, когда многоядерные процессоры были экзотикой. Добавлять параллелизм в унаследованный код — это как достраивать этажи к старому зданию: можно, но это явно не лучшее решение.
А теперь представьте: что если взять и написать браузерный движок заново? Сразу с расчётом на параллелизм, на безопасность памяти, на современные реалии железа? Именно так родился Servo — проект, который Mozilla запустила как исследовательскую площадку для радикальных идей. И в качестве инструмента выбрали Rust — язык, который обещал решить главные боли системного программирования.
Rust и браузеры: странная, но логичная пара
Когда Mozilla начинала этот проект, Rust ещё толком не существовал. Точнее, язык и движок развивались параллельно, подпитывая друг друга. Нужна была безопасность работы с памятью без garbage collector’а, нужна была возможность писать низкоуровневый код без постоянного страха перед data race’ами.
Браузерный движок — это вообще отдельная история. Тут тебе и парсинг HTML, и построение DOM-дерева, и CSS-стили, и layout, и рендеринг, и JavaScript. Всё это должно работать быстро, безопасно и желательно использовать все доступные ядра процессора. В классических движках типа WebKit или Blink параллелизм добавлялся постепенно, аккуратно, потому что переписывать миллионы строк C++ страшно.
Servo же подошёл к вопросу иначе: давайте сразу спроектируем архитектуру, где параллелизм — это not a bug, it’s a feature. Например, layout можно считать параллельно для разных поддеревьев DOM. Стили можно применять независимо. И всё это без мьютексов, дедлоков и прочих прелестей многопоточного программирования на C++.
Что там под капотом?
Servo — это не просто «браузер на Rust». Это целая экосистема компонентов, многие из которых стали самостоятельными библиотеками. WebRender, например — GPU-ускоренный рендерер, который сейчас используется в Firefox. Или Stylo — параллельный движок для обработки CSS, который тоже мигрировал в production.
Архитектура построена на принципе изоляции компонентов. Каждая задача — это отдельная единица работы, которую можно распараллелить. Парсинг, построение дерева рендеринга, вычисление стилей, layout — всё это может происходить одновременно на разных частях документа. Звучит просто, но реализовать это в браузере, который должен корректно отображать весь безумный зоопарк веб-стандартов, невероятно сложно.
И да, Servo поддерживает кросс-платформенность не на словах, а на деле: macOS, Linux, Windows, Android, даже OpenHarmony. Не потому что это было легко, а потому что архитектура изначально не завязана на специфику одной ОС.
Зачем это всё, если есть Chrome?
Справедливый вопрос. Chrome доминирует, Firefox существует, Safari держится на своих пользователях. Зачем нужен ещё один движок, да ещё и экспериментальный?
Во-первых, монополия одного движка (читай: Chromium) — это плохо для веба. Когда Google решает, какие стандарты поддерживать, а какие нет, это влияет на всех. Альтернативные движки нужны хотя бы для того, чтобы держать рынок в тонусе.
Во-вторых, Servo — это исследовательская площадка. Многие технологии, которые там обкатываются, потом находят путь в production-браузеры. WebRender, Stylo, некоторые подходы к обработке веб-контента — всё это родом из Servo.
В-третьих — и это, возможно, самое интересное — Servo показывает, как можно писать системный софт на современных языках. Это proof of concept того, что безопасность памяти и производительность не взаимоисключающие понятия. Что параллелизм можно делать правильно с первого раза, а не патчить годами.
Практическая сторона: а можно потрогать?
Собрать Servo можно буквально за несколько команд. Проект использует mach — систему сборки, которая автоматизирует большую часть рутины. Установил Rust, запустил ./mach bootstrap, потом ./mach build — и всё, у тебя есть работающий браузерный движок.
Конечно, это не замена твоему основному браузеру. Это исследовательский проект, где могут быть баги и недоработки. Но если ты хочешь посмотреть, как устроены браузеры изнутри, или поэкспериментировать с новыми подходами к рендерингу — добро пожаловать.
Кодовая база читабельна. Rust, конечно, не самый простой язык для первого знакомства, но если ты уже работал с типизированными языками, разобраться можно. И да, проект открыт для контрибьютеров — там есть и issues для новичков, и активное community на Zulip.
Будущее: утопия или реальность?
Честно? Servo вряд ли вытеснит Chrome или Firefox в обозримом будущем. Это и не цель. Но как исследовательская платформа, как место, где можно экспериментировать с радикальными идеями без страха сломать production для миллиардов пользователей — Servo бесценен.
Веб становится сложнее. WebAssembly, WebGPU, новые API для работы с железом — всё это требует переосмысления того, как браузеры устроены внутри. И Servo, с его изначально параллельной архитектурой и безопасностью на уровне языка, может показать путь, которым пойдут остальные.
Может быть, через пять лет мы увидим браузер, где половина кода будет на Rust. Может быть, Servo останется нишевым проектом для энтузиастов. А может быть — и это было бы круто — технологии из Servo станут стандартом де-факто для новых движков. Время покажет. Но наблюдать за этим проектом определённо интересно.