Открыть сервис

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. Процесс работы включал несколько этапов:

  1. Компиляция в биткод: Исходный код на C/C++ компилировался в промежуточное представление LLVM — биткод, который сохранялся в файл с расширением .pexe.
  2. Загрузка в браузер: Файл .pexe загружался на веб-страницу через элемент <embed> или специальный JavaScript API.
  3. Трансляция (JIT-компиляция): Браузер Chrome, получив биткод, транслировал его в машинный код для конкретной архитектуры процессора пользователя (x86, x86-64, ARM) с помощью встроенного JIT-компилятора.
  4. Выполнение: Сгенерированный машинный код выполнялся в изолированной среде (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, стал преемником технологии. Основные различия:

ХарактеристикаPNaClWebAssembly
Формат кодаБиткод LLVM (.pexe)Бинарный формат (.wasm)
Поддержка браузерамиТолько ChromeВсе основные браузеры (Chrome, Firefox, Safari, Edge)
КомпиляцияJIT-компиляция в браузереJIT-компиляция или AOT-компиляция
БезопасностьИзоляция на уровне процессаИзоляция на уровне процесса (sandbox)
ИнструментарийLLVM, специальный SDKLLVM, 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 →