Показать сообщение отдельно
Старый 20.09.2012, 19:27   #1
devolonter
Разработчик
 
Аватар для devolonter
 
Регистрация: 17.01.2007
Сообщений: 409
Написано 114 полезных сообщений
(для 281 пользователей)
И снова о Monkey. Ставим точки над "И"

“Что, снова?”, — спросите вы, и будете правы. Темы, касающиеся Monkey, стали появляться лишком часто, отчасти по моей вине. Что ж, данным постом я бы хотел завершить эту эпопею, и надеюсь, у меня это получится.

Для начала позвольте представиться. Меня зовут, Артур. Я активный участник англоязычного сообщества Monkey и являюсь автором порта flixel под Monkey, а также рантайм-патча Mojo HTML5 GL. Также, администрирую русскоязычное сообщество посвященное этому языку.

Мое знакомство с Monkey началось за некоторое время до его появления. За, почти, два года, я изучил все особенности языка вдоль и поперек, поэтому позвольте мне рассказать вам о полученном опыте.

Так, что же такое Monkey?

Monkey является языком программирования следующего поколения от Blitz Research. Главной отличительной особенностью данного языка в том, что в отличии от всех предыдущих, Monkey является транслируемым языком.

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

На данный момент, официально поддерживается трансляция в следующие языки программирования: С++, C#, Java, JavaScript и ActionScript. Неофициально: BlitzMax и Phyton.

Что это значит? Давайте разберем на простом примере. Допустим, мы имеем следующий код на Monkey:

Function Main()
	Print "Hello World!"
End Function
После трансляции мы получим следующий код:

JavaScript
function bbMain(){
	print("Hello World!");
	return 0;
}
ActionScript
internal function bbMain():int{
	print("Hello World!");
	return 0;
}
Java
class bb_{
	static public int bbMain(){
		bb_std_lang.print("Hello World!");
		return 0;
	}
}
Во всех трех случаях, программа выведет в консоль “Hello World” и завершит свою работу. Как видите, все просто — программист пишет код на Monkey, а транслятор переводит его в желаемый язык.

Новый язык, но что нового?

Давайте теперь разберем, что же изменилось в самом языке, по сравнению с BlitzMax.

Что мы приобрели:
  • Интерфейсы
  • Обобщенные классы и функции
  • Приватные методы и поля классов.
  • Перегрузка методов и функций
  • Передача параметров в конструктор класса
  • Геттеры и сеттеры
  • Директива Alias, для определения синонимов класса
  • Импорт модулей в произвольном порядке
  • Чувствительность к регистру
  • Class вместо Type
Что мы потеряли:
  • Массивы как объекты. Теперь они больше похоже на примитивы, но все же передаются по ссылке.
  • Многомерные массивы. Тем не менее, есть возможность создания массивов в массивах
  • Указатели, в том числе, указатели на функции. На самом деле, данное ограничение легко обходится с помощью интерфейсов.

Каким образом обеспечивается поддержка нескольких платформ?

Помимо транслятора, в Monkey есть целевые платформы (targets). Они представляют собой набор файлов для той или иной платформы. Если говорить проще — что-то вроде “супового набора” для каждой платформы.

Например, для HTML5 таким набором является: фавикон, html-файл и js-фай; для Flash: фавикон, html-файл и as-файл. Для остальных платформ этот шаблон представляет собой валидный для платформы проект, который можно открыть родными средствами SDK.

Основной файл исходного кода в шаблоне содержит секцию:
${TRANSCODE_BEGIN}
${TRANSCODE_END}
Именно в нее будет помещен транслированный код.

На данный момент, официально поддерживаются следующие платформы: PC, Mac, HTML5, Flash, iOS, Android, WP7, PS Vita и XBox 360.

Как происходит сборка приложений?

Теперь, когда у нас есть транслированный код и файлы проекта, мы можем его собрать. Так как Monkey не имеет компилятора, то собираться проект будет родными для платформы средствами. Например, сборка Flash-приложений осуществляется с помощью Flex SDK, Android-приложения собираются с помощью Android SDK и т.д. Именно поэтому Monkey требует установки SDK для всех целевых платформ.

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

Почему такой скудный функционал?

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

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

utils.html5.js
var utils = new Object();

utils.openURL = function(url) {
	window.open(url);
}
utils.android.java
import android.net.Uri;

class utils {

	public static void openURL(String url) {
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setData(Uri.parse(url));
		MonkeyGame.activity.startActivity(i);
	}

}
Теперь в monkey-файле достаточно написать:
Import "utils.${TARGET}.${LANG}"

Extern
Function OpenURL:Void(url:String) = "utils.openURL"
После этого, вы можете использовать функцию в коде программы следующим образом:
#If TARGET = “android” Or TARGET=”html5”
OpenURL("http://forum.boolean.name/")
#End
этот код будет работать только в HTML5 и Android, но не проблема добавить поддержку для остальных платформ.

Сообществом разработчиков Monkey было создано несколько интересных бесплатных модулей, использующих особенности платформ. Например, In-App Purchases для Android и iOS, Newgrounds API, AdMob для Android и т.д.

За что я плачу деньги?

Многие ошибочно думают, что платят деньги за Monkey. Это заблуждение.

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

Все остальное является общественным достоянием и вы можете использовать это в любых, угодных вам, целях.

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

Monkey единственный в своем роде?

Нет. Кроссплатформенных средств разработки предостаточно. Каждое имеет свои достоинства и недостатки. Но ближе всего по идеологии к Monkey — Haxe и кроссплаторменный фреймворк для него — NME. Haxe + NME отличная бесплатная альтернатива Monkey. Они отличаются набором целевых платформ, и спецификой реализации, но думаю что многим Haxe придется по душе.

В завершение

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

Если у вас есть вопросы по Monkey, пожалуйста пишите, постараюсь ответить. Прошу тех, кому это не интересно, просто проходить мимо, я больше не хочу спорить и кому-то что-то доказывать. Мне за это не платят и у меня нет стремления пересадить всех на Monkey. Вам нравится что-то другое? Пожалуйста, у каждого есть свобода выбора.

Если кому-то Monkey пришелся по душе, добро пожаловать в наше скромное русскоязычное коммьюнити. Ссылка у меня в подписи.

Также, советую дополнительно ознакомиться со следующими статьями:
На этом все. Пока!

Последний раз редактировалось devolonter, 20.09.2012 в 23:49.
(Offline)
 
Ответить с цитированием
Эти 9 пользователя(ей) сказали Спасибо devolonter за это полезное сообщение:
ant0N (21.09.2012), Gector (20.09.2012), Harter (20.09.2012), Hurrit (21.09.2012), LLI.T.A.L.K.E.R. (20.09.2012), pax (20.09.2012), Randomize (20.09.2012), Reizel (23.02.2013), Жека (21.09.2012)