La empresa Google ha publicado el lanzamiento del lenguaje de programación Dart 2.15, que continúa el desarrollo de una rama completamente revisada de Dart 2, la cual se diferencia de la versión original del lenguaje Dart por la aplicación de una fuerte tipificación estática (los tipos pueden ser inferidos automáticamente, por lo que la especificación de los tipos no es obligatoria, pero ya no se utiliza la tipificación dinámica y el tipo inferido originalmente se asigna a la variable y se aplica una verificación de tipo estricta posteriormente).
Características del lenguaje Dart:
- Sintaxis familiar y sencilla de aprender, natural para programadores que vienen de JavaScript, C y Java.
- Ofrecimiento de un rápido inicio y alto rendimiento para todos los navegadores web modernos y diferentes tipos de entornos, desde dispositivos portátiles hasta potentes servidores.
- Capacidad para definir clases e interfaces, permitiendo el uso de encapsulamiento y la reutilización de métodos y datos existentes.
- La especificación de tipos facilita la depuración y la identificación de errores, hace que el código sea más claro y legible, y simplifica su modificación y análisis por parte de otros desarrolladores.
- Entre los tipos soportados se encuentran: varios tipos de hashes, arrays y listas, colas, tipos numéricos y de cadenas, tipos para definir fechas y horas, expresiones regulares (RegExp). También es posible crear tipos propios.
- Para organizar la ejecución paralela, se sugiere usar clases con el atributo isolate, cuyo código se ejecuta completamente en un espacio aislado en un área de memoria separada, interactuando con el proceso principal mediante el envío de mensajes.
- Soporte para el uso de bibliotecas que facilitan el mantenimiento y depuración de grandes proyectos web. Implementaciones de funciones de terceros pueden conectarse como bibliotecas compartidas. Las aplicaciones pueden dividirse en partes y delegar el desarrollo de cada parte a un equipo de programadores diferente.
- Conjunto de herramientas listas para apoyar el desarrollo en el lenguaje Dart, incluyendo la implementación de herramientas de desarrollo dinámico y depuración con corrección de código en tiempo real ("edit-and-continue").
- Para simplificar el desarrollo en el lenguaje Dart, se proporciona un SDK, un gestor de paquetes pub, un analizador de código estático dart_analyzer, un conjunto de bibliotecas, un entorno de desarrollo integrado DartPad y complementos con soporte para Dart en IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 y Vim.
- Los paquetes adicionales con bibliotecas y utilidades se distribuyen a través del repositorio pub, que cuenta con aproximadamente 22 mil paquetes.
Los cambios principales en la versión Dart 2.15:
- Se han proporcionado herramientas para la ejecución rápida en paralelo de tareas con aislamiento de manejadores. En sistemas multinúcleo, el entorno de ejecución de Dart ejecuta por defecto el código de la aplicación en un núcleo de la CPU, mientras que otros núcleos se utilizan para llevar a cabo tareas del sistema, como la entrada/salida asíncrona, la escritura en archivos o la realización de llamadas de red. Para las aplicaciones que necesitan ejecutar sus manejadores en paralelo, por ejemplo, para renderizar animaciones en la interfaz de usuario, existe la posibilidad de ejecutar bloques de código separados (isolate), aislados entre sí y ejecutados en otros núcleos de la CPU simultáneamente con el hilo principal de la aplicación. Para protegerse de errores que ocurren al ejecutar código que opera con un mismo conjunto de datos en diferentes bloques isolate, se prohíbe el uso compartido de objetos mutables entre ellos, y se utiliza un modelo de interacción basado en la transmisión de mensajes.
En Dart 2.15 se introduce un nuevo concepto: grupos de bloques aislados (isolate groups), que permiten organizar el acceso compartido a diversas estructuras de datos internas en los bloques isolate que pertenecen a un mismo grupo, lo que permite reducir significativamente los costos asociados a la interacción de los manejadores dentro del grupo. Por ejemplo, lanzar un bloque isolate adicional en un grupo existente se realiza 100 veces más rápido y requiere entre 10 y 100 veces menos memoria que lanzar un bloque isolate aislado, gracias a la eliminación de la necesidad de inicializar estructuras de datos del programa.
A pesar de que se sigue prohibiendo el acceso compartido a objetos mutables en bloques isolate, se utiliza memoria heap compartida en grupos, lo que permite acelerar significativamente la transferencia de objetos de un bloque a otro sin necesidad de realizar operaciones de copia que consumen muchos recursos. En la nueva versión también se permite enviar el resultado del manejador al llamar a Isolate.exit() para transferir datos al bloque isolate padre sin operaciones de copia. Además, se ha optimizado el mecanismo de transmisión de mensajes: los mensajes pequeños y medianos ahora se procesan aproximadamente 8 veces más rápido. Los objetos que se pueden transferir entre bloques isolate mediante la llamada a SendPort.send() incluyen ciertos tipos de funciones, clausuras y trazas de pila.
- Se han eliminado las restricciones sobre la creación de punteros a funciones en el código de constructores en las herramientas para crear punteros a funciones en otros objetos (tear-off), lo que puede ser útil al construir interfaces basadas en la biblioteca Flutter. Por ejemplo, para crear un widget Column que incluye varios widgets Text, se puede llamar a “.map()” y pasar punteros al constructor Text.new del objeto Text: class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column(children: [‘Apple’, ‘Orange’].map(Text.new).toList()); } }
- Se han ampliado las capacidades relacionadas con el uso de punteros a funciones. Se ha añadido la posibilidad de aplicar métodos genéricos y punteros a funciones para crear un método y un puntero no genéricos: T id(T value) => value; var intId = id; // permitido en la versión 2.15 en lugar de “int Function(int) intId = id;” const fo = id; // puntero a la función id. const c1 = fo;
- En la biblioteca dart:core se ha mejorado el soporte para enumeraciones (enum), por ejemplo, ahora se puede imprimir el valor de cadena de cada valor de enum mediante el método “.name”, realizar selecciones de valores por nombre o hacer coincidencias de pares de valores: enum MyEnum { one, two, three } void main() { print(MyEnum.one.name); // se imprimirá “one”. print(MyEnum.values.byName(‘two’) == MyEnum.two); // se imprimirá “true”. final map = MyEnum.values.asNameMap(); print(map[‘three’] == MyEnum.three); // “true”. }
- Se ha implementado una técnica de compresión de punteros que permite utilizar una representación más compacta de punteros en entornos de 64 bits, siempre que se disponga de un espacio de direcciones de 32 bits (se utiliza un máximo de 4 GB de memoria). Las pruebas han demostrado que esta optimización puede reducir el tamaño del montón en aproximadamente un 10%. En el SDK de Flutter, este nuevo modo ya está activado por defecto para Android, y en la próxima versión se tiene previsto activarlo para iOS.
- El SDK de Dart incluye herramientas para depuración y análisis de rendimiento (DevTools), que anteriormente se proporcionaban en un paquete separado.
- Se han añadido herramientas al comando 'dart pub' y al repositorio de paquetes pub.dev para rastrear la publicación accidental de información confidencial, como dejar credenciales de sistemas de integración continua y entornos en la nube dentro del paquete. Si se detectan tales filtraciones, la ejecución del comando 'dart pub publish' se interrumpirá con un mensaje de error. En caso de un falso positivo, se ha proporcionado la opción de eludir la verificación a través de una lista blanca.
- Se ha añadido la posibilidad de retirar versiones ya publicadas de un paquete en el repositorio pub.dev, por ejemplo, en caso de detectar errores críticos o vulnerabilidades. Anteriormente, para tales correcciones se practicaba la publicación de una versión corregida, pero en algunas situaciones es necesario cancelar un lanzamiento y detener su distribución de inmediato (por ejemplo, si la corrección aún no está lista o si por error se publicó una versión completa en lugar de la versión de prueba). Una vez retirado, el paquete deja de ser reconocido en los comandos 'pub get' y 'pub upgrade', y en los sistemas que ya lo tienen instalado, al ejecutar 'pub get' se muestra una advertencia especial.
- Se ha añadido una protección contra la vulnerabilidad (CVE-2021-22567) causada por el uso de caracteres unicode en el código que alteran el orden de visualización.
- Se ha corregido una vulnerabilidad (CVE-2021-22568) que permite hacerse pasar por otro usuario de pub.dev al publicar paquetes en un servidor externo que acepta tokens de acceso oauth2 de pub.dev. Por ejemplo, esta vulnerabilidad puede usarse para atacar servidores internos y corporativos de paquetes. Los desarrolladores que alojan paquetes únicamente en pub.dev no se ven afectados por este problema.
Se presenta una importante actualización del marco de construcción de interfaces de usuario Flutter 2.8, que se considera una alternativa a React Native y permite, a partir de una única base de código, lanzar aplicaciones para plataformas como iOS, Android, Windows, macOS y Linux, así como crear aplicaciones que se ejecuten en navegadores. Flutter también ha sido la base de la interfaz de usuario del sistema operativo microkernel Fuchsia en desarrollo por Google. Se observa que, en los últimos seis meses, el número de aplicaciones en Flutter 2 en Google Play Store ha aumentado de 200,000 a 375,000, es decir, casi el doble.
La mayor parte del código de Flutter está implementada en el lenguaje Dart, mientras que el motor de ejecución para aplicaciones está escrito en C++. Al desarrollar aplicaciones, además del propio lenguaje Dart nativo de Flutter, se puede utilizar la interfaz Dart Foreign Function para llamar código en C/C++. La alta performance de ejecución se logra gracias a la compilación de aplicaciones en código máquina para las plataformas de destino. No es necesario recompilar el programa después de cada cambio: Dart ofrece un modo de recarga en caliente que permite realizar cambios en la aplicación en funcionamiento y evaluar los resultados de inmediato.
Entre los cambios en la nueva versión de Flutter, se destaca la optimización de la velocidad de arranque y el consumo de memoria en dispositivos móviles. Se ha simplificado la conexión de aplicaciones a servicios backend como Firebase y Google Cloud. Las herramientas para la integración con Google Ads han sido estabilizadas. Se ha mejorado significativamente el soporte para cámaras y plugins web. Se han propuesto nuevas herramientas para facilitar el desarrollo, como un widget para autenticación utilizando Firebase. El motor Flame, destinado al desarrollo de juegos 2D utilizando Flutter, ha sido actualizado.
Fuente: opennet.ru
