Revisión de Haxe: características y fortalezas de Haxe 4

Publicado: 2022-03-11

Nuestra revisión anterior de Haxe terminó con una mirada al próximo Haxe 4. Con el lanzamiento oficial de Haxe 4 (y poco después, dos lanzamientos de parches de errores: versión 4.0.1 y 4.0.2), es hora de una nueva revisión de Haxe. . ¿Cuáles son las últimas incorporaciones a este floreciente lenguaje de programación? ¿Hacia dónde se dirige la comunidad del lenguaje de programación Haxe? ¿Siguen siendo los motores de juego Haxe su pilar?

Revisión de Haxe: nuevas características de Haxe 4

Con más de tres años de desarrollo desde la última versión importante, la versión 4 del lenguaje de programación Haxe mejora el rendimiento de las macros, la experiencia del desarrollador y la sintaxis. Tres de sus mejoras todavía se consideran experimentales, pero vale la pena destacarlas: el nuevo objetivo de código de bytes de JVM, soporte para marcado en línea y controles de seguridad nulos.

El objetivo de compilación de bytecode de JVM experimental en Haxe 4

El nuevo objetivo de código de bytes JVM de Haxe 4 hace que el desarrollo de Java a través de Haxe sea un poco más eficiente al eliminar un paso de compilación importante: no hay un segundo paso para que el propio compilador de Java ( javac ) compile la salida del código fuente de Java del transpiler de Haxe.

Una comparación del nuevo destino JVM directo con el flujo de trabajo original cuando se desarrolla para un destino Java. El original toma una fuente .hx, produce una fuente .java, que a su vez debe compilarse con un compilador Java (que depende del JDK) antes de que finalmente se produzca un archivo .jar ejecutable. El nuevo objetivo permite a los desarrolladores pasar directamente de la fuente .hx a un archivo .jar ejecutable.

Este método de compilación con Haxe 4 también elimina por completo la dependencia del kit de desarrollo de Java (JDK) y abre la puerta para que se implemente la depuración interactiva en el futuro.

Hasta que la versión principal de hxjava sea compatible con Haxe 4, la configuración básica implica instalar Haxe y Haxelib, luego ejecutar haxelib install hxjava 4.0.0-alpha . Una vez hecho esto, el flujo de desarrollo es simple:

 # transpile directly to JVM bytecode with Haxe (-D jvm would also work): haxe --main HelloWorld --java jar_output --define jvm # run JVM bytecode with Java: java -jar jar_output/HelloWorld.jar

Dado que la compilación directa de JVM todavía tiene un estado experimental en Haxe 4, viene con un par de advertencias:

  • Hay algunos problemas específicos de Android.
  • El rendimiento del tiempo de ejecución no es tan bueno, incluso si eventualmente será más rápido que el método indirecto.

No obstante, es un paso notable en la dirección correcta para cualquiera que aproveche las tecnologías basadas en Java.

Soporte de marcado en línea experimental en Haxe 4

JSX, ¿alguien? Haxe 4 permite el marcado en línea, lo que permite a los desarrolladores escribir, por ejemplo, HTML directamente dentro del código fuente de Haxe:

 var dom = jsx( <div> <h1>Hello!</h1> <p>This is a paragraph.</p> </div> );

Dado que jsx() aquí puede ser una función de macro estática, esto permite que un proyecto tenga comprobaciones en tiempo de compilación para determinar si el marcado se ajusta a cualquier especificación XML que el desarrollador quiera implementar. Dado que la compatibilidad con XML está integrada en la API de Haxe, la verificación puede aprovechar Xml.parse() , pero para la capacidad de análisis básica "XML-ish", ni siquiera se necesita:

 static macro function jsx(expr) { return switch expr.expr { case EMeta({name: ":markup"}, {expr: EConst(CString(s))}): macro $v{"XML MARKUP: " + s}; case _: throw new haxe.macro.Expr.Error("not an xml literal", expr.pos); } }

La intención con esta característica es ayudar a empujar a Haxe fuera de la burbuja del desarrollo de juegos (aunque seguramente también tiene usos allí). Es lo suficientemente general como para que se implemente en el nivel del compilador, por lo que no necesita la API de Haxe en la macro anterior, pero la verificación de DSL específicos es la siguiente pregunta que debe resolver el equipo del compilador y la comunidad.

Seguridad Nula Experimental en Haxe 4

Desde la invención de la referencia nula en 1965, el problema de la seguridad nula ha sido a menudo la pesadilla de los desarrolladores en entornos tipificados anulables como el del lenguaje de programación Haxe. Aleksandr Kuzmenko estima que GitHub se compromete a corregir errores de referencia de puntero nulo que superan los 10 millones.

Haxe 4 tiene macros de seguridad nulas integradas en tiempo de compilación, que se pueden habilitar al incluir una línea @:nullSafety justo antes de una definición dada. Viene en @:nullSafety(Loose) (predeterminado) y @:nullSafety(Strict) , y se puede desactivar según sea necesario con @:nullSafety(Off) . El modo Strict buscará en las llamadas de función las mutaciones de campo que podrían asignar un valor nulo, incluso en un contexto de inhabilitación de seguridad nulo.

Los desarrolladores de Ruby pueden preguntarse si el práctico operador de navegación segura ( ?. en Ruby) está en el radar. Todavía no, pero como ocurre con muchos aspectos de la programación en Haxe, hay una macro para eso (tenga en cuenta que usa !. en su lugar).

Experiencia de desarrollador (DX) con Haxe 4: adiciones de sintaxis, azúcar sintáctico y más

Las adiciones relacionadas con DX al lenguaje de programación Haxe y la compatibilidad con Haxe IDE brindan la experiencia de Haxe 4 al menos al nivel de otros lenguajes de programación en varios frentes. De alguna manera, Haxe busca ser todo para todos, pero el equipo compilador adopta un enfoque reflexivo para integrar las características y convenciones más útiles de otros lenguajes.

El resultado es que el lenguaje de programación Haxe y la API estándar evolucionan sin comprometer su estabilidad, sensibilidad y cohesión. No todo en esta revisión de Haxe parecerá digno de exageración, y ese es precisamente el punto: DX está mejorando, y esto está a favor de simplemente perseguir llamativas "características del día ".

Sin embargo, se debe lograr un equilibrio: los cambios de Haxe se realizan teniendo en cuenta los patrones que siguen otros idiomas, y Haxe 4 ciertamente hace un esfuerzo por atraer a los recién llegados de idiomas más populares.

Nueva sintaxis de "Tipo de función"

En ese sentido, Haxe ahora admite dos formas principales de representar tipos de funciones. La sintaxis anterior "sugiere que se admiten la aplicación parcial y la ejecución automática, pero no lo son", según la propuesta de función original:

 Int -> String -> Void

La nueva sintaxis permite argumentos con nombre, lo que mejora DX:

 (id:Int, name:String) -> Void

Pero aparte de DX, usar la nueva sintaxis de Haxe 4 para los tipos de funciones es un buen hábito, ya que la antigua sintaxis inferior puede eliminarse en una versión principal futura.

Azúcar sintáctico... Más o menos

Tal vez no sea innovador, pero las mejoras sintácticas de Haxe 4 serán una buena noticia tanto para los desarrolladores de Haxe existentes con ciertos antecedentes de desarrollo (ES6, por ejemplo) como para aquellos que puedan venir de ellos a Haxe por primera vez.

Ahora se admite la sintaxis de la función de flecha ("lambda abreviada"), que en el caso de Haxe es más o menos un atajo para escribir function y return . Ahora también se admiten las sintaxis de iteración de clave-valor e índice-valor (para mapas y matrices, respectivamente). Las declaraciones de tipos que usan extensiones estáticas pueden using una declaración de uso globalmente en lugar de necesitarlas en todas partes donde se usan los métodos de extensión estática correspondientes.

Las enumeraciones y los resúmenes de enumeración tienen algunas otras mejoras, una de las cuales es que estos últimos han pasado del ámbito de las macros a tener compatibilidad directa con el compilador. Otras características movidas de manera similar incluyen clases finales, interfaces finales y campos externos.

Algunas características que dependen de macros siguieron dependiendo de macros, pero mejoraron de todos modos. La sobrecarga de operadores se niveló para incluir configuradores de campo, y los metadatos ahora pueden tener espacios de nombres con . separadores como en @:prefix.subprefix.name .

Llamar azúcar sintáctico a los cambios anteriores es ciertamente simplificar demasiado, pero los lectores pueden profundizar en las propuestas originales vinculadas a las notas de lanzamiento de Haxe 4 donde necesitan más detalles.

Más potenciadores de Haxe 4 DX

Si bien la depuración interactiva ya era posible en Haxe para varios objetivos compilados, el nuevo objetivo eval hace posible la depuración interactiva para el código interpretado. Para un ejemplo simple, puede tomar cualquier directorio de proyecto del tutorial "Hello, World" de Haxe, agregar un archivo llamado whatever-you-want.hxml con este aspecto:

 --main HelloWorld --interp

…y obtenga una depuración interactiva en el IDE de VSCode simplemente haciendo lo siguiente:

  1. Abriendo el directorio del proyecto en VSCode;
  2. Agregar un punto de interrupción en algún lugar; y
  3. Presionando F5 y eligiendo "Haxe Interpreter" del menú desplegable.

Esta característica también le permite depurar código de macro de forma interactiva de la misma manera, incluso si en realidad está compilando para un objetivo en particular como java (en lugar de usar --interp ). El único requisito de instalación además de Haxe y VSCode es la extensión Haxe VSCode.

Servicios IDE

Hablando de IDE, Haxe 4 presenta un nuevo protocolo de servicios IDE, que ya se aprovecha en la última extensión de VSCode Haxe, vshaxe. Además de un aumento significativo del rendimiento, esto permite que vshaxe proporcione algunas mejoras de DX extremadamente útiles, que incluyen:

  • Importaciones automáticas (tan esperadas)
  • Sugerencias de autocompletado que muestran más detalles, como responder a la pregunta "¿De dónde es este campo?"
  • Completado automático muy completo en varias formas nuevas e ingeniosas, como finalización de tipo esperado, finalización de postfijo y finalización de anulación
  • Optimizaciones de pulsación de tecla al escribir código

Es mucho más fácil ver el valor de estos a través de las excelentes demostraciones visuales del registro de cambios de vshaxe relevante. vshaxe con VSCode no es el único IDE de Haxe que existe: HaxeDevelop y Kode Studio son específicos de Haxe, y hay complementos de Haxe IDE para IntelliJ IDEA, Sublime Text, Atom, etc., pero parece estar por delante del resto en términos de hacer uso del nuevo protocolo de servicios IDE de Haxe 4, seguido de cerca por IntelliJ-Haxe.

Literales Unicode

Los desarrolladores que deseen utilizar literales de cadena Unicode reales encontrarán soporte para eso en Haxe 4, pero hay algunos matices a tener en cuenta.

Matrices de solo lectura

La API estándar de Haxe ahora tiene arreglos de solo lectura. Estos son tan fáciles de usar como declarar que una variable es del tipo, por ejemplo, haxe.ds.ReadOnlyArray<Int> , después de lo cual intentar establecer, enviar o extraer valores da como resultado varios errores del compilador. Agregue la palabra clave final a la declaración y tampoco se permitirá reasignar la matriz.

Inserción del sitio de llamadas

La integración del sitio de llamadas es una nueva característica del lenguaje Haxe que permite a los desarrolladores un control detallado sobre dónde se insertan las funciones, lo cual es útil cuando se optimizan las funciones a las que se llama con frecuencia donde la compensación general entre el tamaño y el rendimiento podría ser una decisión de perder-perder.


Estas son adiciones valiosas al ya excelente lenguaje de programación Haxe. ¿Qué están construyendo los desarrolladores en la comunidad Haxe ahora que Haxe 4 está disponible?

Más allá de los motores de juego Haxe: desarrollo web con Haxe 4

Históricamente, la base de usuarios de Haxe ha estado dominada por programadores de juegos. Pero hay muchos ejemplos del uso de Haxe, a escala, en otros segmentos, como pilas de negocios, aplicaciones móviles y la web, tanto para el desarrollo de front-end como de back-end.

Con ese fin, Haxe 4 proporciona HTML externo regenerado, lo que significa que la API estándar js.html de Haxe se actualizó con la API web más amplia tal como la define MDN, además de corregir errores y agregar API faltantes. (Por ejemplo, Haxe 4 ahora incluye la API Push).

En la charla de Juraj Kirchheim, Tejiendo una mejor web con Haxe, señala ejemplos de soluciones web basadas en Haxe que son mucho más eficientes, pero también más sólidas, en un entorno empresarial.

También argumenta en contra del enfoque arquitectónico de Rails (en términos de jerarquía de carpetas), pero los desarrolladores que prefieren un marco web completo a la Rails aún pueden encontrar uno. Otras veces, puede ser beneficioso para los desarrolladores revisar el código fuente de un proyecto web completo, en cuyo caso vale la pena echar un vistazo al repositorio público de Giffon, una plataforma de multitud de obsequios compatible con Haxe 4. Del mismo modo, centrado en la web, abierto. Las bibliotecas fuente de Haxe, como Haxe Modular, que divide JavaScript, el genérico thx.core y sus bibliotecas hermanas, y el venerable conjunto de herramientas web de Haxe, Tinkerbell, ya son compatibles con Haxe 4. Lo mismo ocurre con la solución de interfaz de usuario multiplataforma HaxeUI, que admite un contexto web pero apunta a un alcance mucho más amplio que incluye el desarrollo de aplicaciones comerciales y de escritorio; en particular, ha continuado madurando de manera constante hasta el lanzamiento del nuevo idioma Haxe.

Web, juegos, empresa... independientemente de la plataforma y el estilo de la aplicación al que se dirija un equipo de desarrollo, incluso un equipo de uno, los desarrolladores de Haxe eventualmente tendrán que lidiar con la administración de dependencias. Para esto, un recurso útil para que los desarrolladores de Haxe revisen son las diapositivas de la charla de Adam Breece, Escalar bien con otros.

Haxe como el mejor lenguaje de programación para juegos

¿Existe un solo lenguaje "mejor" para el desarrollo de juegos? Es una pregunta subjetiva, y es fácil encontrar debates acalorados. Más grande de lo que cabría esperar solo por el tamaño de su comunidad, el éxito de Haxe en la esfera del desarrollo de juegos ciertamente no es una coincidencia. Joe Williamson brinda una idea de por qué esto podría estar en una entrevista sobre cómo ganar el atasco de juegos Ludum Dare 45 en 2019, y parece probable que esto continúe con Haxe 4.

El creador original de Haxe, Nicolas Cannasse, ya está usando Haxe 4 en producción con Northgard de Shiro Games. Motion Twin también está utilizando Haxe 4 en la producción de Dead Cells. Ambos juegos tienen decenas de miles de críticas positivas en Steam y están disponibles tanto para PC (Win, Mac y Linux) como para consolas, un resultado realmente formidable considerando que ambos juegos tienen equipos de desarrollo más pequeños pero bases de usuarios de millones. Dead Cells incluso tiene una versión de iOS, con una versión de Android en su radar también.

En cuanto a la biblioteca, varios de los principales motores de juego de Haxe definitivamente siguen el ritmo de los cambios de Haxe 4. Los motores compatibles con Haxe 4 incluyen Kha (y una parte de los muchos motores construidos sobre él, por ejemplo, Armory), HaxeFlixel y su dependencia principal OpenFL, NME y Heaps, naturalmente, ya que eso es lo que usan Northgard y Dead Cells. HaxePunk también está trabajando en la compatibilidad con Haxe 4; en un caso, una biblioteca, Nape, se bifurcó para trabajar con Haxe 4.

Algunos desarrolladores también crean sus propios motores en lugar de utilizar uno de los muchos que ya existen. Por ejemplo, Kirill Poletaev, quien detalla cómo y por qué escribió su propio motor de juego 3D Haxe. Dado que dicho motor es interno, tiene sentido que sea un ejemplo de un proyecto que aún no ha migrado a Haxe 4.

Haxe 4: Continuando la suave progresión de una excelente cadena de herramientas

Dado que Haxe tiene una utilidad tan amplia, las características más importantes de Haxe 4 variarán según el desarrollador, por lo que esta revisión de Haxe no es exhaustiva. Faltan algunos de los cambios de Haxe 4 arriba, incluyendo:

  • La adición de salida ES6 para el destino de JavaScript
  • La eliminación de funciones (algunas de las cuales todavía están disponibles a través de la biblioteca hx3compat ) y objetivos (PHP5 y pronto AS3)
  • Los indicadores de la CLI se hacen más consistentes con las herramientas comunes ( -lib -usando archivos .hxml deberá cambiarse a -L o --library , por ejemplo).
  • Además de que final ahora es una palabra clave (que, por lo tanto, no se puede usar como nombre de variable), el operator y la overload también son palabras clave recientemente reservadas.

También hubo algunos cambios importantes, pero son tan pocos que muchas bibliotecas mantenidas activamente ni siquiera se molestan en anunciar explícitamente la compatibilidad con Haxe 4; en general, se dice que la migración desde Haxe 3 es bastante sencilla. Después de todo, uno de los objetivos de Haxe es la estabilidad en medio del soporte de malabares para una gran cantidad de plataformas de destino, y Haxe 4 no decepciona aquí.

¿Qué pasa con los nuevos usuarios? Al final, depende del lector decidir si Haxe es el mejor lenguaje de codificación para juegos, si el ecosistema de Haxe ofrece las bibliotecas más sólidas para el desarrollo web o si las herramientas específicas de Haxe brindan el DX más sensible para un flujo de trabajo en particular. Como mínimo, Haxe continúa siendo un competidor viable en muchos espacios, ofreciendo una especie de ventaja secreta para casi cualquier desarrollador.

Lectura adicional: Los desarrolladores nuevos en Haxe pueden estar interesados ​​en un tutorial Haxe bastante nuevo de John Gabriele, y también en las notas de lanzamiento de Haxe 4.1.0 y Haxe 4.1.1.