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] .
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] :
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] .
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.
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:
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:
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) |
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.
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.
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.
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 (); }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.
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 };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 );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.
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" }); } }Además, en la plataforma Haxe:
Otros lenguajes que compilan a JavaScript:
Otros lenguajes multiplataforma:
Adobe Flash | |
---|---|
Formatos de archivo | |
Implementaciones | juego flash |
Otras versiones | |
bibliotecas |
|
Maquinas virtuales | |
ver también |
|