Native Client

Разработчик |  Google
Написана на |  Си и C++
Операционная система  |  кроссплатформенность
Первый выпуск |  16 сентября 2011[1]
Аппаратные платформы  |  X86, x86-64, ARM architecture[2] и MIPS
Последняя версия |

* 49[3]

Репозиторий |  chromium.googlesource.com/…
Состояние |  Закрыт
Лицензия |  модифицированная лицензия BSD[вд]
Сайт |  developer.chrome.com/… (англ.)

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

Чтобы показать готовность технологии, 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]. Изначально Google планировала удалить PNaCl в первом квартале 2018 года[9], а позже и во втором квартале 2019 года[10], но окончательно PNaCl был удалён в июне 2022 года (вместе с приложениями Chrome)[11].

## Содержание

* 1 Описание
* 2 Pepper
* 2.1 PPAPI
* 3 Проекты на Native Client
* 4 Реакция общества
* 5 См. также
* 6 Примечания
* 7 Ссылки

## Описание

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

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

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

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

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

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

## Pepper

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

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

### PPAPI

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

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

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

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

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

## Проекты на Native Client

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

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

* Folding@home Архивная копия от 11 декабря 2016 на Wayback Machine Проект Folding@home прямо в браузере используя технологию nacl

## Реакция общества

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

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

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

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

Кармак, Джон[26]

|

Оригинальный текст (англ.)

if you have to do something inside a browser, Native Client is much more interesting as something that started out as a really pretty darn clever x86 hack in the way that they could sandbox all of this in user mode interestingly. It's now dynamic recompilation, but something that you program in C or C++ and it compiles down to something that's going to be not your -O4 optimization level for completely native code but pretty damn close to native code. You could do all of your evil pointer chasings, and whatever you want to do as a to-the-metal game developer.

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

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

Джей Салливан (англ. Jay Sullivan)[27]

|

Оригинальный текст (англ.)

These native apps are just little black boxes in a webpage. […] We really believe in HTML, and this is where we want to focus.

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

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

NaCl как будто «стремится в те старые плохие времена, до веба» […] Суть Native Client в построении новой платформы — или портировании старой в веб […] что привнесёт сложность и проблемы безопасности и лишит веб-платформу внимания.

Хокон Виум Ли (норв. Håkon Wium Lie) [4]

|

Оригинальный текст (англ.)

NaCl seems to be 'yearning for the bad old days, before the web' […] Native Client is about building a new platform – or porting an old platform into the web […] it will bring in complexity and security issues, and it will take away focus from the web platform.

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

## См. также

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

* Виртуализация приложений[англ.]
* Sandboxie
* asm.js
* WebAssembly
* XBAP

## Примечания

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

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 (12 сентября 2011). Google Native Client: The web of the future - or the past? (англ.). Архивировано 6 августа 2016. Дата обращения: 6 августа 2016.
5. ↑ Ходаковский, Константин (13 декабря 2011). Новая технология Google Chrome приносит игру Bastion в браузер. Архивировано 21 августа 2016. Дата обращения: 6 августа 2016.
6. ↑ Stefansen, Christian (9 декабря 2011). Games, apps and runtimes come to Native Client (англ.). Архивировано 19 августа 2016. Дата обращения: 6 августа 2016.
7. ↑ Rosenblatt, Seth (9 декабря 2011). 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. ↑ 1 2 Goodbye PNaCl, Hello WebAssembly!. Chromium Blog (англ.). 30 мая 2017. Архивировано 30 мая 2017. Дата обращения: 7 марта 2018.
10. ↑ WebAssembly Migration Guide - Google Chrome (англ.). developer.chrome.com. Дата обращения: 13 ноября 2024. Архивировано 12 марта 2019 года.
11. ↑ Changes to the Chrome App Support Timeline (англ.). Chromium Blog (10 августа 2020). Дата обращения: 13 ноября 2024. Архивировано 22 сентября 2023 года.
12. ↑ Humphries, Matthew (13 мая 2010). Google shows off Quake-clone running in Native Client (англ.). Архивировано 21 августа 2016. Дата обращения: 6 августа 2016.
13. ↑ Chen, Brad (16 сентября 2011). A new Stable release of Chrome, expanding the frontiers of the web (англ.). Архивировано 20 августа 2016. Дата обращения: 6 августа 2016.
14. ↑ Sehr, David (12 ноября 2013). Portable Native Client: The "pinnacle" of speed, security, and portability (англ.). Архивировано 13 мая 2016. Дата обращения: 6 августа 2016.
15. ↑ Sehr, David (22 января 2013). Native Client support on ARM (англ.). Архивировано 27 июля 2016. Дата обращения: 6 августа 2016.
16. ↑ Alan Donovan, Robert Muth, Brad Chen, David Sehr. PNaCl: Portable Native Client Executables (англ.) (22 февраля 2010). Архивировано 12 марта 2016 года.
17. ↑ 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 года.
18. ↑ 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 года.
19. ↑ Building (англ.). Дата обращения: 6 августа 2016. Архивировано 9 ноября 2016 года.
20. ↑ Schuh, Justin (8 августа 2012). The road to safer, more stable, and flashier Flash (англ.). Архивировано 29 июля 2016. Дата обращения: 6 августа 2016.
21. ↑ Metz, Cade (18 июня 2010). Google hugs Adobe harder with Chrome-PDF merge (англ.). Архивировано 6 августа 2016. Дата обращения: 6 августа 2016.
22. ↑ ppapi (англ.). Дата обращения: 6 августа 2016. Архивировано 6 октября 2016 года.
23. ↑ ppapi - Concepts.wiki (англ.). Дата обращения: 6 августа 2016. Архивировано 6 октября 2016 года.
24. ↑ Metz, Cade (13 мая 2010). Google heats up native code for Chrome OS (англ.). Архивировано 17 января 2019. Дата обращения: 6 августа 2016.
25. ↑ Chad Austin. In Defense of Language Democracy (Or: Why the Browser Needs a Virtual Machine) (англ.) (8 января 2011). Дата обращения: 6 августа 2016. Архивировано 16 августа 2016 года.
26. ↑ Видеоролик QuakeCon 2012 (начало на 2 часу, 36 минута, 18 секунда) на YouTube, начиная с 2:36:18
27. ↑ Metz, Cade (24 июня 2010). Mozilla: Our browser will not run native code (англ.). Архивировано 26 августа 2016. Дата обращения: 6 августа 2016.
28. ↑ Krill, Paul (31 мая 2012). JavaScript founder dismisses Google Native Client, pushes ECMAScript 6 (англ.). Архивировано 20 сентября 2016. Дата обращения: 6 августа 2016.

## Ссылки

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

* Chen, Brad (8 декабря 2008). Native Client: A Technology for Running Native Code on the Web (англ.). Архивировано 19 августа 2016. Дата обращения: 6 августа 2016.
* Light Media. NaclBox (англ.). Дата обращения: 15 марта 2022. Архивировано 18 сентября 2021 года.

Google LLC

* Председатель совета директоров: Эрик Шмидт
* Директор, президент по технологиям и сооснователь: Сергей Брин
* Главный исполнительный директор и сооснователь: Ларри Пейдж
Материнская компания: Alphabet

Реклама|

* AdMob
* Adscape[англ.]
* AdSense
* Advertising Professional[англ.]
* Ads
* Analytics
* DoubleClick
* Insights for Search
* Trends
* Wallet
* Google Университет[англ.]

Коммуникации|

* Allo
* Google+
* Calendar
* Friend Connect
* Duo
* Gmail
* Inbox
* Groups
* Hangouts
* Meet
* Messages
* Вопросы и ответы[англ.]
* Talk
* Translate
* Voice

ПО|

* Chrome
* Chromium
* Earth
* Gadgets
* Goggles
* Now
* SketchUp
* Talk
* Google Assistant
* Toolbar

Платформы|

* Account
* Android
* App Engine
* BigTable
* Chromecast
* Chrome OS
* Google Workspace
* Пользовательский поиск
* Native Client
* GFS
* Nexus
* OpenSocial
* Pixel
* Play
* Public DNS
* Stadia
* TV
* Fuchsia

Инструменты
разработки|

* Android Studio
* Dart
* Gadgets API[англ.]
* GData[англ.]
* Go
* Googlebot
* Guice
* GWS
* Highly Open Participation Contest[англ.]
* KML
* MapReduce
* Mediabot[англ.]
* Pinyin[англ.]
* SketchUp Ruby[англ.]
* Sitemaps (index)
* Summer of Code
* AtGoogleTalks[англ.]
* Web Toolkit
* Google Website Optimizer

Публикация|

* Alerts
* Blogger
* Bookmarks[англ.]
* Документы
* FeedBurner
* Library Project[англ.]
* Map Maker
* Sites
* YouTube
* Диск
* Фото
* Keep

Поиск (PageRank)|

* Appliance
* Audio[англ.]
* Books
* Images
* Maps (Mars
* Moon
* Ocean[англ.]
* Sky
* Street View)
* News
* Patents[англ.]
* Покупки
* Scholar
* Usenet
* Video
* Web

Тематические проекты|

* Finance
* Google Glass
* Беспилотный автомобиль Google
* Loon
* Проект Tango
* Google Cardboard
* Noto
* Code Jam

Закрытые проекты|

* Вопросы и ответы[англ.]
* Browser Sync
* Base
* Buzz
* Checkout
* Click-to-call[англ.]
* Code
* Desktop
* Dodgeball[англ.]
* Gears
* GOOG-411
* Health
* iGoogle
* Image Labeler[англ.]
* Jaiku
* Knol
* Labs
* Lively
* Mashup Editor[англ.]
* Notebook
* Orkut
* Pack
* Panoramio
* Picasa
* Page Creator
* Picnik
* Reader
* SearchWiki[англ.]
* Updater
* Video Marketplace[англ.]
* Wave
* Web Accelerator
* Google Play Music

См. также|

* История
* Поглощения
* Список сервисов и инструментов
* Логотип
* Doodle
* Цензура[англ.]
* Ara
* Arts & Culture
* Calico
* Current[англ.]
* Earth Outreach[англ.]
* Foundation (Google.org)
* Google China[англ.]
* Googleplex
* Google X
* Lunar X Prize
* I/O
* WiFi[англ.]
* Zeitgeist[англ.]
* «Бомбы»
* Гуглизация
* Dinosaur Game

Свободное и открытое программное обеспечение Google

Программное обеспечение|

| Приложения|

* Chromium
* OpenRefine
* Tesseract

|

Языки программирования|

* Carbon
* Dart
* Go
* Sawzall

Фреймворки и
инструменты разработки|

* AMP
* Angular
* AngularJS
* Beam
* Bazel
* Блокли
* Closure Tools
* Cpplint
* FlatBuffers
* Flutter
* Gears
* Gerrit
* Guava
* gRPC
* Gson
* Guetzli
* Guice
* gVisor
* Kubernetes
* LevelDB
* libvpx
* NaCl
* OR-Tools
* Polymer
* Protocol Buffers
* TensorFlow

Операционные системы|

* AOSP
* Chromium OS
* Fuchsia
* gLinux
* Goobuntu

Связанное|

* Code-in
* Google LLC v. Oracle America, Inc.
* Open Source Security Foundation
* Summer of Code