Haxe: самый сокровенный секрет кроссплатформенной разработки

Опубликовано: 2022-03-11

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

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

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

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

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

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

Что особенного в Haxe?

Проект Debian описывает Haxe как «универсальный язык программирования». В этом есть несколько аспектов.

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

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

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

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

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

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

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

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

Захватывающий рубеж. Сам Haxe имеет открытый исходный код и имеет активное сообщество, в которое постоянно добавляются новые языковые функции. Его собственным наиболее хорошо охраняемым подсекретом может быть просто его система макросов времени компиляции, которая сама по себе имеет много интересных вариантов использования, позволяя вам метапрограммировать в свое удовольствие. (Я приведу несколько примеров ниже.)

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

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

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

На что похожа экосистема Haxe?

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

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

Конечно, сцена разработки игр является более заметной частью языковой экосистемы Haxe. (Возможно, это связано с природой таких игровых джемов, как Ludum Dare?) Но деловые и даже корпоративные аспекты тоже проявляются. Например:

  • Платформа модульных приложений hexMachina поддерживает использование предметно-ориентированного языка (DSL) и архитектуру модель-представление-контроллер (MVC) среди многих других функций.
  • Механизм компоновки пользовательского интерфейса HaxeUI активно развивается и имеет корпоративную поддержку. Такие продукты, как 3DVista и Kaizen for Pharma, уже поставляются вместе с производственными приложениями.
  • Это не единственная библиотека, но библиотека thx.core и ее родственники предоставляют расширения общего назначения для Haxe, так же, как Lodash делает для JavaScript.
  • Говоря о JavaScript, проекты Haxe, ориентированные на него, могут выиграть от использования Haxe Modular, который помог Telecine и FlowPlay масштабировать свои огромные проекты, сохраняя при этом их быструю загрузку на стороне клиента.
  • Экосистема Haxe также продолжает развиваться, чтобы соответствовать современным технологиям; например, теперь есть библиотека GraphQL.
  • Наконец, образцовый Tinkerbell использует систему макросов Haxe для всевозможных полезных задач. Он имеет фреймворки для веб-маршрутизации, модульного тестирования и встраивания SQL, а также библиотеки для всего, от шаблонов и синтаксического анализа селекторов CSS до асинхронной / ожидающей и обработки реактивного состояния с более низкой кривой обучения.

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

  • Что касается DevOps, есть официальный репозиторий Haxe Docker.
  • С точки зрения стабильности, даже с основным обновлением версии, Haxe 4 будет иметь некоторую помощь по совместимости для тех, у кого проекты зависят от Haxe 3.

Все это звучит красиво, но каково это, чтобы среда разработки работала в вашей системе?

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

Будь то Win, Mac или Linux, первым шагом будет загрузка Haxe. Установщик там предоставит несколько разных вещей:

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

(Тем не менее, существует несколько способов настройки. Например, если у вас уже установлен npm , в инструкциях по установке OpenFL есть возможность установить Haxe с помощью команд Yeoman. Homebrew и Chocolatey также предоставляют аналогичные пути.)

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

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

Для целей этого краткого руководства мы будем использовать VSCode. Может быть проще всего получить Haxe Extension Pack через Ctrl+P и ext install haxe-extension-pack , но если вы приверженец минимализма, вы можете просто ext install vshaxe для самого базового плагина Haxe и выбрать любой из них. другие части пакета, которые могут вам понадобиться.

Создание проекта 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] } }

Теперь из Test.hx вы можете запустить 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, вы можете проверить вывод из командной строки следующим образом:

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

В противном случае код в haxe-test.js готов к работе — если вы включите его в веб-страницу, вы увидите вывод в консоли разработчика вашего веб-браузера при загрузке.

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

Допустим, вам также нужен собственный двоичный файл для рабочего стола, на котором вы разрабатываете. Для этого мы собираемся транспилировать в целевой C++, чтобы затем использовать C++ (при условии, что он у вас установлен) для компиляции вывода .cpp в собственный двоичный файл. Для этого нам понадобится 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)

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

 -main Test # tells Haxe our main class is Test (case-sensitive) --each # all of the above commands will be applied to each target -js haxe-test.js # our first transpilation target --next # no other options, time to move to the next target -cpp bin # our second transpilation (and compilation) target

Обратите внимание на разницу в префиксах: -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

Точно так же «сборка и запуск» для собственного двоичного файла будет выглядеть так (то есть в Linux — для Windows потребуется вариант):

 -main Test -cpp bin -cmd bin/Test

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

Примечание. Будьте осторожны, если у вас открыто несколько окон VSCode — на момент написания этой статьи это может вызвать проблемы со сборкой с помощью Ctrl+B. (Вы все еще можете использовать командную строку, без проблем.)

Хакс 4

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

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

Итак, что еще предлагает Haxe 4?

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

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

Но Haxe 4, в частности, увидит:

  • Выполнение макросов в 4 раза быстрее.
  • Поддержка PHP5 прекращена.
  • Сделаны некоторые синтаксические обновления, которые, вероятно, понравятся пользователям TypeScript, даже если они немного различаются между двумя языками. А именно, стрелочные функции и новый синтаксис типов функций.

Учебники по Haxe

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

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

Но иногда то, что может помочь вам начать работу, — это более конкретное руководство. Например, учебник от начала до конца о том, как создать игру про поиск подземелий в HaxeFlixel. Существует также серия руководств по HaxeFlixel, которые объясняют больше того, что происходит за кулисами по мере их продвижения. Что касается 3D, есть руководство Haxe по началу работы с Armory.

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


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

Связанный: Обзор Haxe: особенности и сильные стороны Haxe 4