Haxé

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 8 de octubre de 2017; las comprobaciones requieren 29 ediciones .
Haxé
clase de idioma Multi-paradigma
Apareció en 2005
Desarrollador Fundación Hax
Liberar 4.2.5 ( 6 de marzo de 2022 )
sistema de tipos estático , dinámico a través de anotaciones
sido influenciado Java , OCaml , ActionScript y MTASC [1]
Licencia GPL v2, biblioteca: MIT
Sitio web haxe.org
Plataforma BRAZO , IA-32 , x64
sistema operativo Android , iOS_ _ Linux , mac OS , Windows

Haxe es un compilador y un lenguaje de programación multiplataforma de alto nivel de código abierto que se puede usar para crear aplicaciones y generar código fuente para diferentes plataformas mientras se mantiene una única base de código [2] [3] [4] [5] .

Haxe incluye funcionalidad compatible con todas las plataformas , como tipos de datos numéricos, cadenas , matrices , así como soporte para algunos formatos de archivo ( xml , zip ) [3] [6] . Haxe también incluye soporte para API específicas para cada plataforma de compilación de destino.

El código escrito en el lenguaje Haxe se puede compilar en código JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua y Node.js [7] . El código Haxe también se compila en SWF, HashLink y Neko , bytecode , y también se puede ejecutar en modo de interpretación [7] .

Los principales usuarios de Haxe son TiVo , Prezi , Nickelodeon , Disney , Mattel , Hasbro , Coca Cola , Toyota y la BBC [8] [9] . OpenFL y Flambe  son marcos populares de Haxe para crear contenido y programas multiplataforma a partir de un único código base [9] . Además, Snõwkit [10] se encuentra actualmente en desarrollo activo . Debido al creciente desplazamiento de la tecnología Adobe Flash en los últimos años a favor de HTML5 , Haxe, Unity y otras herramientas multiplataforma están dedicando cada vez más tiempo a esta última, manteniendo el soporte anterior con Adobe Flash Player [9] [11] .

Arquitectura

Idioma único

El aspecto más significativo del desarrollo de la arquitectura Haxe fue la decisión de admitir Adobe Flash, JavaScript y aplicaciones de servidor en una única base de código [12] [13] . En proyectos web típicos, los desarrolladores deben usar muchos lenguajes diferentes para construir una aplicación web completa [12] [13] :

Haxe se creó con la idea de reunir todos estos componentes en un solo código base, además de simplificar la interacción entre los componentes de la aplicación [12] [13] [14] .

El libro, escrito por Nicholas Kennessy (fundador del proyecto Haxe), establece los objetivos originales de crear Haxe [12] :

Compilador

El compilador Haxe se divide en una interfaz y muchos backends. La interfaz es responsable del análisis y la verificación de tipos, la aplicación de macros, la optimización general, varias transformaciones de código y la creación de una representación intermedia del código en forma de árbol de sintaxis abstracta (ASD). Cada uno de los backends es responsable de traducir este AST al código fuente o código de bytes de la plataforma de destino.

El compilador está escrito en OCaml . Se puede ejecutar en modo servidor para admitir la finalización del código en el IDE, y también se admite un caché en este modo para reducir el tiempo de compilación [15] .

Rendimiento

El compilador Haxe es un compilador de optimización que también utiliza la sustitución de funciones , el plegado constante y la eliminación de código muerto (DCE) para optimizar el rendimiento de los programas compilados.

El rendimiento de los programas escritos en Haxe depende de la plataforma de destino.

Desarrollo

El desarrollo de Haxe comenzó en octubre de 2005 [20] y la primera versión beta se lanzó en febrero de 2006. Haxe 1.0 se lanzó en abril de 2006 y admitía renderización en Adobe Flash , Javascript y Neko .

Haxe fue desarrollado por Nicolas Cannasse y otros, y originalmente se llamaba haXe porque es un nombre corto y simple, y "tiene una X en el nombre", un atributo necesario para que una nueva tecnología tenga éxito, señaló con humor el autor del idioma [21] .

Haxe es un sucesor ActionScript 2 de código abierto del compilador MTASC , también creado por Nicholas Hennessy [12] [22] y publicado bajo la licencia pública general GNU versión 2 o superior [23] .

Haxe tiene mucho en común con ActionScript 3 . El compilador Haxe está desarrollado en el lenguaje OCaml , pero para escribir en Haxe no se requiere conocimiento de OCaml.

Los beneficios de usar Haxe incluyen:

Código fuente

El IDE recomendado para el desarrollo de Haxe es FlashDevelop [12] que admite ActionScript 2, 3 y Haxe como lenguajes principales con resaltado de sintaxis , finalización de código y otras funciones [12] [25] . Este IDE también es compatible con el plegado de código , la refactorización y la depuración interactiva . [26]

Para utilizar el código existente, la comunidad de código abierto ha creado convertidores de código fuente para:

Soporte de plataforma

El lenguaje Haxe se puede traducir al código de bytes de varias máquinas virtuales como Adobe Flash Player y Neko , así como código fuente de ActionScript 3 , JavaScript , incluidos C++ y C# con soporte experimental . Esta estrategia de "compilar" en varias fuentes se desarrolló bajo la inspiración del paradigma de "escribir una vez, ejecutar en cualquier lugar". Esta estrategia también permite al programador elegir la mejor plataforma para ejecutar los programas.

Generador de códigos Resultado Plataforma Uso ¿De qué versión de Haxe
MAV1 [6] código de bytes Adobe Flash Player 6+ Escritorio, Navegador 2005 (alfa)
AVM2 [6] código de bytes Adobe Flash Player 9+, Adobe AIR , máquina virtual Tamarin Escritorio, Navegador, Servidor 2005 (alfa)
ActionScript 3 [6] Fuente Adobe Flash Player 9+ servidor, escritorio 2007 (1,12)
C++ (hxcpp) [6] Fuente Windows, Linux, Mac OS X Servidor, Escritorio, CLI 2009 (2,04)
C++ Fuente Android [29] , Apple iOS [30] , Palm webOS [31] Móvil 2009 (2,04)
do# [6] Fuente .NET Framework Servidor, Escritorio, Móvil 2012 (2.10)
Java [6] Fuente Java servidor, escritorio 2012 (2.10)
JavaScript [6] Fuente HTML5 , Node.js , PhoneGap Servidor, Escritorio, Navegador, Móvil 2006 (beta)
Neko [6] código de bytes NekoVM Servidor, Escritorio, CLI 2005 (alfa)
PHP [6] Fuente PHP servidor 2008 (2,0)
pitón [6] Fuente Pitón CLI, web, escritorio 2014 (3,2)
Luá [32] Fuente Lúa Web, escritorio, móvil 2016 (3,3)

Idioma

Haxe es un lenguaje orientado a objetos de propósito general , con soporte para manejo de excepciones e inferencia de tipos para parámetros de clase. La programación genérica , la reflexión , los iteradores y la programación funcional también son compatibles con el lenguaje y las bibliotecas [33] . Haxe también, a diferencia de muchos otros idiomas, admite escritura estática y dinámica al mismo tiempo. El compilador puede verificar la inferencia de tipos y arrojar errores en tiempo de compilación, pero los desarrolladores también pueden desactivar la verificación de tipos y confiar en la verificación dinámica de tipos de la plataforma de destino.

El lenguaje Haxe es similar a ECMAScript , aunque prácticamente ningún código ECMAScript se puede compilar en Haxe sin modificaciones. A diferencia de ECMAScript, Haxe es un lenguaje compilado . Haxe fue influenciado por ActionScript , Java y OCaml [13] .

Dado que Haxe se basó en ActionScript 3 , es compatible con todas las funciones de la API de Flash, aunque requiere una mejor codificación y estándares de desarrollo más altos que los compiladores de Adobe.

hola mundo

Este programa escribirá "Hello World" después de compilar y ejecutar:

clase Principal { función estática principal () { traza ( "Hola mundo" ); } }

Puede probar este código guardándolo en un archivo con un nombre Main.hxy ejecutando el compilador Haxe con las siguientes opciones: haxe -main Main --interp. Este comando iniciará Haxe Compiler en modo de interpretación de código y mostrará Main.hx:3: Hello world.

El sistema de tipos

Haxe es un lenguaje tipificado estáticamente. Tiene un rico sistema de tipos, que incluye clases, interfaces, tipos funcionales, tipos anónimos, tipos de datos algebraicos ( ADT , llamados "enumeraciones" en Haxe), así como tipos de datos abstractos. Las clases, los tipos de datos algebraicos y los tipos de funciones admiten el polimorfismo paramétrico basado en el borrado de tipos, a menudo denominado "Genéricos" en otros lenguajes orientados a objetos.

Haxe incluye soporte para polimorfismo restringido y polimorfismo de subtipo .

Además, Haxe admite la tipificación estructural y la tipificación nominal . Para facilitar las cosas a los programadores y sin comprometer la seguridad de tipos, Haxe admite la inferencia de tipos, que en muchos casos elimina la necesidad de escribir tipos manualmente.

Clases

Las clases (palabra clave "clase") en Haxe son similares a las de Java o AS3 . Sus campos pueden ser métodos, variables de clase estáticas o propiedades de instancia de clase. Haxe admite atributos de acceso "público" y "privado", así como métodos de control de acceso más avanzados (ACL, enlaces) que se describen mediante anotaciones. Los métodos y las variables estáticas con un valor constante se pueden insertar utilizando la palabra clave "en línea".

Las interfaces en Haxe son similares a las interfaces de Java .

interfaz ICreature { public var nacimiento : Fecha ; nombre de la variable pública : cadena ; edad función pública (): Int ; } class Fly implementa ICreature { public var birth : Date ; nombre de la variable pública : cadena ; public function age (): Int return Date . ahora (). getFullYear () - nacimiento . obtenerAñoCompleto (); }

Enumeraciones

Los tipos enumerados  son una característica clave del lenguaje. Las enumeraciones pueden tener sus propios parámetros, además de ser recursivas [34] . Son similares a los tipos de datos algebraicos , ya que se encuentran en lenguajes como ML o Haskell . Estrictamente hablando, estos son tipos de suma correctos , siempre que los tipos de productos incluidos en ellos deban definirse dentro de estos tipos de suma. Esto significa que las enumeraciones no se denominan simplemente "números mágicos" como en la mayoría de los lenguajes, sino que pueden resolver con elegancia problemas arquitectónicos complejos:

enum Color { rojo ; verde ; azul ; rgb ( r : Int , g : Int , b : Int ); } class Colors { función estática toInt ( c : Color ) : Int { return switch ( c ) { case red : 0xFF0000 ; caja verde : 0x00FF00 ; caso azul : 0x0000FF _ caso rgb ( r , g , b ): ( r << 16 ) | ( gramo << 8 ) | segundo ; } } función estática llamadas válidas () { var redint = toInt ( Color . red ); var rgbint = toInt ( Color . rgb ( 100 , 100 , 100 )); } }

Haxe también admite tipos de enumeración paramétrica. Un ejemplo es la implementación de los tipos Opción, Cualquiera y ConsList, y ConsList también es recursivo:

enum Opción < T > { Algunos ( v : T ); ninguno _ } enum Cualquiera < T , U > { Izquierda ( v : T ); Derecha ( v : U ); } enumeración ConsList < T > { Nil ; Contras ( cabeza : T , cola : ConsList < T >); }

La documentación en el sitio indica [35] que Haxe también admite tipos algebraicos generalizados (GADT), pero no proporciona un ejemplo de cómo crear uno.

Tipos anónimos

Los tipos anónimos se definen mediante una descripción explícita de su estructura, también se les puede asignar un alias utilizando una definición de tipo (palabra clave "typedef"):

typedef Anon = { a : Int , b : String , c : Float -> Void };

Tipos de funciones

Los tipos de función son objetos de primera clase en Haxe. Se describen mediante flechas entre los tipos de argumentos y entre los tipos y el valor de retorno, como en muchos otros lenguajes funcionales. Sin embargo, a diferencia de Haskell o la familia ML , no todas las funciones en Haxe son unarias (funciones con un argumento), no se pueden aplicar parcialmente por defecto . Por lo tanto, las firmas de tipo en los siguientes ejemplos tienen un significado diferente al de los idiomas anteriores.

El tipo F es una función que toma un Int y un String como argumentos y devuelve un Float como resultado.

En lenguajes donde solo existen funciones unarias, este tipo significaría una función que toma un Int como argumento y devuelve una función de tipo String->Float.

Los tipos F2 y F3 describen el mismo tipo. Ambos describen funciones binarias que devuelven una función binaria de tipo F. Para F2 se describe el caso de utilizar un tipo de función dentro de otra definición.

typedef F = Int -> Cadena -> Flotante ; typedef F2 = Int -> Cadena -> F ; typedef F3 = Int -> Cadena ->( Int -> Cadena -> Flotante );

Tipos abstractos

El concepto, llamado tipos abstractos , es la última incorporación al sistema de tipos de Haxe. Permiten que los tipos existentes se reutilicen para fines específicos, como implementar tipos para unidades de medida, al tiempo que reducen en gran medida la posibilidad de mezclar diferentes sistemas (como millas y kilómetros). El término "tipo abstracto" en el contexto del lenguaje Haxe tiene un significado diferente al de los tipos abstractos regulares .

El siguiente ejemplo asume que el sistema métrico se usa de manera predeterminada y se requiere la conversión a millas para admitir datos heredados. Haxe puede convertir automáticamente millas a kilómetros, pero no al revés.

Resumen Kilómetro ( Flotante ) { función pública nueva ( v : Flotante ) esto = v ; } abstract Mile ( Float ) { public function new ( v : Float ) this = v ; @: a la función pública en línea toKilometer (): retorno de kilómetro ( nuevo kilómetro ( este / 0.62137 )); } clase Prueba { static var km : Kilómetro ; función estática principal (){ var one100Miles = nueva milla ( 100 ); km = una 100 millas ; traza ( km ); // 160.935 } }

El ejemplo muestra que no es necesario hacer una conversión explícita km = one100Miles;para usar las unidades correctas.

Tipificación estructural

La tipificación estructural juega un papel importante en muchos lenguajes de programación funcionales y, al mismo tiempo, bastante pequeño en los lenguajes OOP comunes. A diferencia del sistema de tipos nominales, la igualdad de dos tipos no está determinada por la igualdad de ningún nombre de tipo, sino por la estructura del tipo. Los tipos de estructuras se pueden considerar como interfaces implícitas:

clase FooBar { público var foo : Int ; barra de var pública : cadena ; función pública nueva () { foo = 1 ; barra = "2" ;} función anyFooBar ( v :{ foo : Int , bar : String }) trace ( v . foo ); prueba de función estática (){ var fb = new FooBar (); fb _ cualquierFooBar ( fb ); fb _ anyFooBar ({ foo : 123 , barra : "456" }); } }

Véase también

Además, en la plataforma Haxe:

  • Neko
  • Open FL

Otros lenguajes que compilan a JavaScript:

Otros lenguajes multiplataforma:

Notas

  1. https://haxe.org/manual/introduction-haxe-history.html
  2. Anuncio de cambio de ortografía de Nicolás en la lista de correo oficial de Haxe .
  3. 1 2 Ponticelli, Franco. Profesional haXe y Neko  (neopr.) . - Wiley, 2008. - ISBN 0470122137 . Archivado el 28 de noviembre de 2015 en Wayback Machine .
  4. Ivánov, Michael. Away3D 3.6 Libro de cocina  (indefinido) . — Packt Publishing Ltd., 2011. - ISBN 1849512817 . Archivado el 2 de noviembre de 2015 en Wayback Machine .
  5. Doucet, Lars Haxe/OpenFL para consolas de juegos domésticas . Gamasutra (3 de junio de 2015). Consultado el 9 de octubre de 2015. Archivado desde el original el 8 de septiembre de 2015.
  6. 1 2 3 4 5 6 7 8 9 10 11 Introducción a la biblioteca estándar de Haxe Archivado el 14 de agosto de 2015 en Wayback Machine , Haxe Docs
  7. 12 objetivos del compilador . Haxe: el kit de herramientas multiplataforma . Consultado el 23 de febrero de 2021. Archivado desde el original el 2 de marzo de 2021.
  8. Empresas que utilizan Haxe . Archivado el 7 de septiembre de 2015 en Wayback Machine , Haxe Docs.
  9. 1 2 3 Doucet, Lars Estimado Adobe: Apoye a Haxe, guarde sus Herramientas . Gamasutra (24 de junio de 2014). Consultado el 9 de octubre de 2015. Archivado desde el original el 24 de septiembre de 2015.
  10. sobre snõwkit . snõwkit (20 de septiembre de 2014). Consultado el 9 de agosto de 2016. Archivado desde el original el 9 de agosto de 2016.
  11. Doucet, Lars Flash está muerto, ¡larga vida a OpenFL! . Gamasutra (18 de marzo de 2014). Consultado el 9 de octubre de 2015. Archivado desde el original el 30 de agosto de 2015.
  12. 1 2 3 4 5 6 7 Green, John; Mineault, Patricio; Balcanes, Aral; Hughes, Marc; Arnold, Wade. La guía esencial para el desarrollo de Flash de código abierto  . - Apress , 2008. - P. Capítulo 9 (Usando Haxe). — ISBN 1430209941 . Archivado el 8 de febrero de 2016 en Wayback Machine .
  13. 1 2 3 4 Haxe Entrevista  (indefinido) . - Programa Io, 2009. - 1 de abril. - S. 1-6 . Archivado desde el original el 8 de diciembre de 2015.
  14. Fisher, Mat. HTML5 para desarrolladores Flash  (indefinido) . — Packt Publishing Ltd., 2013. - ISBN 1849693331 . Archivado el 24 de noviembre de 2015 en Wayback Machine .
  15. Línea de comandos del modo servidor:haxe --wait [host:]port
  16. Rendimiento de AS3 frente a haXe Archivado el 5 de enero de 2013 en Wayback Machine , sitio web de SplashDust
  17. Optimización del rendimiento de AS3 Archivado el 6 de octubre de 2015 en Wayback Machine , Starling Wiki
  18. 1 2 Vadim Dyachenko. En “No puedes hacer buenos juegos HTML5 en Haxe” (enlace descendente) . Yellow After Life (5 de diciembre de 2013). Consultado el 9 de octubre de 2015. Archivado desde el original el 30 de septiembre de 2015. 
  19. Kaya, Talha OpenFL y Haxe, Un comienzo lleno de baches . Gamasutra (4 de julio de 2014). Consultado el 9 de octubre de 2015. Archivado desde el original el 24 de septiembre de 2015.
  20. Lanzamiento de Haxe 3.2 . Github. Consultado el 9 de octubre de 2015. Archivado desde el original el 21 de febrero de 2016.
  21. Publicación en la lista de correo de Haxe sobre nombres . Archivado desde el original el 28 de marzo de 2007.
  22. Compilador MTASC Archivado el 20 de octubre de 2020 en Wayback Machine , sitio web de MTASC
  23. Página de la licencia Hax . Archivado desde el original el 12 de mayo de 2012.
  24. Página de introducción de Hax . Archivado desde el original el 4 de mayo de 2012.
  25. Página principal, FlashDevelop Wiki Archivado el 10 de octubre de 2015 en Wayback Machine , "soporte de primera clase para Flash ActionScript (AS2 y AS3) y desarrollo Haxe"
  26. Soporte de Haxe Archivado el 6 de julio de 2015 en Wayback Machine , FlashDevelop Wiki
  27. as3hx Archivado el 14 de mayo de 2015 en Wayback Machine , convertidor de AS3 a Haxe, repositorio de código fuente de Haxe
  28. CS2HX: convertidor de C# a haXe . Archivado el 4 de marzo de 2010 en Wayback Machine , alojamiento del proyecto CodePlex.
  29. ↑ Publicación de blog que menciona el progreso del puerto de Android . Consultado el 9 de octubre de 2015. Archivado desde el original el 28 de diciembre de 2015.
  30. Haxe, iPhone y C++ por fin . Archivado el 15 de abril de 2012 en Wayback Machine , sitio web de GameHaxe .
  31. Cómo comenzar con Haxe 2.06 y webOS PDK [archivado en WayBackMachine ] . Archivado desde el original el 22 de octubre de 2014.
  32. ¡Hola Lua! - Haxe - El kit de herramientas multiplataforma . Consultado el 9 de agosto de 2016. Archivado desde el original el 6 de agosto de 2016.
  33. Referencia del lenguaje Haxe . Archivado desde el original el 2 de mayo de 2012.
  34. Referencia de Haxe que detalla el uso de enum . Archivado desde el original el 11 de mayo de 2012.
  35. Características del lenguaje . Haxe: el kit de herramientas multiplataforma . Fundación Hax. Consultado el 30 de abril de 2015. Archivado desde el original el 16 de mayo de 2015.
  36. Un compilador de Scala a JavaScript . Consultado el 9 de octubre de 2015. Archivado desde el original el 10 de agosto de 2015.

Enlaces