Google Native Client
Google Native Client (NaCl) — это программная технология (песочница), разработанная компанией Google, которая позволяет выполнять нативный (скомпилированный в машинный код) код, написанный на языках C и C++, непосредственно в веб-браузере, обеспечивая при этом высокий уровень безопасности и производительности, сопоставимый с нативными приложениями. Технология была предназначена для создания высокопроизводительных веб-приложений, таких как игры, графические редакторы и научные симуляторы, работающих в среде браузера без установки дополнительных плагинов.
История
Разработка Native Client началась в 2008 году в исследовательском подразделении Google. Первоначальная цель заключалась в том, чтобы предоставить разработчикам возможность запускать в браузере код, скомпилированный для конкретной архитектуры процессора (x86, x86-64, ARM), с производительностью, близкой к максимально возможной. Первая публичная демонстрация технологии состоялась в 2008 году на конференции Google I/O.
В 2010 году проект был переименован в Google Native Client (NaCl), а в 2011 году была выпущена версия 1.0, которая была интегрирована в браузер Google Chrome. В 2012 году была представлена модификация Portable Native Client (PNaCl), которая позволяла компилировать код в промежуточный, аппаратно-независимый формат (LLVM bitcode), что устраняло необходимость в отдельной компиляции под каждую архитектуру процессора.
В 2014 году Google объявила о прекращении поддержки NaCl в сторонних браузерах, сосредоточившись на Chrome и Chrome OS. В 2017 году было объявлено о поэтапном отказе от NaCl и PNaCl в пользу технологии WebAssembly (Wasm), которая была разработана как открытый стандарт с участием Google, Mozilla, Microsoft и Apple. Поддержка NaCl была полностью прекращена в Chrome 88, выпущенном в январе 2021 года.
Архитектура и принципы работы
Песочница (Sandbox)
Ключевой особенностью Native Client является изолированная среда выполнения — песочница. Она обеспечивает безопасность, не позволяя вредоносному коду получить доступ к операционной системе или другим данным пользователя. Песочница NaCl реализована на нескольких уровнях:
- Статическая проверка кода (Static Code Analysis): Перед выполнением код NaCl проходит через верификатор, который проверяет его на соответствие жёстким ограничениям. Верификатор гарантирует, что код не содержит прямых системных вызовов, не обращается к произвольным адресам памяти и не выполняет небезопасные инструкции. В NaCl разрешены только определённые инструкции процессора, а все переходы и вызовы функций должны быть явно помечены.
- Аппаратная изоляция (Hardware Isolation): Для дополнительной защиты используется механизм сегментации памяти (в x86-архитектуре) или другие аппаратные средства, которые ограничивают доступ к памяти только в пределах выделенного сегмента.
- Интеграция с браузером: NaCl-модуль выполняется в отдельном процессе, который изолирован от основного процесса браузера. Взаимодействие с браузером (например, рендеринг графики, обработка ввода) осуществляется через специальный интерфейс, который не позволяет модулю напрямую манипулировать DOM или другими системными ресурсами.
Формат исполняемого файла
NaCl использует собственный формат исполняемого файла — Nexe (NaCl Executable). Это файл, содержащий машинный код, скомпилированный для конкретной архитектуры (x86-32, x86-64, ARM). Для PNaCl использовался формат Pepper (Portable Executable), который представлял собой LLVM bitcode, который затем компилировался в нативный код на стороне клиента при первом запуске.
API Pepper
Для взаимодействия с браузером и операционной системой NaCl-модули используют API Pepper (PPAPI). Этот API предоставляет доступ к таким функциям, как:
- Рендеринг 2D и 3D графики (через OpenGL ES 2.0).
- Обработка ввода с клавиатуры и мыши.
- Работа с аудио.
- Сетевое взаимодействие (через сокеты).
- Доступ к файловой системе (в изолированной песочнице).
Классификация
Native Client (NaCl)
Оригинальная версия, требующая компиляции кода под каждую целевую архитектуру процессора (x86, x86-64, ARM). Это обеспечивало максимальную производительность, но создавало проблемы с распространением, так как разработчику нужно было поставлять несколько версий одного модуля.
Portable Native Client (PNaCl)
Модификация, представленная в 2012 году. Код компилируется в промежуточный формат (LLVM bitcode), который не зависит от архитектуры процессора. При первом запуске в браузере этот bitcode компилируется в нативный код для конкретной архитектуры пользователя. PNaCl решал проблему совместимости, но имел несколько меньшую производительность по сравнению с NaCl из-за дополнительного этапа компиляции.
Применение
Native Client был предназначен для создания высокопроизводительных веб-приложений, которые требовали больших вычислительных ресурсов или доступа к низкоуровневым функциям, недоступным через JavaScript. Основные области применения:
- Игры: Разработка браузерных игр с трёхмерной графикой, сложной физикой и многопользовательским режимом.
- Графические и мультимедийные редакторы: Создание инструментов для обработки изображений, видео и аудио, работающих в реальном времени.
- Научные и инженерные симуляции: Выполнение сложных расчётов, моделирования физических процессов, обработки больших объёмов данных.
- Инструменты для разработчиков: Создание сред разработки, работающих в браузере, например, компиляторов, отладчиков и редакторов кода.
Примеры приложений, использовавших NaCl:
- Google Earth (веб-версия) — использовал NaCl для рендеринга 3D-ландшафта.
- Adobe Photoshop (веб-версия) — использовал NaCl для выполнения фильтров и других вычислительно-ёмких операций.
- Unity Web Player — использовал NaCl для запуска игр, созданных на движке Unity, в браузере.
Критика и ограничения
Несмотря на свои преимущества, Native Client подвергался критике по нескольким причинам:
- Зависимость от платформы: NaCl был привязан к браузеру Google Chrome и не поддерживался в других браузерах (Firefox, Safari, Internet Explorer/Edge). Это создавало монополию и ограничивало распространение технологии.
- Сложность разработки: Разработка NaCl-модулей требовала глубоких знаний языков C/C++, а также понимания архитектуры песочницы и API Pepper. Это было значительно сложнее, чем разработка на JavaScript.
- Проблемы безопасности: Хотя песочница NaCl была тщательно спроектирована, периодически находились уязвимости, позволяющие обойти изоляцию. В 2013 году была обнаружена уязвимость, позволяющая выполнить произвольный код в системе.
- Отказ от поддержки: В 2017 году Google объявила о прекращении поддержки NaCl в пользу WebAssembly. Это привело к тому, что разработчики, инвестировавшие в NaCl, были вынуждены переписывать свои приложения на WebAssembly или другие технологии.
Влияние и наследие
Несмотря на то, что Native Client не стал массовой технологией, он оказал значительное влияние на развитие веб-платформы. Многие идеи, заложенные в NaCl, были использованы при разработке WebAssembly (Wasm), который является открытым стандартом и поддерживается всеми основными браузерами. WebAssembly, как и NaCl, позволяет выполнять нативный код в браузере, но делает это более безопасно, эффективно и кроссплатформенно. Таким образом, Native Client можно рассматривать как экспериментальный прототип, который проложил путь к современной технологии WebAssembly.
Источники
- Google Developers. Native Client Documentation (2011-2021).
- Google I/O 2008, 2011, 2012, 2014. Презентации и доклады.
- Yee, B., et al. "Native Client: A Sandbox for Portable, Untrusted x86 Native Code." IEEE Symposium on Security and Privacy, 2009.
- "Portable Native Client (PNaCl) — Technical Overview." Google Developers, 2012.
- WebAssembly Community Group. "WebAssembly Specification." (2017-2021).
- Информация с сайта Chromium.org (раздел Native Client).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →