Anunciando Dart 2.1: Rendimiento y usabilidad mejorados

Hoy anunciamos el lanzamiento estable de Dart 2.1, una actualización de Dart 2 con nuevas características del lenguaje y mejoras de rendimiento

Hoy, anunciamos el release estable de Dart 2.1, una actualización de Dart 2 que ofrece menor tamaño de código, verificaciones de tipos más rápidas, mejor usabilidad para los errores de tipos, y nuevas características del lenguaje para mejorar la productividad al construir experiencias de usuario.

Banner del release de Dart 2.1 listando herramientas más rápidas, menor output, verificación de tipos en tiempo de compilación, inferencia de int a double, y nueva sintaxis de mixins.

Aterrizando Dart 2

#

Dart 2 fue una gran actualización a la plataforma Dart. Completó la transformación desde nuestros orígenes web tempranos a un lenguaje de programación mainstream adecuado para el desarrollo rápido de experiencias de usuario ricas en móvil y web. Dart es algo único como lenguaje al ofrecer tanto una máquina virtual (VM) como compilación tanto a código de máquina nativo como a JavaScript. Esto soporta las diferentes necesidades de las distintas plataformas, tanto para desarrollo como para producción.

Como parte de la transición a Dart 2, añadimos un sistema de tipos sound para soportar a grandes equipos construyendo apps complejas, nuevo soporte del compilador para generar código nativo optimizado para dispositivos móviles, y herramientas de plataforma web completamente renovadas. Dart potencia a Flutter, nuestro toolkit de rápido crecimiento para construir hermosas experiencias nativas para iOS y Android desde una única base de código; también es el lenguaje utilizado por algunos de los proyectos más grandes de Google, como Google Ads.

Desde el lanzamiento de Dart 2 en agosto, hemos trabajado en llevar todo el ecosistema a Dart 2. Cambiamos nuestro sitio web dartlang.org para usar ejemplos de Dart 2 en todas partes, y ofrecimos herramientas y documentación para migrar paquetes de Dart 1.x. Entendemos que los grandes cambios en Dart 2 implicaron trabajo de migración para los desarrolladores existentes de Dart, y estamos muy agradecidos con quienes nos han ayudado a construir una nueva base para el futuro. Nuestro enfoque ahora se desplaza a aprovechar estas inversiones para entregar mejoras en rendimiento y productividad.

Soporte del lenguaje Dart 2.1 para conversión de int a double

#

Los nuevos desarrolladores de Flutter a menudo se tropiezan con errores de análisis como estos al especificar padding, establecer tamaños de fuente, etc.:

Código mostrando valores enteros pasados a EdgeInsets.symmetric, con errores de análisis porque la API espera doubles.

Desde el punto de vista del sistema, estos errores tienen sentido: la API espera un tipo (un double), y el desarrollador especifica un valor de un tipo diferente (un int). Sin embargo, desde el punto de vista de la usabilidad parece un poco tonto: hay una conversión trivial de int a double, así que ¿por qué no hacerla simplemente? Dart 2.1 ahora infiere dónde un int puede ser evaluado silenciosamente como un double:

Código mostrando EdgeInsets.symmetric con valores enteros aceptados para padding horizontal y vertical.

Soporte del lenguaje Dart 2.1 para mixins

#

También mejoramos el soporte de Dart para mixins. Si no has encontrado los mixins de Dart antes, vale la pena leer esta excelente introducción a los mixins de Dart de Romain Rastel. Dart 2.1 introduce una nueva sintaxis para mixins, con una nueva palabra clave mixin que puedes usar para definir clases que solo pueden usarse como mixins. También hemos añadido soporte para que los mixins puedan extender otras clases (previamente solo podían extender Object) y pueden invocar métodos de su superclase.

Un ejemplo de extender clases que no son Object es de las APIs de animación de Flutter, donde SingleTickerProviderStateMixin — una clase del framework que proporciona un ticker para avanzar una animación un solo frame — declara un mixin que implementa la interfaz general TickerProvider. Las animaciones solo son aplicables a widgets con estado (ya que la posición en la animación se considera estado). El nuevo soporte de mixins nos permite expresar esto declarando que solo las clases que extienden la clase State de Flutter pueden usar el mixin:

Código declarando SingleTickerProviderStateMixin como un mixin en State que implementa TickerProvider.

Verificaciones de tipos en tiempo de compilación de Dart 2.1

#

El sistema de tipos sound de Dart 2 te protege durante el desarrollo, diciéndote cuándo violas el contrato especificado por los tipos. Por ejemplo, digamos que estás creando una clase de estado para Flutter. Se espera que esta clase extienda la clase State del framework. Una clase State espera que se le pase el StatefulWidget cuyo estado contiene.

Fragmento de código mostrando una clase de estado de Flutter que extiende la clase State del framework.

Ahora, si cometes un error de programación y — digamos — le pasas un descendiente de StatelessWidget en lugar de StatefulWidget, la información de tipos permite que las herramientas detecten el error y te muestren una advertencia inmediatamente:

Captura de pantalla del IDE mostrando un error porque MyHomePage no extiende StatefulWidget.

Estas verificaciones de tipos en tiempo de edición se añadieron en Dart 2.0 (impulsadas por el Dart Analyzer). Sin embargo, hay otro lugar donde podrías esperar estas verificaciones de tipos, namely en tiempo de compilación, cuando haces un build de release de Flutter. Estas verificaciones eran incompletas en Dart 2.0, lo que podía llevar a problemas de usabilidad donde código fuente defectuoso podía compilar sin producir ningún error. En Dart 2.1, estas verificaciones están completas, y el Analyzer y el compilador de Dart contienen las mismas verificaciones.

Mejoras de rendimiento de Dart 2.1 para desarrolladores de Flutter

#

Dart 2 era generalmente más rápido que Dart 1.x para el código compilado con AOT ejecutándose en nuestra VM, como las apps de Flutter. Sin embargo, en algunos casos extremos, las verificaciones exhaustivas añadidas por el nuevo sistema de tipos causaban una sobrecarga indeseada del 20–40%. En Dart 2.1 hemos reducido enormemente el costo de las verificaciones de tipos, tanto para el código compilado con AOT como para el código ejecutado en la VM con compilación JIT (just-in-time).

Un caso concreto que se beneficia de esto son nuestras herramientas de desarrollo (que se ejecutan usando la VM). Por ejemplo, realizar análisis de código de una gran app de benchmark (basada en múltiples copias concatenadas del Flutter Gallery) solía tomar ~41 segundos; ahora toma ~25 segundos.

Mejoras de rendimiento de Dart 2.1 para desarrolladores web

#

También mejoramos el tamaño del código y el tiempo de compilación para el código de Dart que se ejecuta en la web. Nos enfocamos en el tamaño de salida de dart2js y estamos viendo buenos resultados, como una reducción del 17% en el tamaño del output minificado y una mejora del 15% en el tiempo de compilación para uno de nuestros ejemplos.

Cambios más allá del SDK core

#

Además de los cambios mencionados en el SDK de Dart, hemos hecho algunos cambios emocionantes fuera del SDK core.

Los protocol buffers (o protobuf para abreviar) son un mecanismo neutral respecto a la plataforma para serializar datos estructurados. Se usan extensamente dentro de Google y también están viendo una fuerte adopción fuera de Google — por ejemplo como parte de gRPC. Dart es ahora un lenguaje oficialmente soportado por protobuf, y hemos añadido documentación detallada en el sitio web principal de protocol buffers con tanto un tutorial como documentación de referencia.

Puede que hayas escuchado sobre knative — una plataforma basada en Kubernetes — para soportar la construcción, despliegue y gestión de cargas de trabajo serverless. Recientemente investigamos el soporte para servir código Dart en knative, y creamos un pequeño ejemplo. Esto probablemente sea demasiado de bajo nivel para la mayoría de desarrolladores de apps Dart, pero nos parece muy emocionante desde una perspectiva de plataforma, y anticipamos que será un bloque de construcción crítico para obtener mejor soporte para servir código Dart en Google Cloud — por ejemplo para crear backends para apps de Flutter.

Obteniendo Dart 2.1

#

El SDK de Dart 2.1 está disponible desde la página principal de Dart. Si eres desarrollador de Flutter, Dart 2.1 está incluido como parte del próximo release de Flutter 1.0.

También hemos actualizado DartPad para ejecutar Dart 2.1, y hemos añadido ejemplos para conversión de int a double y mixins.

¿Qué viene ahora?

#

Esperamos publicar varios releases 2.x que aprovechen la base de la plataforma Dart 2. Basaremos estos en las necesidades de nuestros partners de framework y desarrolladores de apps. En 2019 esperamos investigar las siguientes áreas:

  • Continuación de la evolución del lenguaje Dart: Para Dart 2.2, estamos investigando varios cambios, como refinamientos a las expresiones const y soporte para un nuevo literal de Set. Más allá de 2.2 estamos revisando nuestro soporte para strings Unicode, e investigando si podemos ofrecer mejor null safety.

  • Más mejoras para optimizar Dart como lenguaje para crear interfaces de usuario: Dart 2 comenzó este viaje con su nuevo sistema de tipos y el new opcional, Dart 2.1 añadió inferencia de valores de int a double, y actualmente estamos investigando varias mejoras potenciales como soporte para condicionales en listas de widgets, expansión de colecciones de objetos en otras colecciones, e incluso potencialmente eliminar la necesidad de terminar sentencias con punto y coma.

  • Aún mejor rendimiento: Continuaremos reduciendo el tamaño y mejorando el rendimiento del código Dart compilado, incluyendo mejor soporte para usar procesadores multi-core, mayor reducción del tamaño del código para mejorar el tiempo de descarga e inicialización, y potencialmente más control sobre si el tamaño o el rendimiento en runtime es más crítico.

Para más sobre Dart y Flutter, nos encantaría que te unas a nosotros en Flutter Live, un evento online que tendrá lugar el 4 de diciembre y que se transmitirá en vivo por la web. Estamos emocionados de compartir más sobre la hoja de ruta con ustedes entonces.

Eso es todo por ahora. ¡Esperamos que disfrutes Dart 2.1!

Más de Dart