Ключевые слова:gcc, browser, web, compile, (найти похожие документы)
From: Кирилл Сухов
Date: Mon, 23 Apr 2009 17:02:14 +0000 (UTC)
Subject: Обзор RIA-платформы Native Client от Google
Материал предоставлен редакцией журнала Системный администратор.
Опубликовано в журнале "Системный администратор" N 2 2009
Rich Internet Applications - что это такое и где применяется? Мы этим
уже пользуемся или это только туманное будущее? Попытаемся разобраться
в данных вопросах, рассмотрев концепцию RIA на различных примерах.
Сегодня мы установим и опробуем Google Native Client.
Что такое Rich Internet Applications? Если честно, так и хочется
ляпнуть что-то вроде "очередной маркетинговый термин", но в данном
случае я погрешу против истины. RIA - это приложения, работающие через
сеть и предоставляющие клиенту ресурсы веб-сервера, но обладающие
функциональностью полноценных настольных приложений. Это определение не
страдает академичностью. Я его только что выдумал, но (по моему мнению)
оно не хуже любого другого. По сути Rich Internet Applications (RIA) -
это следующая ступень эволюции: от страничек, сайтов, через
веб-приложения к чему-то далёкому и полнофункциональному.
Как правило, RIA-приложения кроссплатформенны, запускаются в браузере и
не требуют какой-либо дополнительной установки программного обеспечения
на стороне клиента. В качестве примера веб-приложений, близких по
идеологии к RIA, можно привести Google Maps, GMail или ролики YouTube.
Впервые этот термин прозвучал из уст маркетологов компании Macromedia
теперь уже в далёком 2001 году. С тех пор появилось немало технологий и
реализаций данной концепции. Наиболее известные из них: Adope Air,
Alchemy, Flex, JavaFX, Microsoft Silverlight, XULRunner от Mozilla
Foundation и только что появившийся Google Native Client.
При всём разнообразии подходов технологии RIA имеют некоторые общие
черты, и самая главная из них - концепция песочницы (sandbox). Как
правило, любое RIA выполняется в локальной, изолированной среде, и хотя
использует ресурсы компьютера-клиента, не может фатально влиять на его
систему.
Обычно RIA-приложения взаимодействуют с сервером асинхронно, не
прерывая работу пользователя для получения ответа. Они имеют богатый
пользовательский интерфейс и не предъявляют каких-либо особых
требований к компьютерам-клиентам.
Google Native Client - Quake в браузере и другие
Понятно, что такой гигант, как Google, не мог стоять в стороне от
тенденции, которую сам же и создал. Первый шаг в этом направлении,
замечательный инструментарий Google Gears, был выпущен ещё в конце
весны 2008 года, а в декабре 2008 года компания представила свою
RIA-технологию - Google Native Client. Её суть - запуск в браузере
модулей, написанных на нативном коде (увы, адекватного перевода термина
"native code" в голову не приходит) для архитектуры x86.
В отличие от JavaFX или Silverlight в этой технологии нет компиляции в
байт-код и какой-либо виртуальной машины. Была создана среда
выполнения, позволяющая запускать обычные, "родные" для этой
платформы программы в безопасном для данной системы окружении.
Разработчики идеально выдержали модель "песочницы".
Во избежание взаимодействия Native Client непосредственно с
операционной системой весь код исполняется в отдельном, изолированном
контейнере. Это позволяет модулю использовать системные ресурсы, но в
то же время ограждает ОС от возможного случайного или злонамеренного
повреждения [2].
В целом Native Client (NaCL) состоит из контейнера, играющего роль
песочницы, и среды исполнения (runtime) нативного кода. Третьим
элементом выступает плагин для веб-браузера. Для коммуникации между
браузером и NaCL-модулем предоставляет два варианта: simple
RPC-интерфейс (SRPC) и давно известный Netscape Plugin Application
Programming Interface (NPAPI).
Писать модули для Google Native Client предполагается на любом
компилирующемся на данной системе языке программирования.
В настоящий момент Google Native Client рассматривается как
экспериментальная технология, но разве это мешает нам попробовать её в
деле прямо сейчас?
Первое знакомство
Скачиваем Native Client SDK со странички проекта -
http://code.google.com/p/nativeclient/wiki/Downloads.
Сразу хочу заметить, что хотя технология и позиционируется как
кроссплатформенная (представлены сборки SDK для Linux, Windows и Mac, а
также исходный код приложения), чтобы в полной мере её опробовать,
пользователям ОС Windows придется выполнить несколько больше
телодвижений, а именно установить интерпретатор Python и возможно
cygwin. Причём Pyhton (это уже касается пользователей любой
операционной системы) должен быть версии 2.4.x-2.5.x (на момент
написания этой статьи работа с Python 2.6 давала ошибки).
Полученный архив распаковываем в любое удобное место и рассматриваем
полученный результат. На рис. 1 показана структура Native Client SDK.
Рисунок 1. Структура Google Native Client
Директории common/ и tests/ содержат исходные коды примеров и тестов,
директории scons-out/, site_scons/ и ite_scons_general/ содержат файлы,
имеющие отношение к сборке Native Client-приложений. В поддиректории
scons-out/*/staging находятся скомпилированные примеры для тестирования
Native Client-плагина браузера.
Файлы Sconstruct, scons.bat и scons предназначены для сборки самой
программы Native Client, а также примеров и тестов в различных
операционных системах.
В директориях include/, intermodule_comm/, ncv/, nonnacl_util/,
npapi_plugin/ и service_runtime/ содержится исходный код ядра Native
Client, в частности npapi_plugin/ содержит исходники плагина для
браузера.
В tools/ находятся исходные коды Native Client SDK.
В gtest/ - Open Source-фрэймворк для юнит-тестирования от Google.
В директориях third-party/ и native_client/third-party/ содержатся, как
это понятно из названия, инструменты не гугловского происхождения, в
частности gcc и imagemagick и собранная версия Native Client SDK. В
директории documentation/ - документация (какая неожиданность!).
Теперь, сориентировавшись, можно опробовать работоспособность Native
Client. Для этого отправимся в директорию
googleclient/native_client/tests/, выбираем там, к примеру, папку
/life, набираем в консоли команду:
python run.py
И наслаждаемся результатом (см. рис. 2).
Рисунок 2. Native Client приложение "life"
В общем, всё работает, но не затем мы всё это разворачивали, чтобы
увидеть ту же "жизнь" в браузере. Попытка открыть файл life.html
приведёт к выдаче сообщения о незагруженном плагине. Что и разумно - мы
пока ничего не ставили. Немедленно исправим эту ситуацию, тем более что
в директории tests/ среди других призывно маячит папка quake/.
Устанавливаем Native Client-плагин
Сначала закроем все экземпляры браузера, который мы хотим пропачтить (в
данном случае это рекомендуемый руководством Firefox 3).
Затем отправляемся в директорию googleclient/native_client/ и запускаем
команду:
./scons --prebuilt firefox_install
Скрипт установки, проверив систему, разок спросит нас, продолжать ли,
установит плагин и закончит свою работу сообщением вроде:
*****************************************************************
* You have successfully installed the NaCl Firefox plugin.
* As a self-test, please confirm you can run
* /root/.mozilla/plugins/sel_ldr
* from a shell/command prompt. With no args you should see
* No nacl file specified
* on Linux or Mac and no output on Windows.
*********************************************************************
* To test this installation also try the test links on the page
* scons-out/nacl/staging/index.html
*****************************************************************
scons: done building targets.
Согласно документации установка плагина на платформе Windows происходит
идентично, команда установки выглядит как:
.\scons --prebuilt firefox_install
но, несмотря на все усилия, мне так и не удалось добиться нормального
выполнения этой команды. Но можно пойти другим путём - необходимо
скопировать из папки
\nacl\googleclient\native_client\scons-out\opt-win\staging в папку
C:\Program Files\Mozilla Firefox\plugins следующие 3 файла:
inpGoogleNaClPlugin.dll, SDL.dll, sel_ldr.exe и перезапустить браузер.
Теперь проверим установленный плагин. Зайдём в директорию
googleclient/native_client/scons-out/nacl/staging и раскроем браузером
файл index.html. Мы получим доступ к различным тестам, представляющими
собой html-странички с внедрёнными скомпилированными приложениями
Google Native Client (см. рис. 3).
Рисунок 3. Тестируем плагин
Если посмотреть исходный код такого html-файла, мы увидим примерно
следующую конструкцию:
<HTML >
<HEAD>
<TITLE>Some Demo</TITLE>
<script type="text/javascript">
var nacl_elt;
// Before scripting the loaded module, ensure the Native
// Client module is loaded.
var startupTimeout;
var PostLoadInit = function() {
if (nacl_elt.__moduleReady == 1) {
clearTimeout(startupTimeout);
nacl_elt.focus();
} else {
if (nacl_elt.__moduleReady == undefined) {
alert('The Native Client plugin was unable to load');
return;
}
startupTimeout = setTimeout(PostLoadInit, 100);
}
}
// Init is called when the document has completed loading.
// It downloads the NativeClient modules.
var Init = function() {
// service_url contains the location of the NativeClient
// module to be loaded as a service.
nacl_elt = document.getElementById('embed1');
PostLoadInit();
}
</script>
</HEAD>
<BODY id="bodyId" onload="Init();" >
<h1>SomeDemo</h1>
<p>
Some text
</p><embed id="embed1" src="some_demo.nexe"
type="application/x-nacl-srpc" width=512 height=512>
<br>
<script>
var embed1 = document.getElementById('embed1');
</script>
</BODY>
</HTML>
Как видите, тут нет ничего сложного - при загрузке страницы сначала с
помощью JavaScript производится проверка наличия модуля, и в случае
успеха он загружается в контейнер с id embed1. В случае неудачи
выводится сбивающее с толку сообщение - "The Native Client plugin was
unable to load". Почему сбивающее с толку? Сейчас я это покажу.
Земля в иллюминаторе
Возвращаемся в директорию /googleclient/native_client/tests в папку
earth/ (см. рис. 4).
Рисунок 4. Файлы примера
Как нетрудно догадаться, сценарий run.py запускает приложение, но нам
это совсем не нужно. Вместо этого откроем в браузере html-страницу
earth.html. и... получим то самое сообщение (см. рис. 5). Как же так?
Ведь плагин мы установили?
Рисунок 5. Модуль не загружен
Дело в том, что, несмотря на наличие Native Сlient-плагина, модуль не
грузится по той простой причине, что он не собран, не откомпилирован, а
представлен только исходным кодом (файл earth.сс), на языке С++.
Впрочем, в той же папке мы видим файл Makefile, и это позволяет
надеяться, что ситуацию можно исправить. Сначала соберём и запустим
Standalone-приложение:
make debug run
После этого запустится самостоятельное приложение, представляющее собой
вращающееся изображение земного шара, а в папки примера появится
исполняемый файл - earth_debug.
Теперь соберём Native client-модуль:
make release nacl
Если все прошло нормально, появятся ещё два файла - earth.nexe и
earth_release.nexe. Можно опять открыть earth.html в браузере, и теперь
картинка должна быть совсем другой (см. рис. 6).
Рисунок 6. Земля!!!
Рассмотрим пример посложнее. В папке
googleclient/native_client/tests/xaos находятся исходники и сценарий
сборки известного фрактального конструктора Xaos. Правда, не исходники
самого Xaos, их сборочный скрипт скачает отдельно. Собирать просто:
./xaos_tool.sh all
И, раскрыв браузером xaos.html, наслаждаемся результатом (см. рис. 7).
Рисунок 7. Редактируем фракталы
На самом деле в этом и предыдущем примере мы выступаем в роли
разработчика. Конечному пользователю приложения достаются уже
откомпилированные модули, и всё, что ему нужно, - оснастить браузер
Native client плагином.
Ну а мы продолжим развлекаться. Теперь приступим к обещанной quake. Тут
готового сценария нет, поэтому будем действовать вручную.
Заходим в папку googleclient/native_client/tests/quake/ и скачиваем
исходные коды игры:
wget http://www.libsdl.org/projects/quake/src/sdlquake-1.0.9.tar.gz
...
wget http://www.libsdl.org/projects/quake/data/quakesw-1.0.6.tar.gz
...
Теперь их разархивируем:
tar -x --strip-components=1 -f sdlquake-1.0.9.tar.gz
...
tar -x -f quakesw-1.0.6.tar.gz
...
Должно образоваться множество файлов - исходников и одна директория - id1/.
Следующим шагом наложим необходимый патч из native Client:
patch -p1 <nacl_quake.patch
Всё, теперь можно приступать к сборке:
make clean nacl
make debug nacl
make release nacl
Осталось открыть в браузере файл quake.html, и можно гонять монстров
(см. рис. 8).
Рисунок 8. Наши победят!
И пока всё...
Да, на этом, к сожалению, пока всё. К сожалению, технология пока
действительно сырая, и автору не удалось последовательно написать с
нуля и запустить Google Native Client-приложение ни на одной платформе.
Более того, на данный момент времени NaCL отказывается собираться с
Python 2.6.x, браузер с установленным NaCL-плагином неоднократно
замечен в неадекватном поведении, некоторые тесты не запускаются под
платформой Windows.
С другой стороны, API NaCL открыт и документирован
(/googleclient/native_client/scons-out/doc/html), поэтому для
настоящего энтузиаста нет препятствий попробовать свои силы в написании
приложений "невзирая на". Трудно сейчас сказать, насколько
перспективным окажется это занятие, но интересным - наверняка.
1. Домашняя страница проекта - http://code.google.com/p/nativeclient.
2. Описания архитектуры GoogleNative Client (PDF) -
http://nativeclient.googlecode.com/svn/trunk/nacl/googleclient/native_client/documentation/nacl_paper.pdf