PNaCl
PNaCl (Portable Native Client) — это технология, разработанная компанией Google, которая позволяла выполнять скомпилированный, машинно-независимый код (бинарный код) в веб-браузере с производительностью, близкой к нативной. PNaCl являлся развитием технологии Native Client (NaCl) и был ориентирован на создание высокопроизводительных веб-приложений, работающих непосредственно в браузере без установки дополнительных плагинов. Технология была официально объявлена устаревшей (deprecated) в 2017 году и удалена из браузера Google Chrome в 2022 году.
История
Предпосылки и появление Native Client (NaCl)
В середине 2000-х годов веб-приложения, написанные на JavaScript, начали активно вытеснять настольные программы, однако их производительность была ограничена интерпретируемым характером языка. Для решения этой проблемы компания Google в 2008 году анонсировала проект Native Client (NaCl). NaCl позволял запускать в браузере скомпилированный машинный код для конкретной архитектуры процессора (x86, x86-64, ARM), что давало прирост производительности, сопоставимый с нативными приложениями. Однако NaCl требовал от разработчиков компилировать код отдельно для каждой целевой платформы, что усложняло распространение приложений.
Разработка PNaCl
В 2011 году Google представила Portable Native Client (PNaCl) как расширение NaCl. Основным нововведением стало использование промежуточного представления кода — биткода LLVM. Разработчики компилировали свой код (на C, C++ или других языках, поддерживающих LLVM) в единый файл биткода (.pexe), который затем загружался браузером и на лету транслировался в машинный код для конкретной архитектуры пользователя. Это устраняло необходимость в многоплатформенной компиляции.
PNaCl был впервые включён в состав Chrome 31 (выпущен в ноябре 2013 года) и стал доступен для всех платформ, поддерживаемых браузером, включая Windows, macOS, Linux и Chrome OS. Технология позиционировалась как альтернатива плагинам (таким как Adobe Flash, Microsoft Silverlight) и как средство для создания «тяжёлых» веб-приложений: игр, графических редакторов, программ для обработки аудио и видео.
Закат и удаление
Несмотря на технические достоинства, PNaCl не получил широкого распространения за пределами экосистемы Google. Основными причинами стали:
- Закрытость экосистемы: PNaCl поддерживался только в браузере Google Chrome и его форках (например, Chromium). Другие браузеры (Mozilla Firefox, Apple Safari, Microsoft Edge) не внедряли эту технологию, предпочитая развивать стандарт WebAssembly.
- Сложность разработки: Для создания приложений под PNaCl требовались глубокие знания C/C++ и инструментария LLVM, что было недоступно большинству веб-разработчиков, привыкших к JavaScript.
- Проблемы безопасности: Хотя PNaCl использовал изолированную среду выполнения (sandbox), его модель безопасности была сложнее, чем у JavaScript, и требовала постоянного обновления.
В 2017 году Google объявила, что PNaCl и NaCl будут объявлены устаревшими в пользу новой технологии — WebAssembly (Wasm). В 2018 году поддержка PNaCl была отключена по умолчанию в Chrome 67, а в 2022 году, с выходом Chrome 100, код, отвечающий за PNaCl, был полностью удалён из браузера.
Технические особенности
Архитектура
PNaCl основывался на инфраструктуре компилятора LLVM. Процесс работы включал несколько этапов:
- Компиляция в биткод: Исходный код на C/C++ компилировался в промежуточное представление LLVM — биткод, который сохранялся в файл с расширением
.pexe. - Загрузка в браузер: Файл
.pexeзагружался на веб-страницу через элемент<embed>или специальный JavaScript API. - Трансляция (JIT-компиляция): Браузер Chrome, получив биткод, транслировал его в машинный код для конкретной архитектуры процессора пользователя (x86, x86-64, ARM) с помощью встроенного JIT-компилятора.
- Выполнение: Сгенерированный машинный код выполнялся в изолированной среде (sandbox) с ограниченным доступом к системным ресурсам.
Изоляция и безопасность
PNaCl использовал многоуровневую систему безопасности:
- Изоляция на уровне процесса: Модуль PNaCl выполнялся в отдельном процессе браузера, изолированном от других вкладок и системных процессов.
- Ограничения на системные вызовы: Модуль мог выполнять только ограниченный набор системных вызовов (syscalls), разрешённых через специальный интерфейс (NaCl syscall interface). Это предотвращало прямой доступ к файловой системе, сети и другим ресурсам.
- Валидация биткода: Перед JIT-компиляцией браузер проверял биткод на соответствие правилам безопасности (например, отсутствие прямых обращений к памяти, запрещённых инструкций).
Производительность
По заявлениям Google, PNaCl обеспечивал производительность, близкую к нативным приложениям (до 80–90% от скорости кода, скомпилированного нативно). Это достигалось за счёт:
- Использования JIT-компиляции с оптимизациями, аналогичными компиляторам C/C++.
- Минимизации накладных расходов на изоляцию (в отличие от JavaScript, который требует интерпретации или JIT-компиляции с дополнительными проверками типов).
Применение
Примеры приложений
Несмотря на ограниченное распространение, PNaCl использовался в нескольких известных проектах:
- Google Earth: Версия Google Earth для Chrome OS использовала PNaCl для рендеринга 3D-графики.
- Игры: Некоторые браузерные игры, требовавшие высокой производительности (например, шутеры от первого лица, стратегии в реальном времени), были портированы на PNaCl.
- Графические редакторы: Приложения для обработки изображений, такие как Photopea, на ранних этапах использовали PNaCl для ускорения фильтров и эффектов.
- Аудио- и видеоредакторы: Программы для нелинейного монтажа, такие как WeVideo, применяли PNaCl для обработки медиафайлов.
Ограничения
- Поддержка только Chrome: Приложения на PNaCl не работали в других браузерах, что делало их непригодными для массового веб-развертывания.
- Зависимость от архитектуры: Хотя PNaCl был «портативным» в смысле биткода, он всё равно требовал JIT-компиляции под конкретную архитектуру, что могло вызывать задержки при первом запуске.
- Отсутствие доступа к DOM: Модули PNaCl не могли напрямую взаимодействовать с DOM (Document Object Model) веб-страницы; для этого требовался JavaScript-мост, что усложняло интеграцию.
Сравнение с WebAssembly
WebAssembly (Wasm), объявленный устаревшим PNaCl, стал преемником технологии. Основные различия:
| Характеристика | PNaCl | WebAssembly |
|---|---|---|
| Формат кода | Биткод LLVM (.pexe) | Бинарный формат (.wasm) |
| Поддержка браузерами | Только Chrome | Все основные браузеры (Chrome, Firefox, Safari, Edge) |
| Компиляция | JIT-компиляция в браузере | JIT-компиляция или AOT-компиляция |
| Безопасность | Изоляция на уровне процесса | Изоляция на уровне процесса (sandbox) |
| Инструментарий | LLVM, специальный SDK | LLVM, Emscripten, Rust, C/C++ |
| Сложность разработки | Высокая (требуется знание C/C++) | Средняя (поддерживается множество языков) |
| Производительность | До 90% от нативной | До 95% от нативной (в зависимости от оптимизаций) |
WebAssembly решил ключевые проблемы PNaCl: он стал открытым стандартом (W3C), поддерживается всеми браузерами и позволяет использовать более широкий спектр языков программирования (C, C++, Rust, Go, и другие).
Критика
PNaCl подвергался критике по нескольким причинам:
- Закрытость и монополизация: Критики утверждали, что Google использует PNaCl для закрепления доминирования Chrome на рынке браузеров, создавая технологию, несовместимую с другими браузерами.
- Сложность внедрения: Разработчики отмечали, что портирование существующих приложений на PNaCl требует значительных усилий и не оправдывает выгоды от повышения производительности.
- Проблемы безопасности: Несмотря на изоляцию, PNaCl неоднократно становился объектом атак, связанных с уязвимостями в JIT-компиляторе и sandbox-механизмах.
Наследие
Хотя PNaCl был удалён из Chrome, его разработка оказала значительное влияние на развитие веб-технологий. Опыт, накопленный Google при создании PNaCl, был использован при разработке WebAssembly. В частности, архитектура изоляции и JIT-компиляции PNaCl легла в основу многих механизмов безопасности WebAssembly. Кроме того, PNaCl продемонстрировал, что веб-приложения могут достигать производительности, сопоставимой с нативными, что стимулировало развитие других технологий, таких как asm.js и WebGL.
Источники
- Google. "Portable Native Client (PNaCl) — Developer Documentation". (2013–2017).
- Google. "Native Client: A Sandbox for Portable, Untrusted x86 Native Code". (2009).
- Google. "PNaCl: A Portable, Secure, and High-Performance Execution Environment for Web Applications". (2013).
- WebAssembly Community Group. "WebAssembly Specification". (2017–2022).
- Статья "The Rise and Fall of Google's PNaCl" на сайте The New Stack (2018).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →