Натив клиент
Содержание
Native Client
Си и C++
кроссплатформенность
16 сентября 2011
x86, x86-64, ARM и MIPS
- 49
Разрабатывается
developers.google.com/na…
Native Client (NaCl) — технология песочницы для запуска кода на платформах x86, x86-64, ARM и MIPS, позволяющая безопасно запускать машинный код непосредственно в браузере независимо от операционной системы со скоростью, приближённой к запуску машинного кода. Эта технология также может быть использована для создания защищённых плагинов для браузера, частей какого-либо приложения либо самих приложений, например ZeroVM.
Чтобы показать готовность технологии, 9 декабря 2011 года Google представила игру с богатой графикой (на данный момент игра уже недоступна). NaCl использует аппаратное ускорение 3D-графики через OpenGL ES 2.0, запускаясь в песочнице local storage с возможностью полноэкранного режима и взаимодействием с мышью.
Переносимый Native Client (англ. Portable Native Client, сокр. PNaCl) — это архитектурно-независимая версия данной технологии. Приложения PNaCl используют технологии AOT-компиляции. Основная идея NaCl (запуск машинного кода в браузере) была реализована ещё в ActiveX, которая имеет множество проблем с безопасностью. Технология NaCl избегает этого, используя песочницу.
Существует альтернатива NaCl под названием asm.js, которая так же позволяет компилировать приложения, написанные на Си или C++, для запуска непосредственно в браузере (со скоростью, приближенной к машинному коду), поддерживает AOT-компиляцию и притом является подмножеством языка JavaScript, т. е. обратно совестима с браузерами, не имеющими её встроенной поддержки. Ещё одной альтернативой NaCl (хотя и изначально основанной на PNaCl) является WebAssembly.
12 октября 2016 в баг-трекере проекта Chromium появился комментарий, упоминающий о роспуске команд, работающих над Google’s Pepper и Native Client.
30 мая 2017 Google объявила об отказе от PNaCl в пользу WebAssembly.
Описание
Native Client является проектом с открытым исходным кодом. К настоящему времени Quake, XaoS, Battle for Wesnoth, Doom, Lara Croft and the Guardian of Light, From Dust и MAME, а также система программного синтезирования звука Csound были портированы на Native Client. Технология доступна в браузере Google Chrome начиная с версии 14 и активирована по умолчанию начиная с версии 31, в которой был официально представлен Portable Native Client (PNaCl).
Реализация технологии на платформе ARM была выпущена в марте 2010. Платформы x86-64, IA-32 и MIPS поддерживались изначально.
Для запуска при помощи технологии PNaCl приложение должно быть скомпилировано в архитектурно-независимый байт-код формата LLVM. Созданные таким образом исполняемые файлы называются PNaCl executable (pexe). Средства сборки PNaCl производят .pexe файлы; NaCl — .nexe. .nexe файлы имеют сигнатуру 0x7F ‘E’ ‘L’ ‘F’ (т.е. являются ELF файлами). Chrome для запуска транслирует pexe в архитектурно-зависимые исполняемые файлы.
NaCl использует программное обнаружение ошибок и защиту песочницы в платформах x86-64 и ARM. Реализация в x86-32 отличается новым способом организации песочницы. По технологии песочницы Native Client устанавливает свои сегменты памяти в архитектуре x86. Также используется верификатор кода для предотвращения вызова небезопасных системных вызовов. Для предотвращения перехода в незащищённую часть вызова Native Client требует, чтобы все косвенные переходы начинались с 32-байт-выровненных блоков, кроме того, инструкциям не разрешается покидать данные блоки. Из-за этих ограничений код, написанный на Си или C++, должен быть перекомпилирован особым образом для запуска с применением технологии Native Client, что может быть сделано с помощью специализированных версий GNU toolchain, в частности, GNU Compiler Collection, GNU Binutils и LLVM.
Native Client использует Newlib в качестве стандартной библиотеки языка Си, однако порт GNU C Library также доступен.
Pepper
Pepper API — кроссплатформенное свободное API для создания модулей для Native Client. Плагин Pepper API (англ. Pepper Plugin API, сокр. PPAPI) — кроссплатформенное API для защищённых технологией Native Client плагинов, основанное на NPAPI, но полностью переписанное. На данный момент используется в Chromium-подобных браузерах для запуска PPAPI-версии Adobe Flash и встроенной программы просмотра PDF-файлов.
PPAPI
12 августа 2009 на странице Google Code был представлен проект Pepper, связанный с разработкой плагина Pepper API, на которой было написано, что PPAPI — набор модификаций NPAPI для создания подобных плагинов более переносными и безопасными. Плагин был создан для лёгкой реализации запуска вне процесса. В дальнейшем целью проекта стало обеспечивание основы для создания полностью кроссплатформенных плагинов. Планировалось реализовать данные технологии:
- Универсальная семантика NPAPI для всех браузеров.
- Запуск в отдельном процессе от самого браузера.
- Стандартизация процесса рендеринга, используя браузер.
- Определение стандартных событий и растеризация 2D функций.
- Основа для 3D графики.
- Плагин регистраций.
В дальнейшем использование PPAPI помогло реализовать поддержку геймпадов и WebSocket.
Начиная с 13 мая 2010 года Chromium стал единственным браузером, поддерживающим новую модель плагинов. Mozilla Firefox не поддерживает Pepper, так как нет полной спецификации API за пределами её реализации в Chrome, которая была создана только для браузерного движка Blink. По состоянию на 2016 год Pepper поддерживается в Chrome, Chromium и браузерах на Blink, например Opera.
Реакция общества
Чад Остин (англ. Chad Austin, создатель IMVU) похвалил путь Native Client по созданию высокопроизводительных приложений для веб (с производительностью всего лишь на 5 % меньше машинного кода), в то же время позволяя развивать клиентские приложения, предоставляя возможность выбора языка программирования (кроме JavaScript).
Джон Кармак, совладелец компании Id Software, упомянул Native Client на QuakeCon 2012:
Если вам нужно сделать что-то в браузере, куда более интересен Native Client, который начался как по-настоящему умный хак x86, с помощью которого возможно сделать нужное, не выходя из песочницы уровня доступа пользователя. Теперь есть динамическая перекомпиляция, и то, что вы пишете на C или C++, компилируется в нечто, что не является высокооптимизированным машинным кодом, но чрезвычайно близко к машинному коду. Вы можете делать любые сумасшедшие операции с указателями и всё прочее, что привыкли делать разработчики игр на уровне железа.
Кармак, Джон
Оригинальный текст (англ.):
Вице-президент Mozilla Джей Салливан (англ. Jay Sullivan) сообщил, что у Mozilla нет планов запускать машинный код в браузере, так как
Эти нативные приложения являются чёрными ящиками на веб-странице. Мы верим в технологию HTML, и именно в неё мы вложим свои силы.
Джей Салливан (англ. Jay Sullivan)
Оригинальный текст (англ.):
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.
Хокон Виум Ли (норв. Håkon Wium Lie), технический директор Opera, верит, что
NaCl как будто «стремится в те старые плохие времена, до веба» Суть Native Client в построении новой платформы — или портировании старой в веб что привнесёт сложность и проблемы безопасности и лишит веб-платформу внимания.
Хокон Виум Ли (норв. Håkon Wium Lie)
Оригинальный текст (англ.):
Брендан Эйх, технический директор Mozilla, сказал, что ECMAScript 6 вполне достаточно, чтобы удовлетворить все потребности в создании приложения для веб.
> См. также
- Виртуализация приложений
- Sandboxie
- asm.js
- WebAssembly
- XBAP
Примечания
- Google’s Native Client goes live in Chrome — 2011.
- Native Client support on ARM — 2013.
- https://developer.chrome.com/native-client/sdk/release-notes#chrome-pepper-49
- 1 2 3 Metz, Cade. Google Native Client: The web of the future — or the past? (англ.) (12 September 2011). Дата обращения 6 августа 2016.
- Ходаковский, Константин. Новая технология Google Chrome приносит игру Bastion в браузер (13 декабря 2011). Дата обращения 6 августа 2016.
- Stefansen, Christian. Games, apps and runtimes come to Native Client (англ.) (9 December 2011). Дата обращения 6 августа 2016.
- Rosenblatt, Seth. Native Client turns Chrome into high-end gaming platform (англ.) (9 December 2011). Дата обращения 6 августа 2016.
- Bugs.chromium.org (англ.). bugs.chromium.org (12 November 2016). Дата обращения 7 марта 2018.
- Goodbye PNaCl, Hello WebAssembly! (англ.), Chromium Blog (30 мая 2017). Дата обращения 7 марта 2018.
- Humphries, Matthew. Google shows off Quake-clone running in Native Client (англ.) (13 May 2010). Дата обращения 6 августа 2016.
- Chen, Brad. A new Stable release of Chrome, expanding the frontiers of the web (англ.) (16 September 2011). Дата обращения 6 августа 2016.
- Sehr, David. Portable Native Client: The «pinnacle» of speed, security, and portability (англ.) (12 November 2013). Дата обращения 6 августа 2016.
- Sehr, David. Native Client support on ARM (англ.) (22 January 2013). Дата обращения 6 августа 2016.
- Alan Donovan, Robert Muth, Brad Chen, David Sehr. PNaCl: Portable Native Client Executables (англ.) (22 February 2010). Архивировано 12 марта 2016 года.
- 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.
- 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.
- Building (англ.). Дата обращения 6 августа 2016.
- Schuh, Justin. The road to safer, more stable, and flashier Flash (англ.) (8 August 2012). Дата обращения 6 августа 2016.
- Metz, Cade. Google hugs Adobe harder with Chrome-PDF merge (англ.) (18 June 2010). Дата обращения 6 августа 2016.
- ppapi (англ.).
- ppapi — Concepts.wiki (англ.).
- Metz, Cade. Google heats up native code for Chrome OS (англ.) (13 May 2010). Дата обращения 6 августа 2016.
- Chad Austin. In Defense of Language Democracy (Or: Why the Browser Needs a Virtual Machine) (англ.) (8 January 2011). Дата обращения 6 августа 2016.
- Видеоролик QuakeCon 2012 (начало на 2 часу, 36 минута, 18 секунда) на YouTube, начиная с 2:36:18
- Metz, Cade. Mozilla: Our browser will not run native code (англ.) (24 June 2010). Дата обращения 6 августа 2016.
- Krill, Paul. JavaScript founder dismisses Google Native Client, pushes ECMAScript 6 (англ.) (31 May 2012). Дата обращения 6 августа 2016.
Что такое Native Client
Ребята из Гугла начали свой нелегкий труд над NaCl в далеком 2008 году. Задачи, которые они ставили перед собой, были сложны и амбициозны. Первым делом надо было обеспечить легкую переносимость legacy кода в NaCl. Это была фактически первопричина всей этой затеи. Если у нас есть куча старого и не очень кода на плюсах, который работал сугубо на десктопах, и мы вдруг решили, что пора осваивать веб, то нам не надо учить новые языки программирования и технологии, а достаточно лишь портировать имеющийся код на Native Client платформу.
Но даже если мы и готовы переписать все с нуля на незнакомых нам языках, не факт, что у нас выйдет то, что мы ожидали. Показывать качественную 2D- и 3D-графику, использовать многопоточность, да и вообще быть ближе к железу у нас ну никак не выйдет. Это была вторая цель, которую преследовала Google. Кроме того, как я уже сказал, никто не отменял относительно низкую производительность скриптовых языков в браузере.
Ко всему прочему, умные парни из Google подумали и о безопасности пользователей. Весь нативный код выполняется в двойной (!) песочнице, что позволяет блондинкам и прочим продвинутым личностям не бояться забагованных приложений и атак злых вирусов.
Ну и на десерт у нас платформонезависимость. Да-да! Мы можем написать плюсовый код, и он будет работать на Windows, OS X и даже, не побоюсь этого слова, Linux. А вишенкой на этом десерте будет поддержка x86- и ARM-архитектур.
В 2011-м Гуглец включил поддержку NaCl в Chrome. Другие браузеры, к сожалению, пока не поддержали инициативу интернет-гиганта. Старожилам интернета в голову невольно могут прийти воспоминания об ActiveX, который и ныне здравствует (в кругу любителей IE), но, в отличие от технологии Майкрософт, Native Client распространяется с открытым исходным кодом под новой лицензией BSD. Да и над безопасностью в NaCl подумали лучше.
Для чего можно использовать Native Client
На практике Native Client можно использовать в первую очередь для запуска игрушек в браузере. Собственно, первый опыт уже есть — под Google NaCl портировали Quake. Да, да, ту самую кваку 1996 года выпуска, в которой ты провел столько лет, разрубая жирных огров саперной лопаткой (если ты не знаешь, как зарубить лопатой вооруженного гранатометом и бензопилой огра, напиши мне) и разрывая в клочья зомби из рокетлаунчера.
Исполнение машинного кода в браузере отлично поможет разгрузить сервер. Например, если у нас есть онлайн-сервис для конвертации видео в разные форматы, то алгоритм работы с ним должен выглядеть примерно так: пользователь загружает видео на сервер, долго ждет, пока наш мощный CPU перелопатит файл, выбрасывая в атмосферу много калорий тепла, а потом счастливый юзер скачивает результат с нашего сервера. Но если мы перенесем конвертор с сервера на клиент, то мы сразу уберем нагрузку с нашего железа и нехило расчистим интернет-канал, который за «умеренную» плату предоставил нам хостер. Да и пользователь будет доволен — в среднем конвертация должна пройти быстрее, так как сотни мегабайт туда-обратно по сети не гоняются. А для юзеров с паранойей можно с гордостью заявить, что их драгоценные personal data целиком обрабатываются только на их ПК. Это, кстати, актуально и для корпоративного сектора.
Как это работает
Native Client — это общее название для набора разнообразных программных компонентов, которые работают вместе для обеспечения безопасного функционирования C++ кода в вебе. На высоком уровне NaCl состоит из тулчейна (компилятора, линкера и так далее) и рантайм-библиотек, которые встроены в браузер и позволяют нативному коду безопасно работать с нужными API.
Для переносимости приложений между разными архитектурами существует расширение Portable Native Client (PNaCl). Отличие его заключается в том, что при компиляции код транслируется в промежуточное представление, а уже после запуска на той или иной платформе браузер переводит это представление в машинный код.
Для обеспечения безопасности Гугл сделал две вещи. Первая — это специальный набор API, с которым может работать код, выполняющийся под NaCl. Нативный модуль не должен пытаться выйти за пределы разрешенного API, вмешиваться в работу стороннего кода или браузера.
Второй важный момент, обеспечивающий беззаботную жизнь для пользователей Native Client, — это специальный анализатор кода, который должен удостовериться, что приложение не пытается сделать ничего противоправного.
Кроме того, NaCl-модули всегда запускаются в процессах с ограниченными правами. Эти меры предосторожности позволяют говорить о двойной песочнице для нативного кода, работающего в браузере.
C++ код может общаться с JavaScript посредством специальных сообщений. Сообщения пересылаются асинхронно, то есть не надо ждать, пока другая сторона получит его.
Пишем Hello NaCl
Теперь у нас есть представление о Native Client, и нужно пробовать написать что-нибудь полезное… или не очень. Мы будем делать Hello World, ну или Hello NaCl.
Для начала нужно скачать и установить Native Client SDK. Ссылку на страницу загрузки ты найдешь во врезке. Там же будет и инструкция по установке. Скажу лишь, что обязательно будет нужен Python 2.7 и make.
Вместе с SDK идет простой веб-сервер, который может хостить приложения на localhost. Самый простой путь запустить его — это выполнить следующие команды:
$ cd pepper_$(VERSION)/getting_started
$ make serve
SDK может содержать в себе несколько разных версий, правильную нужно подставить вместо $(VERSION). Также можно использовать любой другой веб-сервер. PNaCl включен по умолчанию в версии хрома 31 и старше. Но нужно следить, чтобы выбранная версия SDK поддерживалась установленной версией Chrome.
Великий и могучий Гугл любит преданных разработчиков и потому любезно предоставил пример с минимальным кодом для создания NaCl-модуля. Лежит этот код в папке pepper_$(VERSION)/getting_started/part1 и состоит из нескольких файлов. Первый — это index.html. В нем находится HTMLLayout и JS-код для взаимодействия с плюсовым модулем. Если внимательно присмотреться, то можно заметить файл с расширением nmf, а точнее, hello_tutorial.nmf. Это манифест, который указывает на нашу HTML, NaCl-модуль и служит вместилищем дополнительных настроек для тонкого тюнинга.
Далее идет hello_tutorial.cc, он и является исходником на C++, который потом можно собрать с помощью Makefile. Сделать это до безобразия просто:
$ cd pepper_$(VERSION)/getting_started/part1
$ make
Если мы использовали веб-сервер, идущий вместе с SDK, то после сборки в хроме достаточно вбить такой URL: http://localhost:5103/part1, и ты станешь свидетелем чуда — текст на открывшейся странице изменится с LOADING… на SUCCESS. Впечатляет, не правда ли?
Так как мы собирались делать Hello NaCl, то нам придется немного изменить код. Для этого заглянем в файл index.html и найдем там JavaScript-функцию moduleDidLoad. Кстати, сейчас самое время пробежаться по всему коду HTML-файла и остановиться на непонятных вещах, благо все они щедро сдобрены комментариями. В функции moduleDidLoad происходит загрузка нашего NaCl-модуля hello_tutorial и вывод того самого текста SUCCESS, который мы успели лицезреть при переходе по линку /part1. Теперь пошлем нативному модулю слово hello, для этого достаточно вызвать функцию postMessage у переменной модуля. В коде это будет выглядеть примерно так:
function moduleDidLoad() {
HelloTutorialModule = document.getElementById(‘hello_tutorial’);
updateStatus(‘SUCCESS’);
// Посылаем сообщение Native Client модулю
HelloTutorialModule.postMessage(‘hello’);
}
Сообщение послали, теперь надо его получить. Для этого надо реализовать член-функцию HandleMessage в файле hello_tutorial.cc. В файле содержится TODO, которое недвусмысленно намекает на то, что нужно делать. В обработчике сообщения мы будем отправлять браузеру ответ с помощью функции PostMessage, но перед этим выполним пару проверок.
virtual void HandleMessage(const pp::Var& var_message) {
if (!var_message.is_string())
return;
std::string message = var_message.AsString();
pp::Var var_reply;
if (message == «hello») {
var_reply = pp::Var(«hello from NaCl»);
PostMessage(var_reply);
}
}
Как видно из кода, мы первым делом проверяем, пришла ли нам строка, а не что-то другое. Класс Var служит оберткой со счетчиком ссылок для сырых переменных C++. Именно объекты этого класса пересылаются между веб-страницей и нативным модулем. Далее мы проверяем, что нам пришло именно hello, и отправляем ответ, предварительно обернув его объектом класса Var.
В index.html уже есть обработчик сообщений от NaCl-модуля. Он просто выведет JS alert с полученной строкой:
function handleMessage(message_event) {
alert(message_event.data);
}
После того как мы сделали нужные изменения, можно пересобирать модуль и обновлять страницу http://localhost:5103/part1. Увидев message box с заветной строкой hello from NaCl, мы можем с гордостью заявить, что освоили новую технологию.
Гугл придумал полезную штуку. Жаль, что пока никто, кроме «корпорации добра», не поддержал Native Client платформу. Достаточно высокая производительность является преимуществом по сравнению с Java, апплеты которой также могут выполняться в браузере, а высокий уровень безопасности уделывает ActiveX от Microsoft. Будем ждать, пока Chrome захватит мир или другие разработчики браузеров внедрят в свои творения Native Client.
Добавить комментарий