stringtranslate.com

Hacha

Haxe es un lenguaje de programación multiplataforma de alto nivel y un compilador que puede producir aplicaciones y código fuente para muchas plataformas informáticas diferentes a partir de una base de código. Es un software libre y de código abierto , publicado bajo una licencia MIT . [2] El compilador, escrito en OCaml , se publica bajo la Licencia Pública General GNU (GPL) versión 2.

Haxe incluye un conjunto de características y una biblioteca estándar [3] compatible con todas las plataformas , incluidos tipos de datos numéricos , cadenas , matrices , mapas , binarios , programación reflexiva , matemáticas, Protocolo de transferencia de hipertexto ( HTTP ), sistema de archivos y formatos de archivos comunes . Haxe también incluye interfaces de programación de aplicaciones ( API ) específicas de la plataforma para cada objetivo del compilador. [4] Kha , OpenFL y Heaps.io son marcos populares de Haxe que permiten crear contenido multiplataforma a partir de una base de código. [5]

Haxe se originó con la idea de soportar la programación del lado del cliente y del lado del servidor en un lenguaje, y simplificar la lógica de comunicación entre ellos. [6] El código escrito en Haxe se puede compilar en JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua [7] y Node.js. [8] Haxe también puede compilar directamente el bytecode de SWF , HashLink y NekoVM y también se ejecuta en modo interpretado. [9]

Haxe admite archivos externos (archivos de definición) que pueden contener información sobre el tipo de datos de las bibliotecas existentes para describir la interacción específica del objetivo de una manera segura, al igual que los archivos de encabezado de C++ pueden describir la estructura de los archivos de objetos existentes . Esto permite utilizar los valores definidos en los archivos como si fueran entidades Haxe con tipos estáticos. Además de los archivos externos, existen otras soluciones para acceder a las capacidades nativas de cada plataforma.

Muchos IDE y editores de código fuente populares tienen soporte disponible para el desarrollo de Haxe. [10] La Fundación Haxe no recomienda oficialmente ningún entorno de desarrollo o conjunto de herramientas en particular, aunque VS Code , IntelliJ IDEA y HaxeDevelop tienen el mayor soporte para el desarrollo de Haxe. Las funcionalidades básicas de resaltado de sintaxis , finalización de código , refactorización , depuración , etc. están disponibles en diversos grados.

Historia

El desarrollo de Haxe comenzó en octubre de 2005. La primera versión alfa se lanzó el 14 de noviembre de 2005. [11] [12] Haxe 1.0 se lanzó en abril de 2006, con soporte para programas Adobe Flash , JavaScript y NekoVM . Se agregó soporte para PHP en 2008 y C++ en 2009. Se agregaron más plataformas como C# y Java con una revisión del compilador en 2012.

Haxe fue desarrollado por Nicolas Cannasse y otros colaboradores, y originalmente se llamó haXe [13] porque era corto, simple y "tiene una X adentro", que el autor afirma con humor que es necesaria para que cualquier nueva tecnología sea un éxito. [14]

Haxe es el sucesor del compilador ActionScript 2 de código abierto MTASC , [15] también creado por Nicolas Cannasse y publicado bajo la Licencia Pública General GNU versión 2 o posterior.

Compilador

El lenguaje Haxe puede compilarse en código de bytes que puede ser ejecutado directamente por las máquinas virtuales a las que se dirige. Puede compilarse en código fuente en C++ , JavaScript , PHP , C# , Java , Python y Lua . Haxe también tiene un intérprete llamado eval . [16] Este mismo intérprete también se utiliza en tiempo de compilación para ejecutar macros, que permiten la modificación del árbol de sintaxis abstracta (AST).

Esta estrategia de compilación en múltiples lenguajes de código fuente está inspirada en el paradigma de escribir una vez, ejecutar en cualquier lugar . También permite al programador elegir la mejor plataforma para el trabajo. Los programas Haxe típicos se ejecutan de manera idéntica en todas las plataformas, pero los desarrolladores pueden especificar código específico para la plataforma y usar la compilación condicional para evitar que se compile en otras plataformas.

El compilador Haxe es un compilador optimizador y utiliza incrustación de campos y funciones , eliminación de recursión de cola , plegado constante , desenrollado de bucle y eliminación de código muerto (DCE) para optimizar el rendimiento en tiempo de ejecución de los programas compilados. [17] El compilador Haxe ofrece seguridad nula opcional , verifica en tiempo de compilación los valores que aceptan valores nulos.

Objetivos

En Haxe, las plataformas compatibles se conocen como "objetivos", que constan de los siguientes módulos:

La siguiente tabla documenta la compatibilidad de plataformas y lenguajes con Haxe. El lenguaje Haxe permite a los desarrolladores acceder a muchas funciones de la plataforma, pero Haxe no es un motor con todas las funciones, por lo que es posible que necesiten marcos que les permitan crear contenido para determinadas plataformas.

Ventajas

Idioma

Haxe es un lenguaje de programación de propósito general que admite programación orientada a objetos , programación genérica y varias construcciones de programación funcional . Características como iteraciones , excepciones y programación reflexiva (reflexión de código) también son funciones integradas del lenguaje y las bibliotecas. Inusual entre los lenguajes de programación, Haxe contiene un sistema de tipos que es a la vez fuerte y dinámico . El compilador verificará los tipos implícitamente a través de la inferencia de tipos y dará errores en tiempo de compilación, pero también permite que los programas eviten la verificación de tipos y confíen en el manejo dinámico de tipos de una plataforma de destino. Se pueden utilizar todas las API de destino nativas.

Sistema de tipos

Haxe tiene un sistema de tipos sofisticado y flexible. Los tipos de tipos que ofrece son clases , interfaces, tipos de función-método, tipos anónimos, tipos de datos algebraicos (llamados enum en Haxe) y tipos abstractos. El polimorfismo paramétrico es posible con clases, tipos algebraicos y tipos de función, lo que le da al lenguaje soporte para programación genérica basada en borrado de tipos. Esto incluye soporte para varianza en funciones polimórficas , aunque no en constructores de tipos .

El sistema de tipos es estático a menos que existan anotaciones para tipificación dinámica , para su uso con destinos que las admitan. La comprobación de tipos sigue la tipificación nominal con la excepción de los tipos anónimos , en los que se utiliza la tipificación estructural . Por último, se admite la inferencia de tipos , lo que permite declaraciones de variables sin anotaciones de tipos .

Módulos y espacios de nombres

Todo el código Haxe está organizado en módulos, a los que se accede mediante rutas. En esencia, cada archivo .hxA representa un módulo que puede contener varios tipos. Por ejemplo, para crear el tipo en el paquete my.pack como se muestra, la estructura de carpetas debería ser my\pack y el archivo podría ser A.hx en la carpeta pack .

 // archivo mi/paquete/A.hx paquete mi . paquete ; clase A {}  

En otros módulos, se pueden importar otros tipos colocando importdeclaraciones debajo de la definición del paquete, por ejemploimport my.pack.A;

Un módulo puede contener varios tipos, como los siguientes. Es posible importar un tipo a la vez desde ese módulo, utilizando import my.pack2.A;. Un tipo puede ser private, en cuyo caso solo el módulo que lo contiene puede acceder a él.

paquete mi . pack2 ; typedef A = { a : Cadena } privado typedef B = { b : Cadena }       

Clases

Las clases (palabra clave class) en Haxe son similares a las de Java o TypeScript. Sus campos pueden ser métodos, variables o propiedades, cada una estática o por instancia respectivamente. Haxe admite los descriptores de acceso publicy private, y métodos más avanzados para el control de acceso que se denotan mediante anotaciones. Los métodos y las variables constantes estáticas se pueden incluir en línea mediante la palabra clave inline. Los campos se pueden marcar como finalpara declarar una constante que se debe inicializar inmediatamente o en el constructor y no se puede escribir en ella, en caso de que la función finalse marque como no reemplazable en las subclases.

Las interfaces en Haxe son muy similares a las de, por ejemplo, Java.

interfaz ICreature { var pública nacimiento : Fecha ; var pública nombre : String ;         función pública edad (): Int ; }  clase Fly implementa ICreature { var pública nacimiento : Fecha ; var pública nombre : String ; función pública edad (): Int return Date . now (). getFullYear () - nacimiento . getFullYear (); }                 

Genéricos

Haxe admite programación genérica . El siguiente es un ejemplo de la función de identidad .

función identidad < T >( arg : T ): T { return arg ; }   

Tipos enumerados

Los tipos enumerados son una característica importante del lenguaje; pueden tener parámetros de tipo y ser recursivos. [20] Proporcionan soporte básico para tipos de datos algebraicos , lo que permite la inclusión de tipos de producto , de manera similar a Haskell y ML . Una switchexpresión puede aplicar la coincidencia de patrones a un valor de enumeración, lo que permite soluciones elegantes a problemas de programación complejos:

enumeración Color { rojo ; verde ; azul ; rgb ( r : Int , g : Int , b : Int ); }    clase Colores { función estática toInt ( c : Color ): Int { retorno switch ( c ) { caso rojo : 0xFF0000 ; caso verde : 0x00FF00 ; caso azul : 0x0000FF ; caso rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | b ; } }                          función estática validCalls ( ) { var redint = toInt ( Color.red ) ; var rgbint = toInt ( Color.rgb ( 100,100,100 ) ) ; } }           

Ejemplos de tipos de enumeración paramétricos son los tipos de biblioteca estándar de Haxe Option [21] y Either: [22]

enumeración Opción < T > { Alguna ( v : T ); Ninguna ; }    enumeración Either < L , R > { Izquierda ( v : L ); Derecha ( v : R ); }     

Haxe también admite tipos de datos algebraicos generalizados (GADT). [23] [24]

Tipos anónimos

Los tipos anónimos se definen denotando su estructura explícitamente, utilizando una sintaxis que sigue la representación matemática basada en registros de un tipo. Se pueden utilizar para implementar la tipificación estructural para argumentos de funciones (ver a continuación) y se les puede dar un alias con la palabra clave typedef:

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

Tipos de funciones

Las funciones son valores de primera clase en Haxe. Su tipo se denota mediante flechas entre los tipos de argumentos y entre los tipos de argumentos y el tipo de retorno, como es común en muchos lenguajes funcionales. Sin embargo, a diferencia de ejemplos destacados como Haskell o la familia de lenguajes ML , no todas las funciones son funciones unarias (funciones con un solo argumento) y en Haxe, las funciones no se pueden aplicar parcialmente de forma predeterminada. Por lo tanto, las siguientes firmas de tipo tienen una semántica diferente a la de los lenguajes mencionados anteriormente. El tipo F1es una función que toma a Stringcomo argumentos y devuelve un valor de tipo Float.

Los tipos F1y F2denotan el mismo tipo, excepto que F2se utiliza un parámetro etiquetado, lo cual es útil para completar y documentar.

Los tipos F4y F5denotan el mismo tipo. Ambos son funciones binarias que devuelven una función binaria de tipo F3. Para F5la sintaxis para declarar un tipo de función dentro de un tipo de función se utiliza un tipo de función.

typedef F1 = Cadena -> Flotante ; typedef F2 = ( texto : Cadena ) -> Flotante ;          typedef F3 = ( puntuación :Int, texto:Cadena ) -> Float ; typedef F4 = ( puntuación :Int, texto:Cadena ) -> F3 ; typedef F5 = ( puntuación :Int, texto:Cadena ) -> (( puntuación :Int, texto:Cadena ) -> Float );                     

Funciones anónimas

En Haxe, las funciones anónimas se denominan lambda y utilizan la sintaxis function(argument-list) expression;.

var f = función ( x ) devuelve x * x ; f ( 8 ); // 64      ( función ( x , y ) devuelve x + y )( 5,6 ) ; // 11   

Tipos abstractos

Una incorporación relativamente nueva al sistema de tipos de Haxe es un concepto denominado tipos abstractos . Tal como se utiliza en Haxe, esto se refiere a algo diferente de un tipo abstracto convencional . Se utilizan para hacer conversiones entre tipos implícitas, lo que permite la reutilización de tipos existentes para fines específicos, como la implementación de tipos para unidades de medida. Esto reduce en gran medida el riesgo de mezclar valores del mismo tipo subyacente, pero con diferentes significados (por ejemplo, millas frente a km).

En el siguiente ejemplo se supone que el sistema métrico es el predeterminado, mientras que se necesita una conversión a millas para los datos heredados. Haxe puede convertir automáticamente millas a kilómetros, pero no a la inversa.

abstracto Kilómetro ( Float ) { función pública nueva ( v : Float ) this = v ; } abstracto Milla ( Float ) { función pública nueva ( v : Float ) this = v ; @:to función pública en línea toKilómetro (): Kilómetro return ( new Kilómetro ( this / 0.62137 )); } clase Prueba { var estática km : Kilómetro ; función estática main () { var one100Miles = new Milla ( 100 ); km = one100Miles ; trace ( km ); // 160.935 } }                                                 

Como muestra el ejemplo, no se necesita ninguna conversión explícita para la asignación "km = one100Miles;" para hacer lo correcto.

Los tipos abstractos son una característica exclusiva de Haxe en tiempo de compilación y no existen en absoluto en tiempo de ejecución del programa. Como ejemplo, ambas variables que utilizan tipos abstractos antes mencionadas Mileserán Kilometerdel tipo Floaten tiempo de ejecución. [25]

Tipificación estructural

En muchos lenguajes de programación funcional, la tipificación estructural desempeña un papel importante. Haxe la emplea en presencia de tipos anónimos, utilizando la tipificación nominativa de la programación orientada a objetos , cuando solo se trata de tipos nombrados. Los tipos anónimos en Haxe son análogos a las interfaces implícitas del lenguaje Go en cuanto a tipificación. A diferencia de las interfaces de Go, es posible construir un valor utilizando un tipo anónimo.

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

Arquitectura interna

.mw-parser-output .vanchor>:target~.vanchor-text{background-color:#b1d2ff}@media screen{html.skin-theme-clientpref-night .mw-parser-output .vanchor>:target~.vanchor-text{background-color:#0f4dc9}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .vanchor>:target~.vanchor-text{background-color:#0f4dc9}}Compilador

El compilador Haxe se divide en un frontend y varios backends. El frontend crea un árbol de sintaxis abstracta (AST) a partir del código fuente y realiza la comprobación de tipos, la expansión de macros y la optimización en el AST. Los distintos backends traducen el AST procesado en código fuente o generan código de bytes , según su destino.

El compilador está escrito en OCaml . Se puede ejecutar en modo servidor para proporcionar finalización de código para entornos de desarrollo integrados (IDE) y mantener una caché para acelerar aún más la compilación. [26]

Véase también

Referencias

  1. ^ "Versión 4.3.6". 7 de agosto de 2024. Consultado el 22 de agosto de 2024 .
  2. ^ "Licencia de código abierto Haxe".
  3. ^ Introducción a la biblioteca estándar de Haxe, Documentación de Haxe
  4. ^ API específicas de destino, Introducción a la biblioteca estándar de Haxe, Documentación de Haxe
  5. ^ Doucet, Lars (24 de junio de 2014). "Estimado Adobe: apoye a Haxe, salve sus herramientas". Gamasutra .
  6. ^ "Entrevista a Haxe". Io Programmo. 1 de abril de 2009. págs. 1–6. Archivado desde el original el 8 de diciembre de 2015. Consultado el 6 de agosto de 2015 .
  7. ^ "¡Hola Lua!". Haxe.org .
  8. ^ "hxnodejs".
  9. ^ ab "Objetivos del compilador". Haxe . Consultado el 5 de noviembre de 2021 .
  10. ^ Lista de IDE que admiten Haxe, Haxe Foundation
  11. ^ "Liberar alfa-1". hax . Fundación Haxe. 2005-11-14 . Consultado el 2 de abril de 2022 - a través de GitHub .
  12. ^ Cannasse, Nicolas (17 de noviembre de 2005). "Haxe Alpha 1b". haXe (lista de correo). Archivado desde el original el 26 de octubre de 2007.
  13. ^ "Anuncio de cambio de ortografía de Nicolas en la lista de correo oficial de Haxe".
  14. ^ "Publicación en la lista de correo de Haxe sobre nombres". Archivado desde el original el 28 de marzo de 2007.
  15. ^ Compilador MTASC, sitio web MTASC
  16. ^ "Eval - El nuevo intérprete de macros de Haxe".
  17. ^ "Características del compilador".
  18. ^ "Macros en Haxe".
  19. ^ Dyachenko, Vadim (5 de diciembre de 2013). "Sobre "No se pueden hacer buenos juegos HTML5 en Haxe"". Yellow After Life.
  20. ^ "Referencia de Haxe que detalla el uso de enum". Archivado desde el original el 11 de mayo de 2012.
  21. ^ "haxe/Option.hx en desarrollo · HaxeFoundation/haxe". Github . 7 de noviembre de 2021.
  22. ^ "haxe/Either.hx en desarrollo · HaxeFoundation/haxe". Github . 7 de noviembre de 2021.
  23. ^ "Características del lenguaje". Haxe - El kit de herramientas multiplataforma . Fundación Haxe . Consultado el 30 de abril de 2015 .
  24. ^ "haxe/TestGADT.hx en desarrollo · HaxeFoundation/haxe". Github . 7 de noviembre de 2021.
  25. ^ "Resumen". Haxe - El kit de herramientas multiplataforma . Consultado el 24 de abril de 2023 .
  26. ^ Línea de comandos del modo servidor:haxe --wait [host:]port

Enlaces externos