Язык программирования Monkey

:

Всем привет!

В этой статье я хотел бы рассказать о Monkey — языке программирования, направленного, в первую очередь, на создание кроссплатформенных 2D-игр. Этот инструмент, на мой взгляд, несколько незаслуженно обделен вниманием разработчиков и я хотел бы это исправить.

Monkey ни в коем случае не является «убийцей» Unity и других подобных инструментов. Но он может заинтересовать начинающих, а также независимых разработчиков игр, чей бюджет в значительной степени ограничен. Если мне удалось вас заинтересовать, добро пожаловать.

Язык


Monkey — объектно-ориентированный, транслируемый язык программирования, кроссплатформенность которого достигается за счет транслирования кода Monkey в нативный для платформы язык.

Официально, код Monkey может быть транслирован в следующие языки программирования: С++, C#, Java, JavaScript и ActionScript. Тем не менее, этот список может быть расширен, путем написания собственных трансляторов. Так, сообществом Monkey, были успешно разработаны трансляторы для Python и BlitzMax.

Monkey относится к семье языков с BASIC-подобным синтаксисом. Но в нем также отчетливо прослеживается влияние Java. Язык имеет статическую типизацию, обеспечивает модульность, поддерживает абстракцию, инкапсуляцию, наследование и полиморфизм, а также интерфейсы, обобщённые типы, свойства, итераторы и исключения.

Пример кода, написанного на Monkey


Автором языка является новозеландский разработчик Марк Сибли — основатель Blitz Research Ltd. Этот человек известен некоторым разработчикам по таким инструментам для создания игр, как BlitzBasic, Blitz3D и BlitzMax. По сути, Monkey является эволюцией линейки всех предшествующих продуктов компании Blitz Research Ltd.
Кроссплатформенность


Как я уже писал выше, кроссплатформенность достигается за счет транслирования. По сути, все что умеет транслятор Monkey — это проверять и транслировать код, собирать валидный для платформы проект, и запускать нативные средства для сборки приложений. В связи с этим, для сборки итогового приложения, вам понадобится установить SDK для всех требуемых платформ. Ниже приведена таблица доступных на данный момент платформ и список необходимого ПО.
Платформа Необходимое ПО
HTML5 не требуется
Flash Flex SDK, Java SE
GLFW (Windows, Mac) MS VC++ или MinGW, OpenAL
Android Android SDK, Java SE (32-bit), ANT (Windows)
iOS OS X 10.6, XCode
XNA (Windows, WP7, XBox 360) XNA Game Studio 4.0, MS VC#, WP SDK 7.1
PSM (PS Vita) PSM SDK

Таким образом, нам удается избежать использования различных лаунчеров и плагинов для запуска итоговых приложений. Все выглядит так, как если бы мы писали приложение самостоятельно. Конечно, транслированный код получается малочитаемым и не всегда оптимальным, но вместе с этим дает все преимущества нативной разработки.

Как видно из приведенной выше таблицы, на данный момент поддерживаются следующие платформы: HTML5, Flash, Android, iOS, WP7, PS Vita, Xbox 360, Windows и  Mac. Linux также поддерживается, но пока неофициально. Как и в случае с трансляторами, этот список может быть расширен путем собственной реализации поддержки необходимых вам платформ.

Транслятор

Транслятор, как бы странно это не звучало, написан на Monkey. Но как и в случае с яйцом и курицей, был промежуточный этап, когда транслятор был написан на BlitzMax. Исходный код транслятора полностью открыт, поэтому, в случае необходимости, вы можете вносить изменения и пересобирать его в Monkey, используя целевую платформу Stdcpp (стандартный C++).
Препроцессор

Monkey использует простой препроцессор для разделения специфичных участков кода для различных платформ, установки дополнительных параметров конфигурации, а также для включения или исключения блоков кода в зависимости от конфигурации сборки.
Использование нативного кода

Для написания платформозависимого кода может быть использован нативный для платформы язык. С помощью директивы Extern, в код Monkey могут быть включены классы и функции, использующие специфичные особенности платформы. Это дает возможность практически без ограничений расширять функционал вашего приложения.

Модули



Возможности языка могут быть расширены с помощью модулей, которые можно писать как непосредственно на Monkey, так и на нативном для платформы языке.

«Из коробки» Monkey поставляется со следующими модулями:

  • monkey (базовые возможности языка)
  • brl (набор классов и функций для работы с потоками)
  • reflection (отражение)
  • os (модуль для работы с операционной системой)
  • dom (модуль для работы с DOM-деревом HTML-документа)
  • mojo (2D-фреймворк)
  • opengl (модуль для работы c OpenGL)

В дополнение к этому списку, сообществом разработчиков было написано более 20-ти дополнительных модулей, включая порты различных физических движков ( Box2D, Chipmunk и  Fling), GUI-системы, модули для работы со шрифтами, модули для реализации IAP (in-app purchase), модули для работы с  XML, JSON и различными сервисами. Список большинства доступных, на данный момент, модулей можно посмотреть здесь.

Разработка игр


Вот мы и подошли к самому главному. В начале статьи я сказал, что Monkey, в основном, используется для создания 2D-игр. Но, как видите, сам язык под это дело не заточен.

Mojo

Для разработки игр используется модуль mojo, который поставляется вместе с Monkey. Этот модуль предоставляет разработчику кроссплатформенный API для работы с 2D-графикой, звуком и устройствами ввода. Возможности фреймворка несколько ограничены и связано это, в первую очередь, с необходимостью поддержки множества платформ. Не все возможности доступные на одной платформе доступны на другой. Если какая-то «фишка» недоступна хотя бы на одной из платформ, то она не будет включена в mojo. Конечно, это несколько радикально. Но в тоже время, вы сможете быть уверены, что ваше приложение будет одинаково работать на всех платформах.

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

Игровые фреймворки

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

Список популярных игровых фреймворков для Monkey


Помимо этих 4-х фреймворков, на официальном сайте можно найти ссылки еще на  4-5 подобных инструмента различной степени завершенности.
3D

Если же вашей целью является создание 3D-игр, то в вашем распоряжении есть модуль opengl (работает не на всех платформах) или фреймворк minib3d. Но в целом, в этом плане, все довольно-таки плохо.
Игры, сделанные на Monkey

Список популярных игр, сделанных на Monkey


Стоимость и модель распространения


Стоимость pro-лицензии Monkey составляет $99. За эту сумму вы получаете: пожизненную поддержку и обновления, доступ к форуму официального сайта, модуль mojo для всех официально поддерживаемых платформ и возможность создания коммерческих игр.

Также, для загрузки доступна демо-версия, в состав которой входит mojo для HTML5. С помощью этой версии вы  не сможете создавать коммерческие игры.

На самом деле, говоря о демо и pro-версиях я имею в виду только mojo, так как сам Monkey является общественным достоянием и распространяется совершенно бесплатно. К сожалению, у Monkey отсутствует официальный репозиторий, поэтому вы можете скачать только пользовательские форки.

На данный момент, известны два форка Monkey:


Из этих двух, я порекомендовал бы использовать первый, так как он чаще обновляется и включает большее количество доработок.

Недостатки


Как и любой программный продукт, Monkey имеет свои минусы. Ниже, я постараюсь рассказать о самых важных из них, а также предложить способы их решения.
IDE

Наверное, это самая серьезная проблема — отсутствие нормальной среды разработки. Несмотря на то, что Monkey поставляется с двумя IDE (Monk и Ted), ни одну из них нельзя назвать полноценной. Я бы скорее назвал их чуть продвинутым блокнотом, не более. Писать на них серьезные проекты весьма проблематично.

Для решения этой проблемы можно воспользоваться коммерческой Jungle IDE (есть бесплатная lite-версия) или одним из  нескольких плагинов для популярных текстовых редакторов. Тем не менее, проблема с IDE, к сожалению, остается одной из ключевых.

Отсутствие вспомогательных инструментов

Большинство профессиональных инструментов для создания игр поставляются вместе с редакторами уровней, спрайтов, анимации и т. д. В Monkey подобных инструментов вы не увидите. Есть только язык, модули и IDE.

На выручку приходит стороннее ПО, как платное так и бесплатное. Обычно, сделать импорт проектов из подобных инструментов, не составляет больших проблем. К тому же, если поискать по официальному форуму, можно найти уже готовые решения, такие как, импорт текстурных атласов из TexturePacker, импорт тайловых карт из Dame и Tiled и т.д.

Производительность HTML5

HTML5-версия mojo использует 2D-контекст, что отрицательно сказывается на производительности игр. К сожалению, WebGL не поддерживается в IE. И как я уже писал ранее, если какая-то особенность где-то не поддерживается, то она не используется вовсе.

Чтобы исправить эту ситуацию, можно попробовать воспользоваться экспериментальным патчем для mojo — Mojo HTML5 GL, который заменяет 2D-контекст на WebGL, что дает существенный прирост производительности.

Официальный сайт

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

Многие пользователи жалуются на то, что искать информацию о Monkey очень тяжело, так как они постоянно натыкаются на информацию об обезьянах. К тому же, словосочетание monkey coder имеет негативный окрас, из-за схожести с  Code Monkey.

Monkey и Haxe


Haxe — универсальный объектно-ориентированный язык программирования высокого уровня, со схожим с Monkey принципом действия. И учитывая, что Haxe появился раньше, можно полагать, что разработчик Monkey черпал свое вдохновение именно от него.

Подобно mojo, у Haxe есть NME — фреймворк повторяющий Flash API. В виду подобного количества совпадений возникает закономерный вопрос: «Чем Monkey и mojo лучше Haxe и NME?». Оговорюсь сразу, я не знаком близко с Haxe и возможно в чем-то ошибаюсь, но тем не менее, постараюсь быть максимально объективным.

Плюсами связки Monkey и mojo, на мой взгляд, являются:

  • большее количество официально поддерживаемых платформ
  • поддержка таких важных платформ как PS Vita, WP7, Xbox 360, HTML5 (в NME эта платформа в зачаточной стадии)
  • стабильная трансляция в C# и Java (в Haxe эти языки находится в статусе beta)
  • одинаковое или ожидаемое поведение на всех платформах. В NME разница между платформами выглядит значительнее
  • относительная простота добавления поддержки новых платформ
  • платность, как гарантия развития

Плюсы связки Haxe и NME:
  • более «продвинутый» язык
  • большие возможности фреймворка NME
  • знакомый многим разработчикам игр Flash API
  • FlashDevelop, как основная IDE
  • большое сообщество
  • беслпатность

Как видите, у каждого инструмента есть свои сильные и слабые стороны. И получить однозначного ответа на вопрос, какой из них лучше, не представляется возможным. Многое зависит от того, что вы ожидаете получить от выбранного вами инструмента.

В завершение


Спасибо, что дочитали данный пост до конца. Я не ожидал, что он получится таким длинным, поэтому извините, если зря потратил ваше время. Тем не менее, я надеюсь, что мне удалось полностью раскрыть тему и рассказать о Monkey максимально объективно.

Для всех, кто заинтересовался Monkey — официальный сайт проекта.
Источник: хабр