- Зміст статті Наше життя все більше переміщується в Мережу. Браузер став головною програмою на ПК,...
- Для чого можна використовувати Native Client
- Як це працює
- Пишемо Hello NaCl
- висновок
Зміст статті
Наша взаимовыгодная связь https://banwar.org/
Наше життя все більше переміщується в Мережу. Браузер став головною програмою на ПК, а Гугл щосили штампує ноутбуки з 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, ми можемо з гордістю заявити, що освоїли нову технологію.
висновок
Гугл придумав корисну штуку. Шкода, що поки ніхто, крім «корпорації добра», не підтримав Native Client платформу. Досить висока продуктивність є перевагою в порівнянні з Java, аплети якої також можуть виконуватися в браузері, а високий рівень безпеки уделивает ActiveX від Microsoft. Будемо чекати, поки Chrome захопить світ або інші розробники браузерів впровадять в свої творіння Native Client.