Интерпретатор
Вельмаскин Н.А. (с)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
LUA
Lua (порт. «луна») — интерпретируемый язык
программирования, разработанный подразделением Tecgraf
Католического университета Рио-де-Жанейро. Разработанный
интерпретатор является свободно распространяемым, с
открытыми исходными текстами на языке Си.
www.lua.org
Хорош для мобильных платформ, ввиду своей интеграции с
C/C++, легкости, скорости и гибкости движка
Пример кода:
13
Интерактивчик
Где есть LUA www.lua.org
15
Phyton www.python.org
Python (англ. python — питон) — высокоуровневый язык
программирования общего назначения с открытым кодом
C++. Лицензия бесплатная.
Пример кода:
Хорош для серверных платформ, из-за «прожорливости» и
размера интерпретатора
16
Где есть Phyton www.python.org
Интерактивчика не будет ;)
UnrealScript
UnrealScript – кроссплатформенный, высокоуровневый,
объектно-ориентированный язык программирования,
часть движка 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

Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Вашей игры

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