Содержание
Наша жизнь все больше перемещается в Сеть. Браузер стал главной программой на ПК, а Гугл вовсю штампует ноутбуки с Chrome вместо полноценной ОС. Казалось бы, в этих условиях перспективы обычных, не веб-ориентированных языков программирования крайне сомнительны. И тем не менее нас, старых добрых хардкорных программистов на си приплюснутом, еще рано списывать на свалку истории — мы все еще получаем кучу денег :), потому что без нормального машинного кода до сих пор никто не обходится.
Потребность в запуске нативного кода в браузере появилась не на пустом месте. Как бы ни старались разработчики JavaScript и HTML 5 движков, производительность их творений не выдерживает конкуренции с обычным кодом на C или C++. Если нам нужно показать крутую графику или поразить окружающих высококачественным звуком, то типичными инструментами веб-разработчика подобное реализовать затруднительно. Именно это и стало одной из основных причин для появления технологии Native Client от Google.
Что такое 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, мы можем с гордостью заявить, что освоили новую технологию.
Заключение
WWW
Официальная страница платформы Native Client: https://developer.chrome.com/native-client
Загрузка Native Client SDK и инструкция по установке: https://developer.chrome.com/native-client/sdk/download
Разработчики) | Google , другие |
---|---|
Первый выпуск | 16 сентября 2011 ( 2011-09-16 ) |
Стабильная версия |
SDK: Перец 45 /10 июля 2015 ( 2015-07-10 )
Клиенты: Такие же , как Google Chrome |
вместилище |
|
Написанная | C , C ++ |
Операционная система | Окна , Linux , MacOS , Chrome OS |
Платформа | x86 , ARM , MIPS |
Тип | Песочница в веб — браузерах для нативного кода |
Лицензия | New BSD |
Веб-сайт | разработчик .chrome .com / родной-клиент |
Google Native Client ( NaCl ) является песочница технологии для запуска либо подмножество Intel x86 , ARM или MIPS машинный код, или портативный исполняемый файл, в песочнице. Это позволяет безопасно работает собственный код из веб — браузера , независимо от пользователя операционной системы , что позволяет веб — приложениям работать на почти родной скорости, которая совпадет с планами компании Google для Chrome OS . Он также может быть использован для защиты браузера плагинов , а также части других приложений или полных приложений , таких как ZeroVM .
Чтобы продемонстрировать готовность технологии, 9 декабря 2011 года Google объявила о выпуске нескольких новых Chrome только версий игр , известных своими богатыми и процессор -intensive графики , в том числе Бастион (больше не поддерживается на Chrome Web Store). NaCl работает с аппаратным ускорением 3D — графики (через OpenGL ES 2.0), песочницы локальное хранилище файлов, динамическую загрузку , полноэкранный режим, и мыши захвата. Есть также планы сделать NaCl доступны на мобильных устройствах.
Портативный Native Client (PNaCl) является архитектурно-независимой версией. PNaCl приложения будут скомпилированы вперед-оф-времени . PNaCl рекомендуется над NaCl для большинства случаев применения. Общая концепция NaCl (работает машинный код в веб — браузере) была реализована ранее в ActiveX , который, в то время как все еще в использовании, имеет полный доступ к системе (диск, память, пользовательский интерфейс, реестра и т.д.). Native Client позволяет избежать этой проблемы с использованием песочницы.
Альтернативой сортов к NaCl является asm.js , который также позволяет приложения , написанные на C или C ++ , которые будут скомпилированы для запуска в браузере (на более чем половину родной скорости), а также поддерживает вперед-в-время компиляции, но подмножество JavaScript и , следовательно , обратная совместимость с браузерами , которые не поддерживают его напрямую. Другой вариант (хотя он может изначально быть приведен в действие PNaCl) является WebAssembly .
12 октября 2016 года, комментарий на вопрос трекера Chromium показали , что перец и Native Client команды Google, были destaffed. 30 мая 2017 года, Google объявил о Deprecation PNaCl в пользу WebAssembly . Хотя изначально Google планировала удалить PNaCl в первом квартале 2018 года, удаление в настоящее время планируется во втором квартале 2019 года (за исключением приложений Chrome).
обзор
Native Client является открытым исходным кодом проекта разрабатывается Google . На сегодняшний день, Quake , XaoS , Битва за Wesnoth , Гибели , Лара Крофт и Хранитель Света , From Dust , и MAME , а также системы обработки звука Csound , были перенесены на Native Client. Native Client был доступен в Google Chrome веб — браузер , начиная с версии 14, и была включена по умолчанию , начиная с версии 31, когда портативный Native Client (PNaCl, произносится: башенкой) был выпущен.
ARM реализация была выпущена в марте 2010 года x86-64 , IA-32 и MIPS также поддерживаются.
Для того, чтобы запустить приложение переносимо под PNaCl, он должен быть собран с архитектурой агностического и стабильного подмножества LLVM промежуточное представление байт — кода . Исполняемые называются PNaCl исполняемых файлов (pexes). PNaCl Toolchain делает .pexe файлы; NaCl Toolchain .nexe файлы. Магическое число из .nexe файлов 0x7F «E» «L» «F», который является ELF . В Chrome, они будут переведены на архитектуру конкретных исполняемых файлов , так что они могут быть запущены.
NaCl , использует программное обеспечение обнаружения неисправностей и изоляции для Sandboxing на x86-64 и ARM. X86-32 реализация Native Client примечательна свой новый способ песочницы, что делает использование редко используются в архитектуре x86 в сегментации объекта . Native Client устанавливает сегменты x86 , чтобы ограничить диапазон памяти , что песочницы код может получить доступ. Он использует код верификатор , чтобы предотвратить использование небезопасных инструкций , такие как те , которые выполняют системные вызовы. Чтобы предотвратить код от поспешных небезопасных инструкции , скрытой в середине безопасной инструкции, Native Client требует , чтобы все косвенные переходы будут скачки к началу 32-байтовых блоков выравниваются, и инструкции не могут оседлать эти блоки. Из — за этих ограничений, код C и C ++ должен быть повторно запускать под Native Client, который обеспечивает индивидуальные версии набора инструментов GNU , в частности GNU Compiler Collection (GCC), GNU Binutils и LLVM .
Native Client лицензирован под лицензией BSD-стиля .
Native Client использует Newlib в качестве библиотеки C , но порт GNU C Library (GNU LibC) также доступна.
Перец
NaCl обозначает хлорид натрия , поваренной соли ; как каламбур , название перца также было использовано. Pepper API является кросс-платформенным, с открытым исходным кодом API для создания Native модулей клиента. Pepper Plugin API, или PPAPI является кросс-платформенный API для плагинов Native веб — браузер клиента обеспеченных, первый на основе Netscape, NPAPI , затем переписан с нуля. В настоящее время используется в Chromium и Google Chrome включить версию PPAPI в Adobe Flash и встроенный PDF зрителя.
PPAPI
С 12 августа 2009 года, страница на Google Code представила новый проект, перец, и связанный Pepper Plugin API (PPAPI), «набор модификаций NPAPI , чтобы сделать плагин более портативными и более безопасным». Это расширение разработано специально для облегчения реализации внеконкурсного процесса выполнения плагин. Кроме того, цели проекта , чтобы обеспечить основу для создания плагины полностью кросс-платформенным. Рассматриваемые темы включают в себя:
- Унифицированная семантика NPAPI во всех браузерах.
- Исполнение в отдельном процессе из визуализатора-браузера.
- Стандартизировать рендеринг с использованием процесса композитинга браузера.
- Определение стандартных событий и 2D растеризации функции.
- Первоначальная попытка предоставить 3D графики доступа.
- Плагин реестра.
Постоянно развивается Перец API , также поддерживает геймпады (версия 19) и WebSockets (версия 18).
По состоянию на 13 мая 2010 года с открытым исходным кодом браузера Google, Хром , был единственным веб — браузер , чтобы использовать новый браузер плагин модели. В 2015 году, перец поддерживается Chrome, Chromium и моргания расположением двигателя на основе браузеров , таких как Opera.
PPAPI в Firefox
Mozilla Firefox заявил в 2014 году , что они не будут поддерживать Pepper, поскольку нет полной спецификации API вне его реализации в Chrome, который сам по себе предназначена для использования с Blink макет двигателем только и имеет частные API , специфичный для плагина Flash Player , который не документированы. В октябре 2016 года Mozilla объявила о том , что он повторно рассмотрен и изучает ли включить Pepper API и PDFium в будущих версиях Firefox, однако не были предприняты такие шаги.
Приложения
Один сайта использует поваренную соль на сервере , чтобы пользователи могли экспериментировать с языком программирования Go от своих браузеров.
прием
Некоторые группы разработчиков браузеров поддерживают Native Client технологию, но другие этого не делают.
Сторонники
Чад Остин (из IMVU ) похвалил путь Native Client может принести высокопроизводительных приложений в Интернете (с примерно 5% штрафа по сравнению с машинным кодом) в безопасном режиме, а также ускорить эволюцию клиентских приложений, предоставляя выбор от используемого языка программирования (помимо JavaScript ).
Id Software «s Джон Д. Кармак хвалили Native Client на QuakeCon 2012, говоря:«если у вас есть что — то сделать в браузере, Native Client гораздо более интересно , как то , что начиналось как на самом деле чертовски умный x86 хак в пути что они могли песочнице все это в пользовательском режиме интересно. Сейчас это динамическая перекомпиляция, но то , что вы программируете на C или C ++ и компилирует к чему — то , что это будет не ваш -O4 уровень оптимизации для полного нативного кода , но довольно чертовски близко в машинный код. вы можете сделать все ваши злые chasings указателей, и все , что вы хотите сделать в качестве разработчика игр к-металл «.
Недоброжелатели
Другие ИТ-специалисты имеют более важное значение этой песочницы технологий, поскольку оно имеет существенные или существенные проблемы совместимости.
Mozilla «s вице — президент по продуктам, Джей Салливан , сказал , что Mozilla не имеет планов запускать собственный код в браузере, как«Эти нативные приложения просто маленькие черные ящики в веб — страницы. […] Мы действительно верим в HTML, и здесь мы хотим сосредоточиться «.
Mozilla, Кристофер Близзард критиковал NaCl, утверждая , что нативный код не может развиваться таким же образом , что исходный код веб-ведомым может. Он также сравнил NaCl с Microsoft, ActiveX технологии, сталкивалась с DLL ад .
Хокон Wium Ли , технический директор оперы, считает , что «NaCl , кажется,„Тоска по недобрые старые времена, до сети“», и что «Native Client о построении новой платформы — или перенос старой платформы в веб [. ..] это принесет в вопросах сложности и безопасности, и он заберет фокус с веб — платформы «.
Второе поколение
Второе поколение Песочница разработан в Google является gVisor. Он предназначен для замены NaCl в Google Cloud , чтобы быть более точным в Google App Engine .
Смотрите также
Примеры
- Folding @ дома
- Примеры PNaCl (работает в Chrome 31+, PNaCl, т.е. не требует установки)
- Native Client SDK Галерея
- torapp.info , векторный редактор, особенно мощный для печати ценных бумаг (не PNaCl)
- NACLBox , порт DOSBox для Native Client (PNaCl)
- SodaSynth , синтезатор для Native Client (не PNaCl)
- pnacl-Amiga-эмулятор , порт ОАЭ , Амигу 500 эмулятор
- Abadía дель Crimen , порт в SDL версии Vigasoco (римейк La Abadia дель Crimen ) в Native Client (PNaCl)
- Bennugd , порт примеров Bennugd видеоигр для Native Client (PNaCl)
Native Client is a sandbox for running compiled C and C++ code in the browser efficiently and securely, independent of the user’s operating system. Portable Native Client extends that technology with architecture independence, letting developers compile their code once to run in any website and on any architecture with ahead-of-time (AOT) translation.
In short, Native Client brings the performance and low-level control of native code to modern web browsers, without sacrificing the security and portability of the web. Watch the video below for an overview of Native Client, including its goals, how it works, and how Portable Native Client lets developers run native compiled code on the web.
Two Types of Modules
Native Client comes in two flavors.
- Portable Native Client (PNaCl): Pronounced ‘pinnacle’, PNaCl runs single, portable (pexe) executables and is available in most implementations of Chrome. A translator built into Chrome translates the pexe into native code for the client hardware. The entire module is translated before any code is executed rather than as the code is executed. PNaCl modules can be hosted from any web server.
- Native Client (NaCl): Also called traditional or non-portable Native Client, NaCl runs architecture-dependent (nexe) modules, which are packaged into an application. At runtime, the browser decides which nexe to load based on the architecture of the client machine. Apps and Extensions installed via the Chrome Web Store (CWS) can use NaCl modules without additional prompting. NaCl apps can also be installed from chrome://extensions or the command-line during development, however, this is not a recommended distribution mechanism.
These flavors are described in more depth in PNaCl and NaCl
Hello World
To jump right in take the tutorial that walks you through a basic web application for Portable Native Client (PNaCl). This is a client-side application that uses HTML, JavaScript, and a Native Client module written in C++.
A Little More Advanced
If you’ve already got the basics down, you’re probably trying to get a real application ready for production. You’re building, debugging or ready to distribute.
Nuts and Bolts
You’ve been working on a Native Client module for a while now and you’ve run into an arcane problem. You may need to refer to the PNaCl Bitcode Reference or the Sandbox internals.
I Want to Know Everything
So, you like to read now and try later. Start with our Technical Overview
Send us comments and feedback on the native-client-discuss mailing list, or ask questions using Stack Overflow’s google-nativeclient tag.
- https://xakep.ru/2014/10/08/google-native-client/
- https://ru.qwertyu.wiki/wiki/google_native_client
- https://developer.chrome.com/native-client