28 авг. 2007 г.

Реализация языков описания данных на основе языка Lua. Часть 2

Предыдущая часть

Содержание

Начнем с примера

В качестве примера мы будем использовать описание минимального пользовательского интерфейса главного меню игры. Мы рассматриваем случай, когда визуальное отображение интерфейса, вид и координаты его элементов, жестко заданы имеющимися графическими ресурсами (для получения этих данных используется специальный инструментарий). Наши данные описывают лишь логическую структуру интерфейса.



Рис. 1. Структура элементов пользовательского интерфейса


Структура элементов интерфейса и их свойства представлены на рис. 1. Нужно отметить, что, хотя пример основан на реальных данных, при его реализации не ставилась цель продемонстрировать создание полнофункциональной системы описания пользовательского интерфейса. Основная цель примера – иллюстрация описываемого подхода к разработке форматов хранения данных. Полный код примера вместе со всеми необходимыми для сборки материалами можно найти на диске к журналу.


Рис. 2. Примерный вид главного меню


Прототип пользовательского интерфейса, который мы хотим описать, схематически представлен на рис. 2. Для каждого состояния всех элементов интерфейса (включая «задники» панелей) художник создает уникальное изображение.


Схему на рис. 2 можно описать при помощи XML примерно таким образом:

<gui_layout name="gamegui">
<panel name="mainmenu" modal="true" hidden="false">
<button name="newgame"/>
</panel>
<panel name="settings" modal="true" hidden="true">
<checkbox name="mute_all"/>
<checkbox name="mute_sfx"/>
<checkbox name="mute_speech"/>
<checkbox name="mute_music"/>
<button name="ok"/>
</panel>
</gui_layout>

Нужно обратить внимание на то, что в здесь отсутствует описание логики работы интерфейса – дана только его структура. В зависимости от реализации можно выбрать разные средства задания логики – вплоть до встраивания кода обработчиков событий на Lua непосредственно в данные на XML.

Схема на рис. 2 может быть представлена следующим образом:

Листинг 1
gui_layout “gamegui”
{
panel “mainmenu”
{
modal;
button ”newgame”;
button ”settings”;
button “exit”;
};
panel “settings”
{
modal;
hidden;
checkbox ”mute_all”;
checkbox ”mute_sfx”;
checkbox ”mute_speech”;
checkbox ”mute_music”;
button ”ok”;
button ”cancel”;
};
};

Преимущества в читаемости налицо – объем текста меньше примерно в два раза при том же объеме полезной информации. К тому же, приведенный выше текст – валидный код на Lua. Не просто описание данных – а именно код, набор вызовов функций. Остановимся на этом чуть подробнее.

Следующая часть

Реализация языков описания данных на основе языка Lua. Часть 1

Содержание

Проблема описания данных стоит перед создателем практически любого приложения. Вне зависимости от того, какова природа данных; вне зависимости от того, должно ли приложение их создавать и изменять или данные используются только для чтения; передаются данные по сети или существуют на жестком диске – они должны храниться в достаточно удобном формате.

Удобство формата определяется тем, насколько легко можно реализовать загрузку и сохранение данных, насколько большие накладные расходы по объему и скорости чтения влечет за собой его использование и насколько выбранный формат удобен для отладки (т.е. насколько он читаем человеком и насколько адекватные сообщения об ошибках в данных способен выдать загружающий их код).

Помимо вышеперечисленного, для удобства использования немаловажен объем имеющихся наработок по данному формату – наличие сторонних и собственных библиотек, средств перевода «живых» объектов логики приложения в сохраненные данные и обратно и проч. (сериализации, англ. serialization; для краткости в рамках статьи будем назвать сериализацией весь процесс – и сохранение, и загрузку объектов, хотя, формально, загрузку следует называть десериализацией) и проч. Такие средства могут предоставлять разную степень интеграции с логикой программы – от API для создания, сохранения, загрузки и модификации «голых» данных до инструментария тесной интеграции, позволяющего сериализовать объекты логики без написания промежуточного кода работы с форматом данных.

В отличие от данных, для хранения которых существуют устоявшиеся форматы, как, например, видео (AVI, WMV…), музыка (MP3, OGG…) или документы (DOC, PDF…), для данных, специфичных для логики конкретного приложения в общем случае разработчик должен создать формат хранения самостоятельно (хотя некоторые средства разработки и языки программирования упрощают этот процесс вплоть до полной автоматизации). При этом зачастую одному приложению требуются несколько различных форматов хранения для разных наборов данных.

Как и всегда, разработка формата хранения данных с нуля чревата многими проблемами. Поскольку сериализация объектов логики обычно не предъявляет экстремальных требований к эффективности по скорости и объемам данных, лучше использовать одно из обобщенных решений – создать конкретный формат при помощи некоего готового «метаформата» и связанного с ним набора технологий.

Существующие решения

Самое распространенное на данный момент «обобщенное» решение – использование языка XML. Вокруг этого языка существует огромная развитая как в плане технологий, так и в плане инструментария инфраструктура. Широчайшая распространенность и связанные с этим бонусы – главное преимущество XML.

Однако у XML существует ряд недостатков. Основной из них – избыточность, увеличивающая объем занимаемый данными, замедляющая процесс чтения и записи данных и усложняющая их ручное редактирование. Эта избыточность усугубляется тем, что XML – сугубо текстовый формат (впрочем, имеется несколько нестандартизованных вариантов Binary XML).

Помимо XML, в динамических языках (Python, Ruby и т.д.) получила распространения технология YAML (www.yaml.org). В языках программирования, ориентированных на веб-разработку, нередко используется JSON (JavaScript Object Notation, www.json.org). Обширный список альтернатив XML можно изучить по адресу www.pault.com/pault/pxml/xmlalternatives.html.

В данной статье будет рассказано о еще одном подходе к хранению данных, основанном на применении языка Lua.
Lua – расширяемый скриптовой язык расширений (extensible extension language) с динамической типизацией. Код в статье написан на наиболее свежей версии языка – 5.1, но должен работать и на предыдущей 5.0. Руководство по языку и первое издание книги одного из авторов языка – Роберто Иерусалимского (Roberto Ierusalimschy) Programming in Lua можно найти в электронном виде на официальном сайте (www.lua.org).

Выгода от применения описываемого подхода удваивается, когда в приложении существует потребность во встроенном скриптовом языке – подключение Lua к коду на C, C++ (а также любом языке, имеющем интерфейс в заимодействия с C – например, существует интерфейс Lua-Python) достаточно легко. При этом и для хранения данных и для задания конечной логики приложения используется один и тот же язык, что упрощает процесс освоения системы.

Наиболее ярко это проявляется в компьютерных играх. Язык Lua вообще получил наибольшее распространение именно в этой области во многом благодаря своей скорости, мощности, гибкости и легкости подключения к коду приложения. Однако, помимо компьютерных игр, Lua широко используется и в других областях – от средства для профессиональной работы с фотографиями (например, до сорока процентов кода Adobe Lightroom написано на Lua, labs.adobe.com/technologies/lightroom/) до системы обработки данных о геноме человека, использующей Lua для хранения огромных объемов данных (www.cbrc.jp/~ueno/slides/lua05u3.pdf). Постоянно растущий список проектов, использующих Lua, можно найти на официальном сайте языка (www.lua.org/uses.html).

В разрабатывавшемся при участии автора проекте (движок, на котором выпущено несколько игр в жанре quest/adventure) форматы данных, основанные на описываемом подходе, используются для таких данных, как описания пользовательского интерфейса, игрового мира, структуры игровых ресурсов и т.п. Нужно отметить, что, несмотря на то, что конкретные примеры в статье взяты из области разработки компьютерных игр, сам описываемый подход безусловно применим и в других областях разработки программного обеспечения.

Часть 2

Реализация языков описания данных на основе языка Lua

Не всё же фотографии постить. Потихоньку буду выкладывать лежащие в долгом ящике тексты. Времени на редактирование, к сожалению, минимум — так что как есть. Может быть кому и пригодится.

Начнём с середины. «Реализация языков описания данных на основе языка Lua» — статья опубликована в журнале «Хакер Спец» под названием «Дублер каскадера. Альтернатива XML».

Гладыш А.С. Дублер каскадера. Альтернатива XML // Спецвыпуск: Хакер. № 10 (71). 2006. С. 68—73.

Выкладываю полную (но и лишь минимально отредактированную) версию статьи. Опубликованный вариант можно прочесть на сайте журнала (или скачать весь номер в виде PDF).

Часть 1
Часть 2
Часть 3
Часть 4
Часть 5

Ностальгия

Из-за острова на стрежень,
На простор речной волны.
Выплывают расписные
Моребоева челны.
И на первом Моребоев,
Моребоев на втором,
И на третьем Моребоев,
На четвертом тоже он,
И на пятом Моребоев,
Моребоев на шестом,
Это ж надо так нажраться,
Моребоев на седьмом!

Из старого. Корпоративный фольклор.
Сева Моребоев — Человек и Шкуроход // moreboev.livejournal.com

Ещё "Звездная пыль"

Прочёл книгу. Книга... реалистичнее. Но фильм всё равно лучше — дерёт сильнее.

Неизбежность

22 авг. 2007 г.

Stardust

Ты приносил мне в ладошке
Звездную пыль
Вдруг там осталось немножко
Ты посмотри, вдруг ты забыл
Ты посиди еще рядом,
Но уходи поутру
Знаешь, мне тоже казалось,
Что я никогда не умру
-- Чичерина

Волшебный, романтичный, небанальный, добрый фильм. Но после него такой отходняк...

Крокодил IV

Пятна на совести