Native Client — Википедия

Native Client
Разработчик Google
Написана на Си и C++
Операционная система кроссплатформенность
Первый выпуск 16 сентября 2011[1]
Аппаратные платформы x86, x86-64, ARM[2] и MIPS
Последняя версия
Репозиторий chromium.googlesource.com/…
Состояние Закрыт
Лицензия модифицированная лицензия BSD[d]
Сайт developer.chrome.com/doc…

Native Client (NaCl) — технология песочницы для запуска кода на платформах x86, x86-64, ARM и MIPS, позволяющая безопасно запускать машинный код непосредственно в браузере независимо от операционной системы со скоростью, приближённой к запуску машинного кода. Эта технология также может быть использована для создания защищённых плагинов для браузера, частей какого-либо приложения либо самих приложений[4], например ZeroVM[en].

Чтобы показать готовность технологии, 9 декабря 2011 года Google представила игру[5] с богатой графикой (на данный момент игра уже недоступна). NaCl использует аппаратное ускорение 3D-графики через OpenGL ES 2.0, запускаясь в песочнице local storage с возможностью полноэкранного режима и взаимодействием с мышью.[6][7]

Переносимый Native Client (англ. Portable Native Client, сокр. PNaCl) — это архитектурно-независимая версия данной технологии. Приложения PNaCl используют технологии AOT-компиляции. Основная идея NaCl (запуск машинного кода в браузере) была реализована ещё в ActiveX, которая имеет множество проблем с безопасностью. Технология NaCl избегает этого, используя песочницу.

Существует альтернатива NaCl под названием asm.js, которая так же позволяет компилировать приложения, написанные на Си или C++, для запуска непосредственно в браузере (со скоростью, приближенной к машинному коду), поддерживает AOT-компиляцию и притом является подмножеством языка JavaScript, т. е. обратно совестима с браузерами, не имеющими её встроенной поддержки. Ещё одной альтернативой NaCl (хотя и изначально основанной на PNaCl) является WebAssembly.

12 октября 2016 в баг-трекере проекта Chromium появился комментарий[8], упоминающий о роспуске команд, работающих над Google's Pepper и Native Client.

30 мая 2017 Google объявила об отказе от PNaCl в пользу WebAssembly.[9]

Описание[править | править код]

Native Client является проектом с открытым исходным кодом. К настоящему времени Quake[10], XaoS[en], Battle for Wesnoth, Doom, Lara Croft and the Guardian of Light, From Dust и MAME, а также система программного синтезирования звука Csound были портированы на Native Client. Технология доступна в браузере Google Chrome начиная с версии 14[11] и активирована по умолчанию начиная с версии 31, в которой был официально представлен Portable Native Client (PNaCl).[12]

Реализация технологии на платформе ARM была выпущена в марте 2010.[13] Платформы x86-64, IA-32 и MIPS поддерживались изначально.

Для запуска при помощи технологии PNaCl приложение должно быть скомпилировано в архитектурно-независимый байт-код формата LLVM.[14] Созданные таким образом исполняемые файлы называются PNaCl executable (pexe). Средства сборки PNaCl производят .pexe файлы; NaCl — .nexe. .nexe файлы имеют сигнатуру 0x7F 'E' 'L' 'F' (т.е. являются ELF файлами). Chrome для запуска транслирует pexe в архитектурно-зависимые исполняемые файлы.

NaCl использует программное обнаружение ошибок и защиту песочницы в платформах x86-64 и ARM.[15] Реализация в x86-32 отличается новым способом организации песочницы.[16] По технологии песочницы Native Client устанавливает свои сегменты памяти в архитектуре x86. Также используется верификатор кода для предотвращения вызова небезопасных системных вызовов. Для предотвращения перехода в незащищённую часть вызова Native Client требует, чтобы все косвенные переходы начинались с 32-байт-выровненных блоков, кроме того, инструкциям не разрешается покидать данные блоки.[16] Из-за этих ограничений код, написанный на Си или C++, должен быть перекомпилирован особым образом для запуска с применением технологии Native Client, что может быть сделано с помощью специализированных версий GNU toolchain, в частности, GNU Compiler Collection, GNU Binutils и LLVM.

Native Client использует Newlib в качестве стандартной библиотеки языка Си, однако порт GNU C Library также доступен.[17]

Pepper[править | править код]

Pepper API — кроссплатформенное свободное API для создания модулей для Native Client. Плагин Pepper API (англ. Pepper Plugin API, сокр. PPAPI) — кроссплатформенное API для защищённых технологией Native Client плагинов, основанное на NPAPI, но полностью переписанное. На данный момент используется в Chromium-подобных браузерах для запуска PPAPI-версии Adobe Flash[18] и встроенной программы просмотра PDF-файлов[19].

PPAPI[править | править код]

12 августа 2009 на странице Google Code был представлен проект Pepper, связанный с разработкой плагина Pepper API,[20] на которой было написано, что PPAPI — набор модификаций NPAPI для создания подобных плагинов более переносными и безопасными[21]. Плагин был создан для лёгкой реализации запуска вне процесса. В дальнейшем целью проекта стало обеспечение основы для создания полностью кроссплатформенных плагинов. Планировалось реализовать данные технологии:

  • Универсальная семантика NPAPI для всех браузеров.
  • Запуск в отдельном процессе от самого браузера.
  • Стандартизация процесса рендеринга, используя браузер.
  • Определение стандартных событий и растеризация 2D функций.
  • Основа для 3D графики.
  • Плагин регистраций.

В дальнейшем использование PPAPI помогло реализовать поддержку геймпадов и WebSocket.[источник не указан 2810 дней]

Начиная с 13 мая 2010 года Chromium стал единственным браузером, поддерживающим новую модель плагинов.[22] Mozilla Firefox не поддерживает Pepper, так как нет полной спецификации API за пределами её реализации в Chrome, которая была создана только для браузерного движка Blink. По состоянию на 2016 год Pepper поддерживается в Chrome, Chromium и браузерах на Blink, например Opera.

Проекты на Native Client[править | править код]

Существует сайт The Go Playground Архивная копия от 17 ноября 2021 на Wayback Machine, использующий данную технологию для того, чтобы позволить экспериментировать с Go прямо в браузере.

Реакция общества[править | править код]

Чад Остин (англ. Chad Austin, создатель IMVU[en]) похвалил путь Native Client по созданию высокопроизводительных приложений для веб (с производительностью всего лишь на 5 % меньше машинного кода), в то же время позволяя развивать клиентские приложения, предоставляя возможность выбора языка программирования (кроме JavaScript).[23]

Джон Кармак, совладелец компании Id Software, упомянул Native Client на QuakeCon 2012:

Если вам нужно сделать что-то в браузере, куда более интересен Native Client, который начался как по-настоящему умный хак x86, с помощью которого возможно сделать нужное, не выходя из песочницы уровня доступа пользователя. Теперь есть динамическая перекомпиляция, и то, что вы пишете на C или C++, компилируется в нечто, что не является высокооптимизированным машинным кодом, но чрезвычайно близко к машинному коду. Вы можете делать любые сумасшедшие операции с указателями и всё прочее, что привыкли делать разработчики игр на уровне железа.
Кармак, Джон[24]
 

Вице-президент Mozilla Джей Салливан (англ. Jay Sullivan) сообщил, что у Mozilla нет планов запускать машинный код в браузере, так как

Эти нативные приложения являются чёрными ящиками на веб-странице. […] Мы верим в технологию HTML, и именно в неё мы вложим свои силы.
Джей Салливан (англ. Jay Sullivan)[25]
 

Сотрудник Mozilla Кристофер Близзард[en] раскритиковал технологию NaCl, утверждая, что машинный код ни в коей мере не должен быть использован в вебе. Также он сравнил NaCl с технологией Microsoft ActiveX, которая достигла ситуации DLL hell.[4]

Хокон Виум Ли (норв. Håkon Wium Lie), технический директор Opera, верит, что

NaCl как будто «стремится в те старые плохие времена, до веба» […] Суть Native Client в построении новой платформы — или портировании старой в веб […] что привнесёт сложность и проблемы безопасности и лишит веб-платформу внимания.
Хокон Виум Ли (норв. Håkon Wium Lie) [4]
 

Брендан Эйх, технический директор Mozilla, сказал, что ECMAScript 6 вполне достаточно, чтобы удовлетворить все потребности в создании приложения для веб.[26]

См. также[править | править код]

Примечания[править | править код]

  1. Google's Native Client goes live in Chrome — 2011.
  2. Native Client support on ARM — 2013.
  3. https://developer.chrome.com/native-client/sdk/release-notes#chrome-pepper-49
  4. 1 2 3 Metz, Cade (2011-09-12). "Google Native Client: The web of the future - or the past?" (англ.). Архивировано из оригинала 6 августа 2016. Дата обращения: 6 августа 2016.
  5. Ходаковский, Константин (2011-12-13). "Новая технология Google Chrome приносит игру Bastion в браузер". Архивировано из оригинала 21 августа 2016. Дата обращения: 6 августа 2016.
  6. Stefansen, Christian (2011-12-09). "Games, apps and runtimes come to Native Client" (англ.). Архивировано из оригинала 19 августа 2016. Дата обращения: 6 августа 2016.
  7. Rosenblatt, Seth (2011-12-09). "Native Client turns Chrome into high-end gaming platform" (англ.). Архивировано из оригинала 27 апреля 2016. Дата обращения: 6 августа 2016.
  8. Bugs.chromium.org (англ.). bugs.chromium.org (12 ноября 2016). Дата обращения: 7 марта 2018. Архивировано 18 августа 2017 года.
  9. "Goodbye PNaCl, Hello WebAssembly!". Chromium Blog (англ.). 2017-05-30. Архивировано из оригинала 30 мая 2017. Дата обращения: 7 марта 2018.
  10. Humphries, Matthew (2010-05-13). "Google shows off Quake-clone running in Native Client" (англ.). Архивировано из оригинала 21 августа 2016. Дата обращения: 6 августа 2016.
  11. Chen, Brad (2011-09-16). "A new Stable release of Chrome, expanding the frontiers of the web" (англ.). Архивировано из оригинала 20 августа 2016. Дата обращения: 6 августа 2016.
  12. Sehr, David (2013-11-12). "Portable Native Client: The "pinnacle" of speed, security, and portability" (англ.). Архивировано из оригинала 13 мая 2016. Дата обращения: 6 августа 2016.
  13. Sehr, David (2013-01-22). "Native Client support on ARM" (англ.). Архивировано из оригинала 27 июля 2016. Дата обращения: 6 августа 2016.
  14. Alan Donovan, Robert Muth, Brad Chen, David Sehr. PNaCl: Portable Native Client Executables (англ.) (22 февраля 2010). Архивировано 12 марта 2016 года.
  15. David Sehr, Robert Muth, Cliff L. Biffle, Victor Khimenko, Egor Pasko, Bennet Yee, Karl Schimpf, Brad Chen. Adapting Software Fault Isolation to Contemporary CPU Architectures (англ.) (2010). Дата обращения: 6 августа 2016. Архивировано 24 июля 2016 года.
  16. 1 2 Bennet Yee, David Sehr, Greg Dardyk, Brad Chen, Robert Muth, Tavis Ormandy, Shiki Okasaka, Neha Narula, Nicholas Fullagar. Native Client: A Sandbox for Portable, Untrusted x86 Native Code (англ.) (2009). Дата обращения: 6 августа 2016. Архивировано 12 сентября 2016 года.
  17. Building (англ.). Дата обращения: 6 августа 2016. Архивировано 9 ноября 2016 года.
  18. Schuh, Justin (2012-08-08). "The road to safer, more stable, and flashier Flash" (англ.). Архивировано из оригинала 29 июля 2016. Дата обращения: 6 августа 2016.
  19. Metz, Cade (2010-06-18). "Google hugs Adobe harder with Chrome-PDF merge" (англ.). Архивировано из оригинала 6 августа 2016. Дата обращения: 6 августа 2016.
  20. ppapi (англ.). Дата обращения: 6 августа 2016. Архивировано 6 октября 2016 года.
  21. ppapi - Concepts.wiki (англ.). Дата обращения: 6 августа 2016. Архивировано 6 октября 2016 года.
  22. Metz, Cade (2010-05-13). "Google heats up native code for Chrome OS" (англ.). Архивировано из оригинала 17 января 2019. Дата обращения: 6 августа 2016.
  23. Chad Austin. In Defense of Language Democracy (Or: Why the Browser Needs a Virtual Machine) (англ.) (8 января 2011). Дата обращения: 6 августа 2016. Архивировано 16 августа 2016 года.
  24. Видеоролик QuakeCon 2012 (начало на 2 часу, 36 минута, 18 секунда) на YouTube, начиная с 2:36:18
  25. Metz, Cade (2010-06-24). "Mozilla: Our browser will not run native code" (англ.). Архивировано из оригинала 26 августа 2016. Дата обращения: 6 августа 2016.
  26. Krill, Paul (2012-05-31). "JavaScript founder dismisses Google Native Client, pushes ECMAScript 6" (англ.). Архивировано из оригинала 20 сентября 2016. Дата обращения: 6 августа 2016.

Ссылки[править | править код]