Dart 2.2 anunciado: Código de máquina más eficiente, soporte para set literales

Fuente [Anunciando Dart 2.2: código nativo más rápido, soporte para literales establecidos]

Hoy (26 de febrero de 2019) anunciamos el lanzamiento del Dart 2.2 SDK, una actualización para Dart 2 que ofrece un rendimiento mejorado del código anticipado (AOT) y soporte para los literales Set.

imagen

Mejora del rendimiento de Dart para el desarrollo de Flutter


Continuamos nuestro trabajo para hacer que el código compilado por AOT , como las aplicaciones Flutter, sea aún más rápido. En Dart 2.1, redujimos el costo de la verificación de tipo al reducir significativamente el costo de la verificación de tipo tanto para el código compilado por AOT como para el código que se ejecuta en una máquina virtual con compilación JIT (justo a tiempo).

En Dart 2.2, nos centramos en el rendimiento del código compilado por AOT, mejorando el rendimiento en un 11-16% en microbenchmarks (al aumentar el tamaño del código en ~ 1%). Esta mejora es el resultado del trabajo durante varios trimestres, con el fin de reducir los costos de las llamadas estáticas. Nuestro código AOT optimizado ahora puede llamar al objeto solicitado directamente usando una llamada de PC (es decir, usando el contador del Programa ). Antes de eso, tuvimos que realizar una búsqueda varias veces en el grupo de objetos para determinar la dirección requerida. Estas optimizaciones son especialmente útiles cuando el código contiene muchos constructores y llamadas a métodos estáticos, como el código de interfaz de usuario de Flutter, que contiene muchos widgets.

Soporte para Set Literals en Dart 2.2


La biblioteca principal de Dart (dart: core) contiene varias clases de colección: mapas , listas y conjuntos . Los mapas son conjuntos de pares clave-valor. Las listas son secuencias ordenadas de valores, a cada una de las cuales se puede acceder mediante el índice y que pueden aparecer varias veces. Los conjuntos son colecciones de valores desordenadas en las que cada valor solo puede aparecer una vez y donde se puede verificar efectivamente para ver si hay un valor en la colección.

Las colecciones de Dart generalmente se inicializan con constantes de tiempo de compilación, y Dart ofrece una sintaxis conveniente para escribir esta inicialización. En la Lista de dardos, puede inicializar de la siguiente manera:

const List<String> releases = ['Dart 2.0', 'Dart 2.1', 'Dart 2.2']; 

Anteriormente, Dart solo admitía la sintaxis literal para List y Map, por lo que la inicialización de Set fue engorrosa, ya que tuvimos que inicializar a través de la lista:

 Set<String> currencies = Set.of(['EUR', 'USD', 'JPY']); 

Este código no solo es inconveniente e ineficiente; La falta de soporte literal impide la creación de un conjunto inmutable en tiempo de compilación. Con la adición del soporte de Set literal en Dart 2.2, inicialice el conjunto y hágalo inmutable utilizando una nueva sintaxis conveniente:

 const Set<String> currencies = {'EUR', 'USD', 'JPY'}; 

Aquí se pueden encontrar ejemplos reales del uso de literales Set con el comando Flutter. Para obtener una visión más profunda del problema, le sugerimos que se familiarice con el recorrido por el idioma Dart 2.2 actualizado .

Innova con el Dart 2 Common Front-End (CFE)


Dart ofrece varias implementaciones propias: la máquina virtual Dart utilizada por Flutter, el compilador dart2js y el compilador de desarrollo Dart (dartdevc), todos los cuales utilizan el compilador front-end común. El Dart Common Front End, o CFE, analiza el código Dart, realiza inferencia de tipos y traduce el Dart a un lenguaje intermedio de nivel inferior, que los compiladores de back-end aceptan como entrada.

Los literales de conjunto son un ejemplo de una construcción de lenguaje que pudimos implementar rápidamente gracias a CFE. El código para analizar literales Set y realizar inferencia de tipos se implementó una vez usando CFE para todas las implementaciones. Además, creamos una implementación de transición que podrían usar los compiladores de back-end en la etapa inicial. En una implementación intermedia, una versión mutable del Conjunto de literales especificado se tradujo durante la compilación a la forma equivalente:

 Set<String> currencies = Set<String>()..add('EUR')..add('USD')..add('JPY'); 

Una implementación intermedia de literales Set constantes difiere en que no pueden ensamblarse gradualmente en partes. En cambio, implementamos esto en términos de una clase Set inmutable privada que envuelve un Mapa inmutable, donde los elementos Set son claves del Mapa:

 const Set<String> currencies = _UnmodifiableSet<String>({'EUR': null, 'USD': null, 'JPY': null}); 

La clase Set inmutable implementa métodos en la interfaz Set, delegándolos en el Mapa interno.

En general, pudimos implementar Set literales inicialmente como una función exclusiva de CFE. El back-end podría usar inmediatamente la implementación de CFE e implementar su propio soporte más adelante. Esto permitió a los compiladores de back-end posponer su soporte hasta que los aspectos de rendimiento de esta función se entendieran mejor.

Dart 2.2 Especificación


Dart 2 fue una actualización tan importante para Dart que nos llevó un tiempo actualizar la especificación del idioma oficial para cumplir con todos los cambios que realizamos. Finalmente completamos este trabajo, y la especificación se actualizó a la versión Dart 2.2. También hemos trasladado la especificación del idioma al nuevo repositorio y hemos agregado una integración continua para garantizar que la especificación se actualice constantemente en formato PDF a medida que se desarrollen futuras versiones del lenguaje Dart. Las especificaciones 2.2 y futuras Dart 2.x están disponibles en la página de especificaciones de Dart .

Cómo instalar Dart 2.2


Dart SDK 2.2 está disponible en la página de inicio de Dart a partir de hoy. Si eres un desarrollador de Flutter, Dart 2.2 ya está incluido. (Nota: en el comando flutter doctor console, los canales actuales de Flutter master y dev informarán Dart 2.2. La versión estable de Flutter 1.2 de hoy generará Dart 2.1.2; esta versión tiene las mismas capacidades que Dart 2.2).

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



Muchas gracias por su ayuda en traducir PsyHaSTe

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


All Articles