La alegr铆a de Haxe. Una novela con un lenguaje de programaci贸n descuidado

Hola Habr! Te presento la traducci贸n de La alegr铆a de Haxe. La historia de amor de FontStruct con un lenguaje de programaci贸n descuidado .

Logotipo de Haxe en el editor de fuentes FontStruct

Un intento bastante crudo de reproducir el logotipo de Haxe en el editor de fuentes FontStruct

Recientemente abrimos el c贸digo fuente para la parte m谩s importante de nuestro m贸dulo de creaci贸n de fuentes. Esta es la biblioteca fonthx para crear fuentes TrueType, y est谩 escrita en Haxe .
Pr谩cticamente no hay c贸digo en este art铆culo. Si solo est谩 interesado en el c贸digo, puede familiarizarse con 茅l en github , y su trabajo se muestra en el ejemplo del editor de fuentes de p铆xeles m谩s simple creado con la biblioteca fonthx.

Independientemente de si est谩 familiarizado con Haxe o no, el proyecto fonthx puede ser de su inter茅s, ya que demuestra algunas caracter铆sticas sorprendentes del lenguaje que son poco conocidas fuera de la comunidad Haxe, en particular, la capacidad de escribir c贸digo en un idioma agradable con una mayor compilaci贸n / traducci贸n no solo es en Javascript, pero tambi茅n en muchas otras plataformas, en el caso de fonthx, tales plataformas son JVM (el c贸digo del proyecto se traduce en Java), c贸digo nativo (C ++ o C #), NodeJS o WASM.

Me pueden llamar un pol铆glota convencido. Al igual que muchos otros desarrolladores, escribo c贸digo en diferentes idiomas y, respetando las serias intenciones de aquellos que prefieren especializarse en un solo idioma, tambi茅n temo a todos aquellos fan谩ticos y estafadores evang茅licos que hablan de un idioma verdaderamente verdadero. Pero, 驴qu茅 me llev贸 a utilizar un lenguaje de nicho como Haxe para crear los componentes clave de FontStruct, as铆 como para escribir este art铆culo? 驴Y qu茅 es Haxe?

Haxe


Haxe es un lenguaje de programaci贸n moderno, fuertemente tipado con algunas caracter铆sticas interesantes y una peque帽a biblioteca est谩ndar.

La caracter铆stica m谩s importante de un lenguaje es su capacidad para compilar el mismo c贸digo para diferentes plataformas de destino.

La mayor铆a de los desarrolladores est谩n familiarizados con el concepto de desarrollo "isomorfo" cuando un programador escribe el c贸digo del servidor y del cliente en un idioma. Muy a menudo, Javascript o TypeScript se usa como tal lenguaje, pero tambi茅n se puede usar cualquier otro lenguaje capaz de compilarse en Javascript. Haxe va mucho m谩s all谩 en esta direcci贸n, abriendo una serie de interesantes oportunidades adicionales. Es posible compilar un archivo ejecutable, una aplicaci贸n Java, un m贸dulo WASM, una aplicaci贸n NodeJS, una aplicaci贸n basada en navegador, una aplicaci贸n m贸vil e incluso bibliotecas para lenguajes como PHP, Lua o Python desde una base de c贸digo en Haxe.

En FontStruct, aprovechamos esta oportunidad desarrollando componentes clave de nuestra aplicaci贸n Haxe. Los m贸dulos del servidor se compilan como servlets de Java, y los m贸dulos del cliente se compilan como aplicaciones JS. Aunque actualmente nos estamos centrando principalmente en estas dos plataformas de destino (as铆 como en NodeJS para ejecutar pruebas de velocidad), tambi茅n estamos considerando usar las herramientas proporcionadas por el ecosistema Haxe para crear aplicaciones m贸viles en C ++. Adem谩s, el uso de Haxe en el futuro puede permitir la creaci贸n de una aplicaci贸n de escritorio nativa (no basada en Electron).

Debido al hecho de que Haxe admite tantas plataformas de destino, es mejor que nadie (al menos para nuestras tareas) implementa la idea de "escribir c贸digo una vez, ejecutarlo en todas partes", mejor que cualquier herramienta con la que me haya encontrado en los 煤ltimos veinte a帽os. Esto da la sensaci贸n de que se puede compilar el mismo c贸digo para cualquier plataforma o tiempo de ejecuci贸n.

Proceso de adopci贸n de Haxe


FontStructor - Editor de fuentes gratuito en FontStruct.com
FontStructor - Editor de fuentes gratuito en FontStruct.com

Hace m谩s de 10 a帽os, cuando se lanz贸 FontStruct, Adobe Flash se us贸 para el editor de fuentes FontStructor, as铆 como widgets para ver fuentes. Y para crear fuentes TrueType en el servidor, se utiliz贸 un c贸digo completamente independiente escrito en Java.

Antigua versi贸n Flash de FontStructor
Antigua versi贸n Flash del editor FontStructor. Todos los controles en 茅l fueron dibujados en Flash. Observe las extra帽as barras de desplazamiento en los paneles a la izquierda. Con el tiempo, el men煤 principal en la parte superior de la p谩gina se separ贸 gradualmente visual y funcionalmente del men煤 html utilizado en el resto del sitio. No hay DOM o CSS aqu铆

Aunque FontStruct ha sido y sigue siendo un gran 茅xito, nuestras soluciones t茅cnicas iniciales no han pasado la prueba del tiempo. El desarrollo de est谩ndares web y la falta de soporte de complementos en plataformas m贸viles han hecho que Flash no sea apto para su uso en aplicaciones web. Tambi茅n tuvimos que lidiar con la duplicaci贸n de c贸digo entre un servidor Java y un cliente Flash, as铆 como entre Flash y otras partes del cliente escritas en HTML / JS / CSS. Era necesario sincronizar constantemente entre s铆 las tres bases del c贸digo, tanto en t茅rminos de funcionalidad como de dise帽o.

En 2013, comenzamos a considerar la posibilidad de utilizar Haxe, en particular, como un medio para traducir el editor FontStructor de Flash a HTML5. En nuestra investigaci贸n inicial, descubrimos que ya hay herramientas disponibles para convertir autom谩ticamente el c贸digo ActionScript a Haxe ( as3hx ) e incluso el puerto Haxe del marco MVC de Robotlegs que utilizamos en la versi贸n Flash. Y as铆 comenzamos el experimento de portar al cliente.

Comienzo lento y problem谩tico


Nuestro primer a帽o de relaci贸n con Haxe estuvo acompa帽ado de indecisi贸n y duda.

Por varias razones, y no solo por los recursos limitados que podr铆amos dedicarle, el proceso de transferencia result贸 ser bastante lento. Como ya han se帽alado otros autores , la herramienta para convertir autom谩ticamente el c贸digo ActionScript a Haxe (as3hx) result贸 ser muy 煤til, pero no sin inconvenientes: el c贸digo obtenido con 茅l tuvo que revisarse y editarse adicionalmente. Durante este proceso, qued贸 claro que nuestra base de c贸digo estaba hinchada y ten铆a un dise帽o err贸neo, por lo que, en paralelo con la transferencia, decidimos hacer mejoras, lo que ralentiz贸 a煤n m谩s el progreso. Adem谩s, Haxe era un nuevo idioma para nosotros, por lo que inevitablemente cometimos errores al estudiar este idioma y sus herramientas.

Con mucho, nuestro mayor error fue la decisi贸n de utilizar adicionalmente un marco de interfaz de usuario de terceros en Haxe.

Para Haxe, existen muchos marcos de este tipo (quiz谩s incluso demasiados) que proporcionan una API unificada para representar gr谩ficos en varias plataformas. OpenFL y NME son ejemplos de dichos marcos y proporcionan herramientas para crear aplicaciones Haxe para plataformas m贸viles e incluso consolas. Al hacerlo, proporcionan una implementaci贸n de API Flash para renderizar gr谩ficos. Todo esto parec铆a muy tentador: 隆pod铆amos transferir nuestra aplicaci贸n a HTML5 usando la API familiar y, tal vez, incluso crear aplicaciones para Android e iOS al mismo tiempo!

Por lo tanto, decidimos usar OpenFL para portar nuestra aplicaci贸n a Haxe.

No quiero faltarle el respeto a OpenFL (incluso quiero decir que: "El problema no est谩 en OpenFL, sino en nosotros"). OpenFL es un proyecto fant谩stico que se ha mostrado bien en muchos proyectos, y podemos volver a 茅l en el futuro, pero despu茅s de transferir aproximadamente el 90% de nuestra aplicaci贸n a Haxe, decidimos abandonarlo.

OpenFL result贸 ser una dependencia mucho m谩s seria de lo que esper谩bamos. Originalmente se plane贸 que se usar铆a solo como una biblioteca externa para nuestra interfaz de usuario, pero al final result贸 que OpenFL estaba arrastrando sus propias herramientas para construir proyectos, formatos de archivo especiales para describir proyectos, as铆 como dependencias externas adicionales. Quiz谩s esto se deba al hecho de que, como la mayor铆a del ecosistema Haxe, OpenFL intenta satisfacer las necesidades de los desarrolladores de juegos independientes, mientras se desarrolla con bastante rapidez y la atenci贸n principal en su desarrollo se presta para agregar nuevas funciones, no estabilidad.

Lo m谩s importante para nosotros fue que el c贸digo HTML5 generado con OpenFL es ideal para juegos, pero no es adecuado para una aplicaci贸n como FontStruct. Todo lo que quer铆amos al final era mostrar en el navegador un 谩rbol DOM normal que pudi茅ramos dise帽ar con CSS, y no un conjunto de elementos de lienzo o sprites creados por OpenFL.

Necesit谩bamos HTML5 regular, no un intento de replicar Flash en un navegador sin usar complementos adicionales.

Divertido


Tan pronto como abandonamos el uso de OpenFL y nos dimos cuenta de que pod铆amos hacer lo que quisi茅ramos usando solo Haxe, todo fue m谩s r谩pido, m谩s f谩cil y, en 煤ltima instancia, mucho m谩s divertido.

Y trabajar con Haxe es divertido. Se puede decir que fue creado por expertos divertidos, desarrolladores de juegos independientes. Los desarrolladores de juegos necesitan una compilaci贸n r谩pida, as铆 como una base de c贸digo 煤nico para crear aplicaciones para computadoras de escritorio, navegadores, iOS, Android y consolas. Los desarrolladores de juegos necesitan un c贸digo productivo y estable. Y Haxe ofrece todas estas excelentes funciones, y no solo para los desarrolladores de juegos.

No tengo miedo de expresar la idea de que uno de los mayores problemas de Haxe, el tama帽o relativamente peque帽o de su comunidad y la escasez relacionada de su ecosistema, tambi茅n es su ventaja en t茅rminos de experiencia para el desarrollador. Cuando trabaje con Haxe, es poco probable que pase horas buscando en Google y buscando informaci贸n sobre el desbordamiento de pila, o analizando y comparando diferentes lecciones sobre un tema de inter茅s, as铆 como mientras estudia la API de alg煤n nuevo marco o biblioteca: estas respuestas, lecciones y Es posible que las bibliotecas simplemente no existan. Y si es as铆, lo m谩s probable es que sean los 煤nicos materiales sobre estos temas. Con Haxe, resolver谩 los problemas de programaci贸n usted mismo (!), Escribir谩 bibliotecas usted mismo o, sin experimentar el m谩s m铆nimo sentimiento de culpa, incluso reinventar谩 o portar谩 la rueda usted mismo. Esto es divertido y da libertad, y esto es por lo que muchos desarrolladores se esfuerzan por obtener marcos infinitos y un desarrollo moderno relacionado con la copia de c贸digo de diferentes fuentes. Utilizando el principio de "menos es mejor", Haxe no es 煤nico, pero es su ventaja definitiva.

Haxe le da al programador oportunidades 煤nicas. Da una sensaci贸n especial de asombroso descubrimiento y alegr铆a. Al usar Haxe, con su capacidad de compilar c贸digo para muchas plataformas de destino, existe la sensaci贸n de que el programador est谩 libre de una de las dependencias m谩s fundamentales de todas las existentes: el tiempo de ejecuci贸n.

Renderer FontStruct


El lanzamiento de nuestro primer componente Haxe para el sitio FontStruct en abril de 2015 fue un evento extra帽o e inesperado.

La galer铆a es una parte central de FontStruct: listas buscables y ordenables de miles de fuentes creadas en nuestra plataforma. Desde el comienzo en 2008, tuvimos problemas constantes con la velocidad de descarga y con el rendimiento de las vistas previas de fuentes tanto en la galer铆a como en otras p谩ginas del sitio.

Vista previa de fuentes en la galer铆a FontStruct
La parte de la p谩gina de la galer铆a FontStruct donde se muestra la vista previa de las fuentes creadas en la plataforma. Inicialmente, cada elemento de vista previa individual se present贸 con una pel铆cula Flash de carga lenta.

Dado que las fuentes FontStruct ("FontStructions") se almacenan en un formato propietario y a menudo se editan, es imposible usarlas para renderizar como fuentes TrueType normales. Esto signific贸 la imposibilidad de crear im谩genes de mapa de bits en el servidor para obtener una vista previa de las fuentes (utilizando la biblioteca FreeType).

Para "resolver" este problema, en los primeros d铆as de FontStruct, utilizamos pel铆culas Flash separadas para elementos de la galer铆a. Cada pel铆cula Flash descarg贸 y analiz贸 datos en nuestro formato propietario, y luego mostr贸 la imagen en el cliente para la vista previa. Al mostrar en la p谩gina 20 o m谩s de tales clips, cada uno de los cuales descarg贸 datos e intent贸 dibujar una fuente, el tiempo de carga y el consumo de recursos de la m谩quina del usuario aumentaron significativamente, y la situaci贸n se agrav贸 a煤n m谩s con el tiempo, a medida que las fuentes desarrolladas en nuestro editor se volvieron m谩s y m谩s y m谩s complejo

Al final, utilizamos una soluci贸n h铆brida elegante: la primera vez que miramos la fuente, utilizamos una pel铆cula Flash que generaba una imagen para la vista previa, luego esta imagen fue capturada y guardada en el servidor como archivos PNG. Y para la vista previa de los siguientes usuarios, los que se guardaron en el servidor PNG ya se usaron. - Este extra帽o truco mejor贸 enormemente el tiempo de carga de la p谩gina, pero estaba sucio y, en 煤ltima instancia, estaba mal o algo as铆. La decisi贸n correcta ser铆a escribir un m贸dulo de servidor completamente nuevo, por ejemplo, en Java o PHP, para cargar y analizar datos de fuentes, y luego crear un mapa de bits basado en 茅l, pero simplemente no ten铆amos los recursos para hacerlo.

Mientras tanto, el proceso de transferencia de Fontstructor a Haxe estaba progresando muy lentamente, y est谩bamos lejos del lanzamiento. Pero hemos llegado lo suficientemente lejos como para comprender que el nuevo c贸digo Haxe puede resolver nuestros problemas con la vista previa de las fuentes en la galer铆a.

Ya ten铆amos c贸digo Haxe para cargar y analizar nuestro formato de fuente. Ten铆amos c贸digo para representar glifos (en Canvas en HTML5 o en sprites en Flash). Tambi茅n ten铆amos todos los componentes necesarios para resolver el problema en el lado del cliente. 驴Podr铆amos adaptar este c贸digo para usarlo en el servidor?

Si! Despu茅s de darnos cuenta de esto, el proceso fue muy r谩pido. Al principio pensamos en usar C ++ y la biblioteca Cairo para renderizar fuentes (con la esperanza de poder escribir una extensi贸n para PHP o alg煤n m贸dulo CGI), pero en su lugar decidimos usar Java. "隆Qu茅 maravilloso es poder hacer una elecci贸n tan fundamental con solo unas pocas l铆neas de c贸digo y compilaci贸n condicional!" Tambi茅n podr铆amos usar NodeJS y node-canvas para esto, pero ya est谩bamos familiarizados con el proceso de creaci贸n y despliegue de servlets de Java, y Java tiene todas las funciones que necesitamos para dibujar y manipular mapas de bits. Probablemente no nos gust贸 escribir c贸digo en Java, pero con Haxe, esto ya no es necesario.

C贸digo para renderizar
Dicho c贸digo de representaci贸n de alto nivel se puede compilar y ejecutar tanto en el cliente (JavaScript) como en el servidor (en la JVM)

Como resultado, nos tom贸 solo unos d铆as realizar cambios en nuestra base de c贸digo, y se lanz贸 un nuevo procesador. Durante la noche, mejoramos significativamente el rendimiento de la galer铆a FontStruct, eliminamos el uso de hacks sucios y, lo m谩s importante, lanzamos nuestro primer componente en Haxe para la batalla. Nos dimos cuenta de que Haxe puede sorprender y tiene capacidades mucho mayores de lo que esper谩bamos de 茅l.

Adi贸s a Flash (y c Vanilla Java)


En noviembre de 2015, es decir, despu茅s de 7 meses, lanzamos con 茅xito el primer m贸dulo de cliente Haxe: la versi贸n HTML5 del widget para obtener una vista previa de las fuentes. Creo que nuestros usuarios casi no notaron los cambios, lo que por un lado decepciona de alguna manera, pero, en 煤ltima instancia, es un indicador del 茅xito de esta iniciativa.

Ahora solo ten铆amos un m贸dulo Flash en el sitio: el editor FontStructor, y nos llev贸 un a帽o m谩s lanzar finalmente su versi贸n HTML5 en noviembre de 2016. As铆 que ha llegado el momento de abandonar finalmente nuestro c贸digo AS3 y declarar FontStruct libre de Flash.

Nueva versi贸n HTML5 de FontStructor
Nueva versi贸n HTML5 de FontStructor lanzada en 2016

En agosto de 2018, trasladamos el m贸dulo de generaci贸n de fuentes FontMortar a Haxe. Este 煤ltimo puerto nos permiti贸 abandonar completamente el c贸digo escrito en Java.

No estoy listo para usar Haxe para todo. S铆, s茅 que hay proyectos en los que se utiliza como herramienta principal para todos los aspectos del desarrollo web, pero estoy muy contento con el excelente marco de Symfony como base de nuestra aplicaci贸n web. FontStruct contin煤a usando muchos lenguajes de programaci贸n diferentes, pero la introducci贸n de Haxe nos ha permitido reducir el tama帽o y la complejidad de las partes m谩s importantes de nuestro c贸digo. Para nuestra peque帽a organizaci贸n, esta simplificaci贸n ha demostrado ser vital para mantener y desarrollar la plataforma.

Profundizando en Hux


Si esta es la primera vez que escuchaste sobre Haxe y mi historia te interes贸, entonces solo tengo que enumerar algunos hechos m谩s sobre 茅l.

  • El soporte de idiomas por parte del IDE es bastante decente y mejora constantemente, los m贸dulos para IntelliJ Idea y Visual Studio Code se est谩n desarrollando activamente.
  • Haxe proporciona herramientas para trabajar con c贸digo nativo y bibliotecas , por lo que no limita sus capacidades, imponiendo solo un peque帽o subconjunto de las funciones disponibles. Si est谩 desarrollando para JavaScript, tiene la oportunidad de utilizar cualquier biblioteca de JavaScript, por ejemplo, hay varios aglutinantes disponibles para trabajar con React. Para FontStructor, utilizamos varios m贸dulos npm, como interactive.js y opentip. Escribir carpetas para ellos tom贸 solo un par de minutos.
  • Haxe tiene un sistema de tipos avanzado y robusto con caracter铆sticas como la parametrizaci贸n de tipos , clases y m茅todos gen茅ricos , tipos abstractos e inferencia de tipos .
  • Haxe tiene macros extremadamente potentes que proporcionan acceso al AST en tiempo de compilaci贸n, lo que permite a los desarrolladores agregar sus propias construcciones de lenguaje y generar c贸digo din谩micamente.
  • A pesar del hecho de que no hay muchos recursos en Haxe en Internet, hay un repositorio de bibliotecas para cubrir las necesidades generales de los desarrolladores fuera de la biblioteca est谩ndar (adem谩s, en Github puede encontrar a煤n m谩s repositorios que no est谩n representados en haxelib - aprox. Traductor) .
  • Por 煤ltimo, pero no menos importante, Haxe tiene una comunidad muy talentosa y receptiva .

Conclusi贸n


Los desarrolladores m谩s experimentados est谩n listos para el cambio, pero son cuidadosos al elegir las tecnolog铆as utilizadas. Es probable que en alg煤n momento la mayor铆a de ustedes tambi茅n tengan ganas de cambiar el lenguaje de programaci贸n dentro del marco del proyecto, especialmente cuando aparecen lenguajes nuevos y modernos con muchas caracter铆sticas interesantes. Tuvimos cuidado al elegir Haxe, pensando en cu谩nto durar铆a nuestra relaci贸n. Nuestros pensamientos sobre 茅l eran algo como esto :

suena genial, pero tiene una comunidad tan peque帽a. 驴Qu茅 le pasar谩 en 5 a帽os? El sitio parece ser normal, pero por alguna raz贸n no parece moderno. Y esto no inspira confianza.
No parece estar tan bien documentado.

驴No es eso para los desarrolladores de juegos independientes?


Despu茅s de cinco a帽os de usar Haxe, estoy sinceramente sorprendido de no lamentar nuestra elecci贸n de esta tecnolog铆a. A pesar de todas las deficiencias y todas las dificultades causadas por ellas, a pesar de la comunidad relativamente peque帽a y la ausencia de grandes patrocinadores corporativos, Haxe est谩 enfrentando plenamente sus tareas. Con Haxe, siento libertad e independencia de cualquier plataforma. Ahora tenemos una 煤nica base de c贸digo para los componentes principales de FontStruct, mientras que antes hab铆a dos de ellos. En los 煤ltimos meses, las versiones m谩s nuevas de los servlets responsables de generar fuentes e im谩genes para la vista previa nunca han fallado. El nuevo editor HTML5 y el widget de vista previa ahora funcionan en todos los navegadores, incluido el m贸vil, mientras que antes ten铆amos que trabajar con tecnolog铆a obsoleta y obsoleta.

Y, aparte de los beneficios pr谩cticos, trabajar con Haxe trae alegr铆a y un sentido de magia, 隆la alegr铆a de Haxe !

Source: https://habr.com/ru/post/es432750/


All Articles