Pull to refresh

Haxe: большой секрет кросс-платформенной разработки

Reading time 12 min
Views 17K
Original author: Kevin Bloch
Современный язык программирования Haxe хорошо известен в определенных кругах, но многие из читающих данный материал возможно никогда о нем и не слышали. Но не позволяйте его нишевому статусу обмануть вас. С тех пор, как он впервые появился в 2005 году, его испытали в бою его лояльные, хотя и довольно тихие, последователи. Он отличается прагматичным и продуманным сочетанием возможностей, подходящих для разработки в бизнесе, играх и даже в академических целях.

Disney, Hasbro и BBC используют Haxe, так почему же большинство разработчиков о нем не слышали? Возможно, универсальность Haxe означает, что для него нельзя назвать одну единственную киллер-фичу.

Или, возможно, причина в том, что одно из самых ранних применений Haxe — это использование его как средства для перехода с умирающей платформы Flash — довольно нишевое. Последние несколько лет рынок казуальных игр находился в неопределенности, теперь же стало известно, что к 2020 году Flash официально перестанет поддерживаться компанией Adobe и весь Flash-контент в вебе уйдет в небытие.

Инженеры по разработке ПО для бизнеса, веб-разработчики, да и многие разработчики игр, услышав слово «Flash» могут сразу же потерять интерес к рассматриваемой теме. Такое отношение, например, послужило причиной появления HaxeDevelop — IDE для Haxe, которая по сути является FlashDevelop, но специализированной для разработки под Haxe и из дистрибутива которой убраны компоненты для разработки под ActionScript.

Избавиться от подобных ассоциаций о том, что Haxe — это прибежище бывших Flash-разработчиков, все же довольно сложно, особенно когда они (такие ассоциации) остаются актуальными. Например, компания FlowPlay, чьи социальные игры насчитывают 75 миллионов пользователей, выбрала Haxe, а не Unity или чистый JavaScript, для перевода своих проектов (с кодовой базой, насчитывающей 1,4 миллиона строк) с Flash на HTML5 (более подробная информация об этом доступна в данном материале).

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

Так что же такого в Haxe?


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

Продолжая тему универсальности, перечислим основные категории сценариев использования Haxe (кроме миграции с Flash, конечно же).

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

Один язык «чтобы править всеми». Прошу прощения за отсылку к Толкину, но так же, как Node.js провозгласил эру использования одного языка для клиентской и серверной частей веб-сайтов, так и Haxe может использоваться для обеих составляющих клиент-серверных приложений (при этом клиент и сервер могут работать на разных платформах).

Например, веб-приложение FontStruct использует Haxe для отрисовки графики как на стороне клиента (в HTML5 canvas), так и на стороне сервера (с помощью Java2D). Но, как уже упоминалось, идти по данному пути необязательно — Haxe не стесняет ваши возможности и позволяет работать в связке с уже существующим кодом, написанном на каком-либо другом языке. Такой подход значительно упрощает поддержание согласованности логики и даже отрисовки графики во всех контекстах, платформах и целевых языках.

Отказ от JavaScript в пользу безопасности типов. Подождите-ка, разве не для этого уже есть TypeScript? Да, если вы хотите ограничиться только выводом в JavaScript. Haxe, в свою очередь, также может компилироваться в код на Java, C ++, C #, Python, Lua, и другие языки.

В то же время, сам язык Haxe достаточно прост для изучения для тех, кто уже знаком с основами JavaScript, его синтаксис не требует от программиста смены парадигмы мышления, как, например, в случае с Rebol. Энди Ли (один из основных разработчиков Haxe) написал подробное сравнение TypeScript и Haxe, которое остается актуальным и сегодня, хотя оба языка продолжают свое дальнейшее развитие.

Довольно быстрый процесс компиляции и тестирования. Недавно добавленная в экосистему Haxe кроссплатформенная виртуальная машина (VM) HashLink позволяет соблюсти баланс между временем компиляции (компиляция под HashLink работает значительно быстрее компиляции под C++) и скоростью исполнения кода, достаточной для таких областей, как создание 3D-игр (ранее для этих целей могла использоваться виртуальная машина Neko, которая, однако, значительно уступает HashLink в скорости работы). Но даже в области веб-разработки Haxe может превзойти TypeScript как по скорости компиляции, так и скорости исполнения сгенерированного кода.

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

Кто использует Haxe?


Конечно же разработчики игр: Madden NFL Mobile, Evoland II, Double Kick Heroes… эти и сотни других игр были разработаны с использованием Haxe. Но Haxe также используется и за пределами игровой сферы:

  • Еще в 2014 году использование Haxe позволило компании TiVo улучшить производительность телеприставки TiVo Premiere более чем на 30%.
  • Massive Interactive, клиентами которой являются компании DAZN и Telecine, успешно используют Haxe для разработки ПО для систем Smart TV. На основании своего опыта работы с большими веб-проектами Филипп Элсасс (UI-архитектор Massive Interactive) в одном из своих докладов отметил, что Haxe, как правило, проще в использовании, чем TypeScript, а также на порядок быстрее транспилируется в JavaScript.
  • Synolia использует Haxe для своего онлайн-инструмента Heidi, который используется крупными французскими брендами Carrefour и La Fnac, а также Nickelodeon. Инструментарий Haxe позволил компании Synolia перейти с Flash на HTML5, а также предоставил новые возможности для развития бизнеса в мобильной сфере. Выбор Haxe позволил повторно использовать общий код в различных слоях и сервисах Heidi.
  • В 2017 году Docler Holding стал стратегическим партнером Haxe Foundation.

Какова экосистема Haxe?


Когда речь заходит об играх и Haxe, то выбор библиотек и фреймворков с открытым исходным кодом здесь довольно широк. Пользователи Haxe, будь это независимые инди-команды или успешные студии с международными клиентами, активно делятся своим кодом:

  • Flambe использовался для разработки HTML5-игр такими брендами, как Disney, Coca-Cola и Toyota.
  • Heaps — игровой 3D/2D фреймворк, лежащий в основе таких успешных инди-игр как Northgard и Dead Cells.
  • Библиотека для быстрой разработки awe6 является, возможно, скрытой жемчужиной даже для сообщества Haxe.
  • Kha — ультра-переносимый мультимедийный фреймворк, с возможностью сборки проектов не только десктопных и мобильных ОС и HTML5, но и под XBox One, Nintendo Switch и Playstation 4. На его основе создано более 20 игровых движков, наиболее интересным из которых является Armory — 3D-движок с полной интеграцией с Blender.
  • HaxeFlixel, созданный по образцу старого Flash-движка Flixel, является популярным выбором для создания небольших игр, например, для Defender's Quest.
  • Starling — изначально ActionScript-фреймворк, использовавшийся для порта Angry Birds для Facebook, теперь также обзавелся портом на Haxe.
  • OpenFL, реализующий Flash API, также позволяет создавать приложения для консолей (PlayStation 4, PlayStation Vita, XBox One и Nintendo Switch), десктопных и мобильных ОС, HTML5. HaxeFlixel и порт Starling работают поверх OpenFL. Примером игры, разработанной непосредственно на OpenFL, является отмеченная наградами Papers, Please.
  • Native Media Engine (NME), от которого несколько лет назад отделился OpenFL, продолжает поддерживаться и для него выпускаются обновления.
  • HaxePunk (произошел от еще одного Flash-движка — FlashPunk) — возможно вы могли видеть упоминание о нем в одном из выпусков Github Release Radar.
  • Nape — высоко-оптимизированный физический 2D-движок, отлично подходит для игр и симуляций со сложной физикой.

Конечно, создание игр — это наиболее заметная область применения Haxe. Но в экосистеме Haxe также есть библиотеки и инструменты для создания приложений для бизнеса и энтерпрайза, например:

  • hexMachina — модульный фреймворк для создания приложений, поддерживающий использование предметно-ориентированного языка (DSL) и архитектуру модель-представление-контроллер (MVC), а также многие другие функции. Создан и используется компанией Docler Holding.
  • HaxeUI — движок для разметки UI, активно развивается и имеет корпоративную поддержку. Примерами его использования являются такие продукты, как 3DVista и Kaizen for Pharma. HaxeUI интересен тем, что он состоит из модуля ядра и отдельных модулей, реализующих отрисовку UI с помощью разных средств: HTML-компонентов, wxWidgets, Windows Forms, нативных UI-элементов Android и др.
  • Семейство библиотек thx предоставляют универсальные языковые расширения для Haxe, в качестве его аналога из мира JavaScript можно назвать библиотеку Lodash.
  • Говоря о JavaScript и о проектах на Haxe, компилируемых в JavaScript, следует упомянуть об инструменте Haxe Modular, который помог компаниям Telecine и FlowPlay масштабировать их огромные проекты и обеспечить быструю загрузку на стороне клиента.
  • Экосистема Haxe также нацелена на развитие взаимодействия с современными технологиями. В качестве примера движения в данном направления можно назвать библиотеку GraphQL.
  • Наконец, коллекция библиотек Tinkerbell, использующая систему макросов, предоставляет средства для выполнения всевозможных задач: фреймворки для веб-маршрутизации, модульного тестирования и встраивания SQL, а также библиотеки практически для всего: от шаблонизации и синтаксического анализа CSS до реализации async/await и реактивной обработки состояний с более плавной кривой обучения.

Здесь перечислены лишь наиболее интересные проекты, созданные пользователями Haxe. Полный список библиотек, отсортированных по популярности (есть также возможность сортировки библиотек по тегам), доступен на официальном сайте. Но также стоит упомянуть еще пару проектов, которые поддерживает сам Haxe Foundation:

  • Для DevOps может показаться интересным официальный образ Haxe для Docker.
  • Библиотека h3compat обеспечивает частичную обратную совместимость между Haxe 4 и Haxe 3 и призвана помочь пользователям при обновлении проектов для работы с новой версией языка.

Все это звучит неплохо, но что нужно для того, чтобы начать разрабатывать на Haxe?

Быстрый старт с Haxe


Независимо от того, работаете ли Вы на Windows, MacOS или Linux, первым делом следует скачать установщик Haxe, в состав которого входят:

  1. Компилятор Haxe, запустить который можно командой haxe из терминала или командной строки.
  2. Стандартная библиотека Haxe, предоставляющая низкоуровневые функции и структуры данных общего назначения. Например, классы для обработки XML и ZIP-архивов, доступа к MySQL.
  3. Менеджер пакетов Haxelib, позволяющий устанавливать новые библиотеки (как из официального репозитория, так и из Git или Mercurial). Запускается командой haxelib (также вас может заинтересовать lix — более продвинутый по сравнению с Haxelib менеджер пакетов).
  4. Neko — виртуальная машина, которая может оказаться полезной при отладке проектов благодаря быстрой компиляции.

Кроме того, существует и другие способы установки Haxe в вашей системе, например, с помощью npm, Homebrew или Chocolatey.

После установки Haxe можно использовать прямо из командной строки, но лучше, конечно же, делать это с помощью IDE. FlashDevelop / HaxeDevelop по-прежнему поддерживается в основном только под Windows. Большинство других доступных вариантов являются кроссплатформенными (Win / Mac / Linux):

  • Активно поддерживается Haxe-плагин для VSCode.
  • Также есть Haxe-плагин для IntelliJ IDEA.
  • Для Kha (упоминавшегося ранее фреймворка для создания игр) имеется собственная среда разработки — Kode Studio (Win / Mac / Linux), Данная IDE является форком VSCode с дополнительными возможностями для отладки проектов.
  • Для Sublime Text и Atom, а также многих других редакторов тоже можно найти соответствующие плагины Haxe, хотя некоторые из них работают только на определенных платформах.

В данном кратком руководстве будем использовать VSCode. Проще всего установить сразу весь пакет плагинов для поддержки Haxe командой ext install haxe-extension-pack в панели быстрого доступа VSCode (вызывается сочетанием Ctrl+P), но если вы минималист, то можно ограничиться только самым базовым плагином — ext install vshaxe (остальные компоненты всегда можно доустановить позже).

Создание Haxe-проекта


Управлять процессом компиляции Haxe-кода под разные платформы проще с помощью файла системы сборки. Однако для начала нам будет достаточно лишь одного файла с Haxe-кодом с расширением .hx.

Что касается кода, то давайте возьмем пример “Генерация массивов” с сайта try.haxe.org (онлайн-песочница, где можно быстро проверить как будет работать тот или иной код) и сохраним его в файл с именем Test.hx:

class Test {
	static function main() {
		var a = [for (i in 0...10) i];
		trace(a); // [0,1,2,3,4,5,6,7,8,9]

		var i = 0;
		var b = [while(i < 10) i++];
		trace(b); // [0,1,2,3,4,5,6,7,8,9]
	}
}

Теперь можем запустить компилятор Haxe в режиме интерпретации (то есть без генерации кода под какую-либо платформу) и увидим результаты вызовов функции trace():

$ haxe -main Test --interp
Test.hx:4: [0,1,2,3,4,5,6,7,8,9]
Test.hx:8: [0,1,2,3,4,5,6,7,8,9]

Отлично, работает!

Транспиляция Haxe в JavaScript


Предположим, вы хотите поделиться рассмотренным в примере кодом со всем миром, сгенерировав из него JavaScript-код, и использовать полученный код на своей веб-странице. В Haxe это делается одной командой:

$ haxe -main Test -js haxe-test.js

Если у вас установлен Node.js, то проверить работу сгенерированного JavaScript-кода можно из командной строки:

$ node my-test.js 
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

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

Транспиляция и компиляция в исполняемый файл


Допустим, что вам также понадобился бинарный исполняемый файл для системы, на которой вы работаете. Для этого нам понадобится транспилировать Haxe-код в C++, а затем скомпилировать полученные .cpp файлы в исполняемый файл (при условии, что у вас установлен компилятор, на Windows для этого проще всего установить Microsoft Visual Studio). Для выполнения этих задач нам понадобится библиотека hxcpp, которую установим командой:

$ haxelib install hxcpp

С данной библиотекой транспиляция и компиляция кода осуществляется с помощью всего одной команды:

$ haxe -main Test -cpp bin

После чего наш исполняемый файл можно запускать:

$ bin/Test
Test.hx:4: [0,1,2,3,4,5,6,7,8,9]
Test.hx:8: [0,1,2,3,4,5,6,7,8,9]

(в Windows команда для запуска будет немного другой bin\Test.exe).

Создание файла сборки Haxe (.hxml)


Несмотря на то, что файлы сборки проектов на Haxe имеют расширение .hxml, они не являются XML-файлами (в отличие от файлов .hxproj, используемых HaxeDevelop и FlashDevelop, но не будем о них). Вот так будет выглядеть файл build-all.hxml для выполнения транспиляции:

-main Test # указываем компилятору Haxe, что основным классом приложения является класс Test (внимание, имя класс регистрозависимое)
--each # все команды, указанные выше, будут применены для каждой из целевых платформ
-js haxe-test.js # сперва осуществим транспиляцию в JS
--next # других опций не используем, переходим к следующей целевой платформе
-cpp bin # вторая целевая платформа, в которую будет осуществляться транспиляция (и компиляция) - это C++

Обратите внимание на разницу в префиксах: -main, -js и -cpp — каждый из этих параметров передается haxe напрямую, а --each и --next (с двумя дефисами) — параметры мета-уровня, они указывают компилятору, что делать с другими параметрами.

Теперь для сборки программы в JavaScript и в исполняемый файл достаточно просто выполнить команду haxe build-all.hxml.

Если же вы хотите транспилировать код в JavaScript и сразу запустить полученный результат с помощью Node, то для этого можно выполнить команду haxe run-js.hxml, содержимое файла run-js.hxml при этом будет выглядеть следующим образом:

-main Test
-js haxe-test.js
-cmd node haxe-test.js

Аналогично, файл для «сборки и запуска» для исполняемого файла будет выглядеть следующим образом (для Windows потребуется небольшое изменение, которое мы уже упоминали):

-main Test
-cpp bin
-cmd bin/Test

А что насчет VSCode? Здесь все просто: установленное нами расширение для VSCode автоматически подхватит hxml-файлы и сгенерирует соответствующие задачи сборки проекта (без использования tasks.json).

Haxe 4


В процессе выполнения действий по настройке Haxe, вы, возможно, заметили, что на странице загрузки есть ссылки как на версии 3.x, так и 4.x.

Последняя (четвертая) версия компилятора Haxe привносит множество новых функций. Одна из этих функций является свидетельством широких возможностей системы макросов, позволяющих дополнять язык новыми конструкциями: ранее в Haxe не было поддержки коротких лямбда-функций, так появилась библиотека slambda, которая реализовала их поддержку с помощью системы макросов. Начиная с четвертой версии, их поддержка встроена в компилятор, и необходимость в использовании данной библиотеки отпала.

Что еще нового в Haxe 4?

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

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

Но, в частности, в Haxe 4 появятся следующие изменения:


Материалы для изучения Haxe


Кроме документации по API стандартной библиотеки и синтаксису языка на сайте Haxe доступны материалы, рассчитанные на начинающих, кроме того, не могу не отметить сайт, посвященный разработке на Haxe под веб.

Если же вы предпочитаете учиться по видеоматериалам, то для вас доступны видео выступлений с Haxe Summit US 2018, прошедшего в Сиэтле, а также записи с других конференций.

Но иногда для начала работы вам может пригодиться руководство по какой-то конкретной теме. Например, о создании игры в стиле dungeon crawler в HaxeFlixel. Также для HaxeFlixel есть серия материалов, объясняющих основы работы с движком. Если же Вас интересует 3D, то тут можно предложить руководство о том, как начать работать с Armory.

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

Как видите, Haxe можно использовать в разных областях (и может быть Haxe сам приведет вас в новую область). Надеюсь, что вам понравилось это знакомство с миром Haxe, и с нетерпением жду новостей о том, как вы используете Haxe!
Tags:
Hubs:
+14
Comments 8
Comments Comments 8

Articles