Никита Вельмаскин - Интерпретатор или думаем над...
DESCRIPTION
Доклад Никиты Вельмаскина с IT_Share GameDev WebTRANSCRIPT
Интерпретатор
Вельмаскин Н.А. (с)2013
или думаем над скриптовым движком для Вашей игры
1
Вельмаскин Никита – Indie разработчик. В gamedev’е с 1992 года. Самая первая игра «Шахматы» для ZX Spectrum.
Самый знаменитый стартап: Pocket F.A.L.L.O.U.T. – порт игры Fallout2 на мобильные платформу WinMobile/PocketPC.
О докладчике
www.pf-pda.net
PocketGame – это «движок» со всем необходимым инструментарием для быстрой разработки кроссплатформенных 2D-игр.
Инженерные решения PocketGame:•Кроссплатформенность•Масштабируемость•Оптимизация под слабые устройства•Собственный язык программирования•Быстрая локализация
Что же такое «Интерпретатор»
?
3
Из Википедии:Это приложение или аппаратное средство, выполняющее покомандный или построчный анализ, обработку и мгновенное выполнение команды исходной программы или запроса.
Интерпретатор
4
Простой интерпретатор - анализирует и тут же выполняет программу покомандно (или построчно), по мере поступления её исходного кода на вход интерпретатора.
Достоинства: •Мгновенная реакция на поступившую команду
Недостатки: •Такой тип интерпретатора обнаруживает ошибки в тексте программы только при попытке выполнения команды (или строки) с ошибкой.
Разновидности
Такой интерпретатор хорош для мобильных платформ, на стороне клиента
5
Интерпретатор компилирующего типа — это система, состоящая из компилятора, переводящего исходный код программы в промежуточное представление (в байт-код), и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина).
Достоинства: •большее быстродействие выполнения программ •гибкость в разработке задач.
Недостатки: •большее требование к ресурсам и требование на корректность исходного кода.
Такой интерпретатор хорош для использования на сервере
6
Разновидности
Где можно успешно
использовать интерпретатор?
7
Везде, где только можно и где нельзя – ограничивается только Вашей фантазией.
Игры• RPG/MMORPG• RTS / Turn-Based Strategy, TBS• Аркады со множеством объектов, взаимодействующих
с игроком• Шутеры (интеллект ботов)
СУБД (исполнение запросов, выполнение процедур и функций на сервере БД)
Бизнес-приложения (расчет рисков, бухгалтерия)
8
Достоинства и недостатки
1. Кроссплатформенность — программа будет работать на любой платформе, на которой есть соответствующий интерпретатор.
2. Ускоренный процесс исправления ошибок и обновления логики всего приложения
3. Гибкость - можно распоряжаться возможностями языка программирования и самой платформы интерпретатора
4. Коммерческая составляющая – можно заработать денег, при наличии хороших бизнес-идей использования платформы и интерпретируемого языка
Достоинства
10
Недостатки1. Интерпретируемая программа не может выполняться
отдельно без программы-интерпретатора. Сам интерпретатор при этом может быть очень «тяжелым».
2. Интерпретируемая программа выполняется медленнее (в 5-10 раз по сравнению с обычным приложением)
3. Практически отсутствует оптимизация кода, что приводит к дополнительным потерям в скорости работы
4. При неумелой организации структуры файлов игры, появляется «бэкдор» для нечестных игроков (читерство)
11
Популярные платформыи языки
12
LUALua (порт. «луна») — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро. Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.
www.lua.org
Хорош для мобильных платформ, ввиду своей интеграции с C/C++, легкости, скорости и гибкости движка
Пример кода:
13
Интерактивчик
Где есть LUAwww.lua.org
15
Phyton www.python.org
Python (англ. python — питон) — высокоуровневый язык программирования общего назначения с открытым кодом C++. Лицензия бесплатная.
Пример кода:
Хорош для серверных платформ, из-за «прожорливости» и размера интерпретатора
16
Где есть Phyton www.python.org
Интерактивчика не будет ;)
UnrealScriptUnrealScript – кроссплатформенный, высокоуровневый,
объектно-ориентированный язык программирования, часть движка Unreal Engine. Права на использование принадлежат Epic Games. Лицензия бесплатная и коммерческая.
www.unrealengine.com
Документация на русском:http://www.gamedev.ru/community/udk/articles/UnrealScriptReference
Пример кода:
Графика у движка Unreal просто потрясающая, даже на мобильных устройствах!
17
Интерактивчик
UnrealScript
www.unrealengine.com
18
JavaScriptВстроен уже в любое современное устройство, где есть интернет-браузер. А в сочетании с HTML5 – неограниченные возможности для создания игр и приложений.
Пример кода:
19
Брать чужой или делать
свой ?
…To be, or not to be: that is the question…
20
Чужой: плюсы1. Уже все готово и отлажено. Количество «багов» сведено к
минимуму
2. Есть готовая документация
3. Есть готовые инструменты работы (IDE, отладчики, профилировщики)
4. В большинстве случаев можно найти уже готового спеца по языку программирования
5. А если уж очень-очень постараться, то можно найти спеца и по ядру интерпретатора
21
Чужой: минусы1. Сложность интеграции с уже готовым проектом.
Решение об использовании того или иного интерпретатора необходимо принять еще ДО начала разработки.
2. Если исходные языки программирования у проекта и интерпретатора различны, то необходимо разрабатывать «мост» между двумя системами (Java -> C++)
3. Необходимо вникать в особенности «движка» для его расширения/плотной интеграции с приложением.
4. Могут возникнуть проблемы с правообладателем. Неприемлемо для стартапов.
22
Свой: плюсы1. Очень плотная интеграция интерпретатора с ядром
приложения => большая скорость работы
2. Безграничные возможности для оптимизации и расширения скриптового движка
3. Очень интересен сам процесс создания.
4. Нет нарушения авторских прав и, следовательно, не надо никому платить за лицензию
23
Свой: минусы1. Необходимо затратить уйму времени, денег и сил
на разработку и отладку самого скриптового движка, синтаксиса языка программирования, документации к нему.
2. Специалистов по движку и языку программирования необходимо взращивать внутри коллектива. Снаружи – их нет
24
Как работает интерпретатор
….О сколько нам открытий чудныхГотовят просвещенья духИ опыт, сын ошибок трудных,И гений, парадоксов друг,И случай, бог изобретатель…
25
Компоненты
• Таблица идентификаторов содержит список всех названий переменных, используемых в программе.
• Лексический анализатор (Lexer). Преобразует последовательность символов (из файла-источника) в последовательность лексем
• Синтаксический анализатор (Parser). Берет последовательность лексем и строит по ним синтаксическое дерево. 26
Синтаксическое дерево
27
Это древовидная структура представления программы. Именно это дерево и «исполняется» при запуске интерпретируемого кода.
• Блок семантического контроля (Semantic Checker). Не обязателен. Проверяет синтаксическое дерево на наличие ошибок.
• Генератор промежуточного кода (Intermediate Code Generator). Преобразует синтаксическое дерево в промежуточный код.
• Оптимизатор (Optimizer). Не обязателен. Оптимизирует промежуточный код.
28
• Генератор байт-кода (Bytecode Generator). Не обязателен. Создает байт-код по промежуточному коду.
• Виртуальная машина, выполняющая этот байт-код.
• Стек вызовов – хранит ссылки на текущие запущенные блоки кода (процедуры/функции), а так же точки возврата.
29
А если почитать?
http://www.gamedev.ru/articles/?id=70104
Хорошая статья:
Компиляторы: принципы, технологии и инструменты Ахо А.В., Сети Р., Ульман Д.Д.
30
Свой интерпретатор
31
Совет из опыта
За основу лучше взять уже готовый интерпретатор языка Basic, где уже есть линейные ветвления и циклы с условием.
32
И вокруг него собрать свое синтаксическое ядро языка и механизмы интерпретатора.
Прежде чем резать…1. Наилучший язык разработки – C/С++
2. Надо хорошо изучить среду, где будет исполняться интерпретируемый код. Узнать все сильные и слабые стороны платформы и ОС
1. Разработать синтаксис языка и его конструкции, которые удовлетворяли бы требованиям решаемых задач и был понятен человеку при чтении кода
2. Максимально интегрировать ядро интерпретатора в ядро приложения
3. И только после этого разработать анализатор лексем и парсер
33
Lexer и ParserДля C/С++ есть замечательный OpenSource инструмент - Bison.
Для других языков программирования см. статью: http://ru.wikipedia.org/wiki/Синтаксический_анализ
34
Конструкции будущего языка описываются самим разработчиком в специальном формате bison.
www.gnu.org/s/bison
Ясность синтаксиса
35
Оптимизация
36
Что бы зря не оптимизировать
• Знайте архитектурные особенности работы интерпретатора
• Определитесь с платформой, где будет исполняться интерпретируемый код и знайте ее особенности
• Делайте код программы проще
37
Интерактивчик
Почему это неоптимизированны
й код?
40
«Враги интерпретатора»1. Циклы (особенно вложенные)
2. Массивы (особенно многомерные)
3. Глобальные переменные
4. Рекурсия
5. Огромные файлы исходного кода
41
Борьба с «врагами интерпретаторов»1. НЕ объявляйте переменные в теле цикла, это
существенно замедляет его
2. Обход двумерного массива – сначала у, потом x
3. Большие файлы, по возможности, дробите на мелкие и подгружайте в память по мере надобности
4. Используйте системные коллекции (на стороне ядра приложения) для хранения и поиска данных, а не массивы интерпретатора
5. Знайте особенности работы интерпретатора
42
И на посошок!1. Время от времени переносите уже
«устаканившейся» интерпретируемый код в ядро приложения
2. Для анализа быстродействия используйте профилировщики
3. Не забывайте об утечках памяти – проверяйте инструментами анализа утечек каждый модуль
43
А если почитать?
Совершенный код. Второе издание
Автор: С.Макконнелл
44
+375 29 628 81 83 Никита
URL demo-версии движка PocketGame:
http://maskin-soft.ru/pocketgame
Вах, какой доклад!
https://facebook.com/velmaskin