Haxe: o segredo mais bem guardado do desenvolvimento multiplataforma

Publicados: 2022-03-11

A linguagem de programação moderna Haxe é bem conhecida em alguns círculos, mas muitos lendo isso nunca ouviram falar dela. Não deixe seu status de nicho enganá-lo, no entanto. Desde que apareceu pela primeira vez em 2005, foi testado em batalha por seus seguidores leais - embora bastante silenciosos. Possui uma combinação pragmática e madura de recursos para desenvolvimento em negócios, jogos e até contextos acadêmicos.

Disney, Hasbro e BBC estão usando o Haxe, então por que mais desenvolvedores não ouviram falar dele? Talvez sua versatilidade signifique que não existe um único “aplicativo matador” para a linguagem de programação Haxe.

Ou talvez seja porque um de seus primeiros aplicativos assassinos - um caminho de migração para longe da plataforma Flash moribunda - é um pouco de nicho em alguns aspectos. O venerável mercado de jogos casuais tem corrido nos últimos anos sob a sombra da incerteza da Adobe, e agora está finalmente claro que qualquer coisa baseada em Flash terá que mudar oficialmente até 2020.

Engenheiros de software de negócios e desenvolvedores da web – na verdade, muitos desenvolvedores de jogos também – podem ouvir “Flash” e imediatamente se desligar. Daí a Haxe Foundation pegando o FlashDevelop IDE e renomeando-o mais como um Haxe IDE, HaxeDevelop.

Mas pode ser difícil se livrar de uma associação – especialmente quando ela continua sendo bastante relevante. Por exemplo, a FlowPlay, cujos jogos sociais têm 75 milhões de usuários, escolheu Haxe em vez de Unity e HTML5 para sua recente transição de dois anos de 1,4 milhão de linhas de código longe do Flash. (Mais detalhes estão disponíveis no estudo de caso.)

Talvez seja difícil para a Fundação Haxe ser capaz de destacar casos de uso como esse, enquanto ainda atrai desenvolvedores de softwares que não são de jogos. Mas não deixe que isso o impeça de uma pequena exploração.

Qual é o grande problema com Haxe?

O projeto Debian descreve o Haxe como uma “linguagem de programação universal”. Há vários aspectos nisso.

Em geral, a linguagem Haxe significa reutilizar código (bom) . Com isso quero dizer: você pode reutilizar o código Haxe em muitas plataformas, você pode integrá-lo com o código Haxe existente e não-Haxe e, para o bem , a linguagem Haxe disponibiliza muitos paradigmas testados e comprovados, como segurança de tipos.

Continuando com o tema da versatilidade, isso se traduz em várias categorias principais de casos de uso — deixando de lado a migração do Flash, é claro.

Desenvolver um aplicativo ou jogo multiplataforma do zero. O Haxe pode segmentar plataformas de desktop, dispositivos móveis e web, tudo a partir de uma base de origem de um único idioma. As linguagens de programação multiplataforma não são novidade, e existem soluções especializadas para aplicativos e jogos para desktop e dispositivos móveis multiplataforma. Mas o Haxe faz algo um pouco mais especial no sentido de que pode atingir não apenas múltiplas plataformas, mas múltiplos paradigmas, por exemplo, HTML5 e binários nativos.

Uma língua “para governar a todos”. Perdoe a referência de Tolkien, mas assim como o Node.js saudou uma era de usar a mesma linguagem no front e back end de um site, qualquer projeto com algo parecido com uma arquitetura cliente-servidor pode usar o Haxe para ambas as metades.

Por exemplo, o aplicativo Web FontStruct usa Haxe tanto para desenhar em uma tela HTML5 no front-end quanto via Java2D no back-end. (Mas, como mencionado, essa abordagem é opcional - o Haxe também funciona bem com o código não-Haxe existente, porque foi projetado para não prender você.) Mantendo aplicativo, jogo, negócios e até mesmo renderizando lógica consistente em todos os contextos, plataformas, e as linguagens de saída são muito mais fáceis dessa maneira.

Fugindo do JavaScript para a segurança de tipos. Espere, não é para isso que serve o TypeScript? Sim, se você quiser ficar limitado à saída JavaScript. A linguagem Haxe, por outro lado, também pode transpilar para Java, C++, C#, Python e Lua, entre outros.

Enquanto isso, a linguagem de programação Haxe é bastante fácil de aprender vindo do JavaScript – sua sintaxe não significa uma grande mudança de paradigma como, digamos, a do Rebol, apesar dos benefícios de tal mudança. O desenvolvedor principal do Haxe, Dr. Andy Li, escreveu uma comparação mais detalhada entre o TypeScript e o Haxe que ainda é relevante hoje, embora ambas as linguagens continuem a evoluir.

Fluxo de trabalho bastante rápido para um compilador. Esta é uma peça adicionada mais recentemente (embora o Neko fosse uma opção antes): HashLink é uma máquina virtual (VM) multiplataforma que parece encontrar um equilíbrio entre ser extremamente rápida para compilar, mas também com desempenho suficiente em tempo de execução para coisas como jogos 3D. Mas mesmo no lado da web, o Haxe pode superar o TypeScript tanto em tempo de compilação quanto em tempo de execução.

Uma fronteira emocionante. O próprio Haxe é de código aberto e tem uma comunidade ativa, com novos recursos de linguagem sendo adicionados o tempo todo. Seu próprio sub-segredo mais bem guardado pode ser apenas seu sistema de macro em tempo de compilação, que tem muitos casos de uso interessantes, permitindo que você meta-programe para o conteúdo do seu coração. (Cito alguns exemplos abaixo.)

Quem mais está usando Haxe?

Para iniciantes, desenvolvedores de jogos, é claro: Madden NFL Mobile, Evoland II, Double Kick Heroes… esses e centenas de outros jogos publicados foram desenvolvidos usando Haxe. Mas Haxe também está fazendo ondas fora da esfera dos jogos:

  • Em 2014, a TiVo usou o Haxe para aumentar o desempenho em suas caixas TiVo Premiere em mais de 30%.
  • A Massive Interactive, cujos clientes incluem DAZN e Telecine para sistemas de “smart TV” baseados em Haxe (ambos com grandes bases de usuários), vem usando Haxe há anos. O arquiteto de interface do usuário Philippe Elsass observou para mim que, em sua experiência trabalhando com grandes projetos da Web, o Haxe tende a ser mais simples de usar do que o TypeScript e cerca de uma ordem de magnitude mais rápido para compilar.
  • A Synolia usa a linguagem Haxe para sua ferramenta de personalização online Heidi, que é usada pelas grandes marcas francesas Carrefour e La Fnac, e também pela Nickelodeon. De acordo com Synolia, o kit de ferramentas Haxe permitiu que eles gerenciassem com eficiência a transição do Flash para o HTML5, ao mesmo tempo em que puderam aproveitar novas oportunidades de desenvolvimento de negócios na esfera móvel. Heidi sendo um aplicativo SaaS, o kit de ferramentas Haxe permitiu que eles compartilhassem código-fonte comum entre as diferentes camadas e serviços do aplicativo.
  • A empresa multinacional Docler Holding tornou-se parceira estratégica da Fundação Haxe em 2017.

Como é o ecossistema Haxe?

Quando se trata de jogos e Haxe, é um mundo amplo em termos de estruturas e bibliotecas de código aberto. De equipes independentes independentes a estúdios de sucesso com clientes internacionais, os usuários do Haxe estão compartilhando código em todos os lugares:

  • Flambe é usado por marcas como Disney, Coca-Cola e Toyota para desenvolver jogos HTML5.
  • Heaps é a estrutura de jogo de alto desempenho por trás do recente sucesso de estratégia 3D Northgard.
  • Alimentando milhões de jogos móveis, a biblioteca de desenvolvimento rápido awe6 é talvez uma jóia escondida dentro de uma jóia escondida.
  • Kha, que pode ter como alvo o XBox One, Nintendo Switch e PlayStation 4, além de desktop e celular, tem mais de 20 mecanismos de jogo construídos sobre ele. Isso inclui o Armory, que tem integração total com o Blender e recentemente se tornou open-source.
  • Originalmente modelado com base na antiga biblioteca Flixel para Flash, HaxeFlixel é a escolha popular por trás de jogos como o sucesso de dormir Defender's Quest .
  • O Starling da Gamua, o framework usado para o porte do Angry Birds para o Facebook há alguns anos, agora tem um porte Haxe de código aberto.
  • O OpenFL, baseado na API do Flash, também será em breve uma maneira de direcionar vários consoles - ou seja, o PlayStation 4, o PlayStation Vita, o XBox One e o Nintendo Switch - sem taxas de licenciamento adicionais. HaxeFlixel e Starling são ambos construídos em cima do OpenFL, mas alguns jogos são desenvolvidos diretamente no OpenFL, como o premiado Papers, Please .
  • O Native Media Engine, NME, do qual o OpenFL foi bifurcado há muitos anos, ainda está lançando versões principais também.
  • Talvez você tenha visto quando HaxePunk (descendente de FlashPunk) foi apresentado no blog Release Radar do GitHub.
  • O altamente otimizado Nape Physics Engine é ótimo para qualquer mecanismo de jogo 2D ou simulador que precise de física mais sofisticada.

É verdade que a cena de desenvolvimento de jogos é uma parte mais visível do ecossistema da linguagem Haxe. (Talvez isso se deva à natureza de game jams como Ludum Dare?) Mas os negócios e até mesmo os aspectos empresariais também estão aparecendo. Por exemplo:

  • A estrutura de aplicativo modular hexMachina oferece suporte ao uso de linguagem específica de domínio (DSL) e arquitetura de controlador de exibição de modelo (MVC), entre muitos outros recursos.
  • O mecanismo de layout da interface do usuário HaxeUI está evoluindo ativamente e tem suporte corporativo. Produtos como 3DVista e Kaizen for Pharma já vêm com aplicativos de produção.
  • Não é o único, mas a biblioteca thx.core e seus parentes fornecem extensões de uso geral para o Haxe, assim como o Lodash faz para JavaScript.
  • Falando em JavaScript, os projetos da Haxe que o visam podem se beneficiar da alavancagem do Haxe Modular, que ajudou a Telecine e a FlowPlay a dimensionar seus enormes projetos, mantendo-os carregando rapidamente no lado do cliente.
  • O ecossistema da Haxe também continua a evoluir para interagir com as tecnologias atuais; por exemplo, agora existe uma biblioteca GraphQL.
  • Por fim, o exemplar Tinkerbell aproveita o sistema macro do Haxe para todos os tipos de tarefas úteis. Ele possui estruturas para roteamento na Web, teste de unidade e incorporação de SQL, bem como bibliotecas para tudo, desde modelagem e análise de seletor de CSS até manipulação de estado reativo async/await e curva de aprendizado inferior.

Estes são apenas destaques de algumas das direções que os usuários da linguagem Haxe tomaram até agora. Haxe.org mantém uma lista completa de bibliotecas classificadas por popularidade que você também pode navegar por tag. Mas também vale destacar alguns projetos que a própria Fundação Haxe mantém:

  • Para o ângulo do DevOps, há o repositório oficial do Haxe Docker.
  • Em termos de estabilidade, mesmo com uma grande atualização de versão, o Haxe 4 terá alguma ajuda de compatibilidade para aqueles com projetos dependentes do Haxe 3.

Isso tudo soa bem, mas como é ter um ambiente de desenvolvimento em seu sistema?

Haxe Quick Start

Seja para Win, Mac ou Linux, o primeiro passo é baixar o Haxe. O instalador fornecerá algumas coisas diferentes:

  1. O próprio compilador Haxe , que deve permitir que você execute o haxe a partir do seu terminal ou prompt de comando.
  2. A biblioteca padrão Haxe , permitindo o básico de baixo nível, mas também algum suporte de propósito geral de nível superior. Por exemplo, XML, processamento ZIP e acesso MySQL são todos facilitados aqui.
  3. O gerenciador de pacotes Haxelib , que permite instalar novos pacotes através do comando haxelib . (Nota: também vale a pena conferir o lix para um gerenciamento de pacotes mais avançado do que o Haxelib fornece, especialmente se você estiver pensando em usar o Haxe em um contexto profissional.)
  4. Neko , um destino de máquina virtual que permite recompilação e depuração rápida e eficiente.

(Dito isso, há mais de uma maneira de configurar. Se você já tiver o npm instalado, por exemplo, as instruções de instalação do OpenFL têm a opção de instalar o Haxe via comandos Yeoman. Homebrew e Chocolatey também fornecem caminhos semelhantes.)

De qualquer forma, uma vez que você tenha o Haxe, você poderá usá-lo a partir da linha de comando por si só, mas os desenvolvedores geralmente optam por usar um IDE. FlashDevelop/HaxeDevelop ainda é suportado principalmente apenas no Windows. A maioria das outras opções são multiplataforma (Win/Mac/Linux):

  • O plugin Haxe do VSCode é bem suportado.
  • O IntelliJ IDEA também possui um plugin Haxe.
  • O framework de jogos Kha tem seu próprio IDE chamado Kode Studio (Win/Mac/Linux).
  • O Sublime Text e o Atom têm plugins Haxe, assim como muitos outros editores, alguns dos quais são específicos da plataforma.

Para os propósitos deste guia de início rápido, usaremos o VSCode. Pode ser mais simples obter o Haxe Extension Pack via Ctrl+P e ext install haxe-extension-pack , mas se você é um minimalista, pode apenas querer ext install vshaxe para o próprio plugin básico do Haxe e escolher qualquer um outras partes do pacote que você pode querer.

Criando um projeto Haxe

Como a linguagem Haxe pode ser transpilada para muitos destinos, o gerenciamento de como isso é feito para cada um é facilitado usando um arquivo de compilação. No entanto, para começar, tudo o que precisamos é de um único arquivo de classe Haxe com uma extensão .hx .

Quanto ao código que colocaremos nele, vamos pegar o exemplo Array Comprehension de try.haxe.org e colocá-lo em um arquivo chamado 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] } }

Agora, da localização do Test.hx , você pode executar o Haxe no modo de interpretação, ou seja, sem transpilar, para ver a saída dessas duas chamadas 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]

Ótimo, funciona!

Transpilando código Haxe para JavaScript

Suponha que você queira compartilhar isso com o mundo por meio de algum JavaScript em uma página da web sua. Isso está embutido no Haxe e é tão fácil quanto:

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

Se você tiver o Node.js instalado, poderá verificar a saída na linha de comando da seguinte forma:

 $ 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 ]

Caso contrário, o código em haxe-test.js está pronto para ser usado - se você incluí-lo em uma página da Web, verá a saída no console do desenvolvedor do navegador da Web ao carregar.

Transpilando e compilando para um binário nativo

Digamos que você também queira um binário nativo para a área de trabalho em que está desenvolvendo. Para fazer isso, vamos transpilar para o destino C++, para que possamos usar C++ (supondo que você o tenha instalado) para compilar a saída .cpp para um binário nativo. Para isso, vamos precisar de hxcpp , então vamos precisar instalá-lo:

 $ haxelib install hxcpp

Depois disso, podemos fazer transpilação e compilação de uma só vez com este comando:

 $ haxe -main Test -cpp bin

E então nosso binário está pronto para ser executado:

 $ 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]

(No Windows, isso seria bin\Test.exe .)

Criando um arquivo de compilação Haxe (.hxml)

Apesar da extensão sugestiva, os arquivos .hxml não são XML—ao contrário dos arquivos .hxproj usados ​​pelo HaxeDevelop e FlashDevelop, mas não abordarei isso neste artigo. Veja como seria um build-all.hxml para realizar a transpilação que fizemos acima:

 -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

Observe a diferença nos prefixos: -main , -js e -cpp são parâmetros que você passaria para haxe diretamente, enquanto --each e --next (dois hífens) estão em um meta-nível, dizendo ao compilador o que fazer com os outros parâmetros.

Agora você pode atingir alvos JavaScript e nativos simplesmente executando haxe build-all.hxml .

Se você quiser transpilar para JavaScript e executar imediatamente o resultado usando o Node, poderá executar haxe run-js.hxml , em que run-js.hxml se parece com isso:

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

Da mesma forma, um “compilar e executar” para o binário nativo ficaria assim (no Linux, ou seja, uma variação seria necessária para o Windows):

 -main Test -cpp bin -cmd bin/Test

E o VSCode? Essa parte é simples: a extensão que você instalou pegará automaticamente esses arquivos .hxml , fornecendo tarefas de compilação geradas automaticamente (sem um tasks.json ) em uma lista suspensa, permitindo que você escolha qual arquivo de compilação usar.

Nota: No entanto, tenha cuidado se você tiver várias janelas do VSCode abertas - no momento em que este artigo foi escrito, isso pode causar problemas com a construção via Ctrl+B. (Você ainda pode usar a linha de comando, sem problemas.)

Haxe 4

Se você seguiu a configuração acima, deve ter notado que a página de download inclui links para as ramificações 3.xe 4.x do instalador do Haxe.

A versão de ponta 4 do compilador Haxe traz muitas novidades. Em um caso, isso também é uma prova do poder de seu sistema de macros: o compilador Haxe costumava não ter suporte para funções lambda curtas, então a biblioteca slambda implementou suporte para elas por meio de macros. A partir da versão 4, o suporte está embutido no compilador e a biblioteca está sendo preterida.

Então, o que mais Haxe 4 está trazendo para a mesa?

Não necessariamente muitos captadores de atenção. Em vez disso, o Haxe 4 tem muitas melhorias menores. Afinal, o próprio Haxe é uma tecnologia bastante madura, desenvolvida por uma equipe menor e mais focada, talvez, do que projetos semelhantes - e talvez seja um pouco exagerado chamar qualquer projeto de semelhante a Haxe.

Muitos de seus recursos mais interessantes já estão presentes há algum tempo. Por exemplo, mencionei acima que o Haxe fornece um fluxo de trabalho rápido via Neko ou HashLink. Mas desde 2016, também possui um servidor de compilação. Isso significa que, para destinos não VM, recompilar um projeto que depende de uma grande biblioteca será muito mais rápido devido ao cache na memória, que também pode ser aproveitado pelos IDEs Haxe para conclusão de código.

Mas Haxe 4, em particular, verá:

  • Execução de macro sendo 4x mais rápida.
  • Suporte PHP5 sendo descartado.
  • Algumas atualizações sintáticas feitas que os usuários do TypeScript provavelmente serão bem-vindas, mesmo que sejam ligeiramente diferentes entre as duas linguagens. Ou seja, as funções de seta e a nova sintaxe do tipo de função.

Tutoriais Haxe

Embora você sempre possa mergulhar direto na API padrão do Haxe ou na documentação de sintaxe, também existem alguns materiais Haxe mais amigáveis ​​para iniciantes disponíveis.

Se você preferir se orientar com vídeos, o Haxe US Summit 2018 em Seattle tem seus workshops ao lado dos de outros anos, para obter uma visão mais privilegiada.

Mas às vezes o que pode ajudar você a começar mais facilmente é um tutorial mais específico. Como um tutorial do início ao fim sobre como construir um jogo de rastreador de masmorras no HaxeFlixel. Há também uma série de tutoriais HaxeFlixel que explicam mais sobre o que está acontecendo nos bastidores à medida que avançam. No final 3D, há um tutorial Haxe sobre como começar com o Armory.

Ou talvez você queira apenas um tutorial do Haxe sobre o processamento rápido de XML - este é um entre muitos tutoriais que já têm alguns anos, mas ainda são bastante relevantes. Como mencionei anteriormente, embora existam muitas fronteiras, muitos dos fundamentos do desenvolvimento em Haxe são estáveis ​​neste momento, então os tutoriais não necessariamente ficam obsoletos muito rapidamente. (Onde eles fazem, geralmente é de uma dependência de uma biblioteca específica, não do próprio núcleo Haxe.)


Como você pode ver, você pode usar a linguagem Haxe – ou ela pode levá-lo – em muitas direções diferentes. Espero que você tenha gostado desta introdução ao mundo diversificado e fascinante de Haxe, e estou ansioso para saber o que você vai fazer com a tecnologia de Haxe!

Relacionado: Revisão do Haxe: Recursos e pontos fortes do Haxe 4