Una actualización sobre macros de Dart y serialización de datos

Hemos invertido una cantidad significativa de tiempo y recursos en prototipar macros durante los últimos años. Lamentablemente, cada vez que resolvimos un gran…

Hemos invertido una cantidad significativa de tiempo y recursos en crear prototipos de macros durante los últimos años. Lamentablemente, cada vez que resolvíamos un gran obstáculo técnico, veíamos surgir otros nuevos. En este punto, no vemos que las macros converjan pronto hacia una característica con la que nos sintamos cómodos de publicar, con la calidad y el rendimiento en tiempo de desarrollo que deseamos.

Tras considerar el costo de oportunidad — en particular, las características que podríamos estar publicando a la comunidad en su lugar — hemos tomado la difícil decisión de detener nuestro trabajo en las macros.

Contexto

#

Creemos que Dart ofrece una combinación única de fortalezas: (1) la compilación ahead-of-time y el rendimiento típicos de los lenguajes estáticos, y (2) el ciclo de desarrollo rápido (p. ej., Hot Reload con estado) típico de los lenguajes dinámicos. A medida que hemos evolucionado Dart, hemos tenido cuidado de evaluar los cambios del lenguaje frente a ambos criterios.

La metaprogramación potente — construida sobre una introspección rica — siempre ha sido un desafío en este contexto. La introspección en tiempo de ejecución (p. ej., reflexión) dificulta la realización de las optimizaciones de tree-shaking que nos permiten generar binarios más pequeños. La introspección estática (p. ej., macros) puede tomar varias formas. La mayoría de los lenguajes adoptan un enfoque sintáctico, con reflexión estática limitada sobre la sintaxis de los programas. No creíamos que esto fuera suficiente para alcanzar nuestros objetivos. En su lugar, pretendimos construir un sistema de macros que soportara una introspección semántica profunda del programa en tiempo de compilación. La introspección semántica, lamentablemente, resultó introducir grandes costos en tiempo de compilación que dificultaban mantener el Hot Reload con estado caliente.

Hemos llegado a la conclusión de que simplemente estamos demasiado lejos de publicar las macros con el rendimiento en tiempo de desarrollo que requerimos. Nuestra implementación actual empeora tanto la edición (p. ej., análisis estático y autocompletado de código) como la compilación incremental (el primer paso de un Hot Reload). No estamos seguros de poder resolver adecuadamente estos problemas en un plazo razonable.

Avanzando

#

Hemos decidido enfocarnos en otras características en las que tenemos más confianza para publicar.

Un área en la que invertiremos es en un mejor soporte para datos en Dart. Este es el issue más solicitado en los issue trackers de Dart y Flutter. De hecho, nuestra principal motivación para las macros era proporcionar un mejor manejo de datos, serialización y deserialización. Seguiremos persiguiendo mejores datos, pero pretendemos hacerlo con características del lenguaje más a medida.

Otra área en la que invertiremos es en mejorar los tiempos de compilación y la experiencia general de generación de código. Ya hemos identificado mejoras para build_runner. También planeamos publicar augmentations (aumentaciones), una característica que prototipamos como parte de las macros. Creemos que esta característica del lenguaje se sostiene por sí sola y mejorará la generación de código existente. Aún pretendemos publicar esta característica de forma independiente.

Entendemos que esta noticia será decepcionante para muchos de ustedes. Seguimos interesados en explorar la metaprogramación general a largo plazo, ya que tiene una serie de casos de uso potenciales más allá de los datos. Sin embargo, también queremos ser claros con nuestra comunidad de que no publicaremos macros en un futuro previsible.

Nos gustaría agradecer a todos los que probaron las macros, proporcionaron feedback y contribuyeron directamente mediante PRs. Esa información y energía alimentará el trabajo que haremos a continuación. Estamos entusiasmados con las mejoras que podemos ofrecer este año.

Más de Dart