Anuncio de Dart 2.6 con dart2native: compile Dart en ejecutables nativos autónomos.

Eduardo Coto
9 noviembre, 2019

. . .

Fuente original: Announcing Dart 2.6 with dart2native: Compile Dart to self-contained, native executables
Autor: Michael Thomsen

Dart ya ofrece un extenso conjunto de compiladores para construir código optimizado de producción para dispositivos móviles y la web. Estos compiladores flexibles permiten a nuestros socios del framework dirigirse a una amplia gama de formas: aplicaciones Flutter en Android & iOS, aplicaciones Flutter en la web & escritorio, aplicaciones AngularDart en la web, y Asistente Google en dispositivos integrados.

Hoy estamos anunciado dart2native, una extension de nuestro conjunto de compiladores existentes, con la habilidad de compilar programas Dart en ejecutables autocontenidos que contienen código de máquina compilado antes de tiempo. Con dart2native, puedes construir herramientas para la línea de comandos en macOS, Windows o Linux usando Dart. La imagen de anuncio de esta característica fue implementada usando la característica en sí 🙂

Dart Nativo y el compilador dart2native

Dart ha soportado la compilación AOT (anticipada) de código de máquina nativa durante muchos años, y Dart Nativo es, por lo tanto una tecnología bastante madura. Sin embargo, en el pasado solo expusimos esta capacidad en dispositivos móviles iOS y Android a través de Flutter.

Con dart2native, estamos extendiendo nuestra compatibilidad de compilación nativa para soportar los sistemas operativos de escritorio tradicionales que ejecutan macOS, Windows y Linux. Porque los ejecutables creados con dart2native son independientes, ellos pueden ejecutarse en máquinas que no tienen el SDK de Dart instalado.
Y porque están compilados con el compilador AOT de Dart, los ejecutables se empiezan a ejecutar en tan solo unos pocos milisegundos. Al igual que con otros compiladores y tiempos de ejecución de Dart, el mismo conjunto de bibliotecas principales ricas y consistentes están disponibles en Dart al compilar en código nativo.

Hemos escuchado que muchos clientes preguntan por la compilación AOT para sistemas operativos de escritorio — el sexto problema mejor calificado en nuestro rastreador de problemas — por lo que estamos encantados de poder hacer que esta característica esté disponible.

Creación de aplicaciones de línea de comandos con dart2native

El compilador dart2native es una gran opción para construir e implementar aplicaciones basadas en Dart para la línea de comandos . Estas aplicaciones a menudo usan bibliotecas como dart:io(E / S básica), package:http (redes) y package:args(análisis de argumentos). Repasemos los conceptos básicos de compilar una aplicación «hola mundo» en un ejecutable:

El código fuente hello.dart:

main () { 
  print ('Desarrolladores Hello Dart'); 
}

Compilar hello.dart a un hello ejecutable:

$ dart2native src / hello.dart -o hello 
Generado: / Usuarios / mit / hello

Ejecute la hello medición del tiempo de ejecución:

$ time ./hello 
Hello Dart desarrolladores real 0m0.049s 
usuario 0m0.018s 
sys 0m0.020s

¡Observe cómo se inicia el comando, se imprime en stdout y sale en un tiempo combinado de solo 49 milisegundos!

Hemos visto algunos desarrolladores de Dart que ya experimentan con dart2native herramientas de línea de comandos:

  • Natalie, del equipo SASS (una popular herramienta de extensión CSS) informa que después de cambiar su implementación SASS basada en Dart para compilar con dart2native, ahora es competitiva en rendimiento con LibSass, una implementación basada en C ++.
  • Filip del equipo Dart DevRel vuelve a compilar su linkchecker herramienta con dart2native, y vio un aumento de velocidad 27x al comprobar los sitios pequeños.

Interoperabilidad con código C a través de dart:ffi

Aplicaciones nativas a menudo necesitan accesar a la funcionalidad nativa desde el sistema operativo que lo rodea. Estas APIs del sistema generalmente están expuestas en bibliotecas nativas basadas en C, y Dart soporta interoperabilidad con estas bibliotecas a través de dart2native , nuestro nuevo mecanismo para interoperabilidad con C, que lanzamos en la vista previa en Dart 2.5. El compilador dart2native es compatible con dart:ffi, así que puedes crear y compilar de forma nativa aplicaciones Dart que lo usen.

Un miembro del equipo recientemente usó dart:ffi para crear una biblioteca dart_console para el desarrollo de aplicaciones de consola, que tiene funcionalidades como obtener las dimenciones de la ventana, leer y configurar la ubicación del cursor, administrar colores, leer teclas y secuencias de control. La capacidad de usar dart:ffi hace de Dart un lenguaje muy poderoso para aplicaciones de consola.

Kilo: un editor de código de 7MB escrito en menos de 500 lineas de código Dart.

Usando las bibliotecas principales de Dart, dart:ffi y la biblioteca dart_console, puedes construir aplicaciones de consola bastante interezantes. El paquete dart_console incluye una demostración completa de kilo, un editor de texto de consola escrito en solo 500 líneas de código Dart. El nombre kilo proviene de su origen, kilo.c, que fue una implementación en C en aproximadamente de 1000 líneas de código.

Con el nuevo compilador dart2native puedes empaquetarlo falcilmente, y terminas con un editor de código autonomo de 7MB. Aquí hay una demostración de como compilar el editor y luego usar el editor compilado para editar nuestro código fuente para corregir un error:

El editor kilo escrito en Dart y compilado a un ejecutable con dart2native, editando su propio código.

Servicios de construccion con dart2native

Otro uso potencial del compilador dart2native es para pequeños servicios, por ejemplo, un backend que admite una aplicación frontend escrita usando Flutter. En los últimos años, una tendencia creciente ha sido el uso de servicios que se ejecutan en la informática sin servidor. Estos son servicios totalmente administrados que se escalan automaticamente, incluida la ampliación de cero a cero (no se está ejecutando), lo que ofrece el potencial de reducir considerablemente los costos porque se facturan solo cuando se están ejecutando. Google Cloud hace que la informática sin servidor este disponible a través de CloudRun.

Para backends sin servidor es fundamental que el servicio inicie rápidamente. Tradicionalmente, los servicios basados en Dart se han ejecutado con nuestro compilador JIT(justo a tiempo), pero la ejecución basada en JIT tiene una alta latencia cuando se inicia, ya que el código debe compilarse y calentarse antes de que pueda comenzar a ejecutarse. Al compilar el código de su servicio con anticipación a código nativo, puede evitar esta latencia y comenzar a ejecutarse de inmediato. Además, con el código nativo puedes construir servicios Dart que tengan una pequeña huella de disco y sean independientes, reduciendo en gran medida el tamaño del contenedor en el que se ejecuta el servicio Dart. El desarrollador de Dart Paul Mundt documentó recientemente sus experiencias con el uso del compilador dart2native; fue capaz de reducir el tamaño de su imagen Docker en un 91% desde 220MB usando código compilado JIT hasta solo 20MB usando código nativo! Consulte nuestra documentación para obtener más detalles acerca de las aplicaciones del lado del servidor y paquetes.

Disponibilidad

El compilador dart2native está disponible en el SDK de Dart a partir de la versión 2.6, en dart.dev/get-dart. Una vez que tienes el SDK instalado, deberías ver el nuevo compilador dentro del directorio bin/ y en su PATH. Dart.dev más documentación.

Si obtienes el SDK de Dart a través de Flutter, tenga en cuenta que las compilaciones actuales de Flutter tienen el soporte dart2native incompleto. Te recomiendo que instales el SDK de Dart 2.6 desde dart.dev/get-dart.

Limitaciones conocidas

Esta versión inicial del compilador dart2native tiene unas limitaciones conocidas, listadas a continuación. Puedes informarnos que problemas son importantes para usted agregando “aprobado” al problema en nuestro rastreador de problemas GitHub.

  • Sin compatibilidad con compilación cruzada (problema 28617): El compilador dart2native admite crear código máquina solo para el sistema operativo que se ejecuta. Por lo tanto, necesitarás ejecutar el compilador tres veces, en macOS, Windows y Linux, si quieres crear ejecutables para los tres. Una manera de hacer esto es un proveedor de IC (Integración Continua) que admita los tres sistemas operativos.
  • Sin soporte de firma (problema 39106): Los ejecutables producidos usan un formato que no es compatible con las herramientas de firma estándar, tales como codesign y signtool.
  • Sin soporte para dart:mirrors y dart:developer(consulte las principales bibliotecas Dart ).

Otros cambios en Dart 2.6

La verisión 2.6 del SDK de Dart también tiene algunos cambios.

Lanzamos una vista previa de dart:ffi, nuestro nuevo mecanísmo para interoperabilidad C , en Dart 2.5. Dart 2.6 tiene una nueva versión de dart:ffi. Esta nueva versión tiene varios cambios importantes en la API para hacer que nuestras APIs sean más fáciles de usar, proporcionar más seguridad de tipo, y proporcionar un acceso conveniente a la memoria. Para detalles adicionales, consulte el registro de cambios de Dart 2.6. Con estos cambios dart:ffi se gradua a la versión beta, y esperamos que los cambios de API sean mucho menos frecuentes en el futuro, y se espera que la estabilidad general sea alta. Por favor continue enviandonos comentarios a través del rastreador de problemas.

Dart 2.6 también contiene una vista previa de una nueva y emocionante función de lenguaje, métodos de extención. Todavía nos queda un poco de pulido y herramientas para completar esta función, pero esperamos lanzarla formalmente en nuestra siguiente versión del SDK de Dart. Entoces tendremos mucho más que decir acerca de los métodos de extención; por ahora puedes leer acerca de las consideraciones de diseño detrás de la función.

Pasos siguientes

Descarga el SDK de Dart 2.6 (dart.dev/get-dart), construye algo genial con dart2native, y cuéntenoslo. Si estás dispuesto a compartir los detalles, por favor deje una respuesta al final de este artículo. Estamos emocionados por ver lo que construiste!

10

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Comunidades en Español