¿Por qué Flutter usa Dart?

Cesar Vega
Mar 5 · 19 min read

Este artículo es una traducción de un artículo publicado originalmente en inglés por Wm Leler en Hackernoon. Por favor, visita el siguiente enlace y recomienda el artículo original si te gusta el contenido:

Muchos lingüistas creen que el lenguaje natural que una persona habla afecta su forma de pensar. ¿Se aplica el mismo concepto a los lenguajes de programación? Los programadores que trabajan en diferentes tipos de lenguajes de programación a menudo proponen soluciones radicalmente diferentes a los problemas. Como ejemplo más extremo, los informáticos eliminaron la sentencia goto para fomentar programas más estructurados (no es lo mismo que los líderes totalitarios del novel de 1984, que eliminaban las palabras heréticas del lenguaje natural para eliminar los crímenes de pensamiento, pero se entiende la idea).

¿Qué tiene que ver esto con Flutter y Dart? Bastante, en realidad. El primer equipo de Flutter evaluó más de una docena de idiomas y eligió a Dart porque se ajustaba a la forma en que estaban construyendo las interfaces de usuario.

Dart es una gran razón por la que a los desarrolladores les encanta Flutter. Como dice un tweet:

He aquí una lista rápida de las características de Dart que juntas lo hacen indispensable para Flutter:

  • Dart es AOT (Ahead Of Time) compilado en código nativo rápido y predecible, lo que permite que casi todo Flutter sea escrito en Dart. Esto no sólo hace que Flutter sea rápido, sino que prácticamente todo (incluidos todos los widgets) se puede personalizar.
  • Dart también puede ser compilado JIT (Just In Time) para ciclos de desarrollo excepcionalmente rápidos y un flujo de trabajo que cambia el juego (incluyendo la popular sub-segunda Stateful Hot Reload — recarga en caliente con manejo de estado).
  • Dart facilita la creación de animaciones y transiciones suaves que se ejecutan a 60fps. Dart puede hacer object allocation y garbage collection sin bloqueos. Y, al igual que JavaScript, Dart evita la programación anticipada y la memoria compartida (y, por lo tanto, los bloqueos). Debido a que las aplicaciones Flutter están compiladas en código nativo, no requieren un puente lento entre dominios (por ejemplo, JavaScript a nativo). También arrancan mucho más rápido.
  • Dart permite que Flutter evite la necesidad de un lenguaje de diseño declarativo separado como JSX o XML, o constructores de interfaces visuales separados, porque el diseño declarativo y programático de Dart es fácil de leer y visualizar. Y con todo el diseño en un solo lenguaje y en un solo lugar, es fácil para Flutter proporcionar herramientas avanzadas que hacen que el diseño sea un juego de niños.
  • Los desarrolladores han descubierto que Dart es particularmente fácil de aprender porque tiene características que son familiares para los usuarios de lenguajes estáticos y dinámicos.

No todas estas características son exclusivas de Dart, pero la combinación de ellas alcanza un punto óptimo que hace que Dart sea excepcionalmente poderoso para implementar Flutter. Tanto es así, que es difícil imaginar que Flutter sea tan poderoso como lo es sin Dart.

Flutter loves Dart

El resto de este artículo profundiza en muchas de las características de Dart (incluidas sus bibliotecas estándar) que lo convierten en el mejor lenguaje para implementar Flutter.

Compilación y ejecución

[Puedes saltarte esta sección si ya conoces temas como lenguajes estáticos versus dinámicos, compilación AOT y JIT, y máquinas virtuales.]

Históricamente, los lenguajes de programación se han dividido en dos grupos: lenguajes estáticos (por ejemplo, Fortran o C, donde las variables se escriben estáticamente en tiempo de compilación), y lenguajes dinámicos (por ejemplo, Smalltalk o JavaScript, donde el tipo de una variable puede cambiar en tiempo de ejecución). Los lenguajes estáticos se compilaban normalmente para producir programas de código nativo de máquina (o código ensamblador) para el equipo destino, que en tiempo de ejecución eran ejecutados directamente por el hardware. Los lenguajes dinámicos eran ejecutados por un intérprete, sin producir código de lenguaje de máquina.

Por supuesto, las cosas eventualmente se volvieron mucho más complicadas. El concepto de una máquina virtual (VM) se hizo popular, la cual no es más que un intérprete avanzado que imita a un hardware de máquina en software. Una máquina virtual facilita la transferencia de un lenguaje a nuevas plataformas de hardware. En este caso, el lenguaje de entrada de una máquina virtual suele ser un lenguaje intermedio. Por ejemplo, un lenguaje de programación (como Java) se compila en un lenguaje intermedio (bytecode) y luego se ejecuta en una VM (la JVM).

Además, ahora existen compiladores JIT (just-in-time). Un compilador JIT se corre durante la ejecución del programa, compilando sobre la marcha. Los compiladores originales que se ejecutan durante la creación del programa (antes del tiempo de ejecución) se denominan ahora compiladores ahead-of-time (AOT).

En general, sólo los lenguajes estáticos son aptos para la compilación de AOT en código de máquina nativo porque los lenguajes de máquina normalmente necesitan saber el tipo de datos, y en los lenguajes dinámicos el tipo no se fija de antemano. En consecuencia, los lenguajes dinámicos suelen ser interpretados o compilados por JIT.

Cuando la compilación AOT se realiza durante el desarrollo, invariablemente resulta en ciclos de desarrollo mucho más lentos (el tiempo que transcurre entre el momento en que se realiza un cambio en un programa y el momento en que se puede ejecutar el programa para ver el resultado del cambio). Pero la compilación AOT da como resultado programas que pueden ejecutarse de forma más predecible y sin pausas para el análisis y la compilación en tiempo de ejecución. Los programas compilados por AOT también comienzan a ejecutarse más rápido (porque ya han sido compilados).

Por el contrario, la compilación JIT proporciona ciclos de desarrollo mucho más rápidos, pero puede dar lugar a una ejecución más lenta o jerárquica. En particular, los compiladores JIT tienen tiempos de inicio más lentos, porque cuando el programa comienza a ejecutarse, el compilador JIT tiene que hacer análisis y compilación antes de que el código pueda ser ejecutado. Los estudios han demostrado que muchas personas abandonan una aplicación si tarda más de unos segundos en ejecutarse.

Ese es el final de la información de fondo. ¿No sería fantástico combinar las ventajas de la compilación de AOT y JIT? Sigue leyendo.

Compilación y ejecución de Dart

Antes de trabajar en Dart, los miembros del equipo de Dart habían hecho un trabajo pionero en compiladores avanzados y máquinas virtuales, tanto para lenguajes dinámicos (como el motor V8 para JavaScript y Strongtalk para Smalltalk) como para lenguajes estáticos (como el compilador Hotspot para Java). Ellos usaron esta experiencia para hacer a Dart inusualmente flexible en la forma en que puede ser compilado y ejecutado.

Dart es uno de los pocos idiomas (y quizás el único lenguaje “mainstream” [corriente/tendencia mayoritaria]) que está bien adaptado para ser compilado tanto AOT como JIT. El soporte de ambos tipos de compilación proporciona ventajas significativas para Dart y (especialmente) Flutter.

La compilación JIT se utiliza durante el desarrollo, utilizando un compilador que es especialmente rápido. Luego, cuando una aplicación está lista para su lanzamiento, se compila AOT. Consecuentemente, con la ayuda de herramientas y compiladores avanzados, Dart puede ofrecer lo mejor de ambos mundos: ciclos de desarrollo extremadamente rápidos y tiempos de ejecución y puesta en marcha rápidos.

La flexibilidad de Dart en la compilación y ejecución no se detiene ahí. Por ejemplo, Dart puede ser compilado en JavaScript para que pueda ser ejecutado por los navegadores. Esto permite la reutilización de código entre aplicaciones móviles y aplicaciones web. Los desarrolladores han reportado hasta un 70% de reutilización de código entre sus aplicaciones móviles y web. Dart también puede ser usado en un servidor ya sea compilado a código nativo, o compilado a JavaScript y usado con node.js.

Finalmente, Dart también proporciona una VM autónoma que utiliza el propio lenguaje Dart como su lenguaje intermedio (esencialmente actuando como un intérprete).

Dart puede ser compilado eficientemente AOT o JIT, interpretado o transpuesto a otros lenguajes. La compilación y ejecución de Dart no sólo es inusualmente flexible, sino que además es especialmente rápida.

La siguiente sección proporciona un ejemplo de cómo la velocidad de compilación de Dart puede cambiar las reglas del juego…

Stateful hot reload

Una de las características más populares de Flutter es su hot reload (recarga en caliente) extremadamente rápida. Durante el desarrollo, Flutter utiliza un compilador de JIT que puede recargar y continuar ejecutando código normalmente en menos de un segundo. El estado de la aplicación se mantiene en las recargas siempre que sea posible, de modo que la aplicación puede continuar desde donde se quedó.

Flutter’s sub-second stateful hot reload

Es difícil apreciar lo importante que puede ser un hot reload realmente rápido (y fiable) durante el desarrollo, a menos que lo haya experimentado usted mismo. Los programadores informan los cambios en la forma en que crean sus aplicaciones, describiéndolas como si fueran como pintar sus aplicaciones para la vida.

Esto es lo que dice un desarrollador de aplicaciones móviles sobre hot reload de Flutter:

Quería probar la recarga en caliente, así que cambié un color, guardé mi modificación y…. ¡me enamoré ❤️!

Esta característica es realmente asombrosa. Pensaba que Edit & Continue en Visual Studio era bueno, pero esto es simplemente asombroso. Sólo con esto, creo que un desarrollador de móviles puede ser dos veces más productivo.

Esto es realmente un cambio de juego para mí. Cuando despliego mi código y me lleva mucho tiempo, pierdo la concentración, hago otra cosa y cuando vuelvo al simulador/dispositivo he perdido la pista de lo que quería probar. ¿Qué es más frustrante que perder 5 minutos para mover un control por 2px? Con Flutter esto ya no existe.

El hot reload de Flutter hace que sea mucho más fácil probar nuevas ideas o experimentar con alternativas, proporcionando un gran impulso a la creatividad.

Hasta ahora, hemos discutido cómo Dart mejora las cosas para el desarrollador. La siguiente sección es sobre cómo Dart también hace más fácil crear aplicaciones fluidas que deleitan a los usuarios.

Evitar el jank

Una aplicación rápida es genial, pero una aplicación fluida es aún mejor. Incluso una animación súper rápida se verá mal si es irregular. Sin embargo, la prevención del jank puede ser difícil porque hay muchas causas diferentes. Dart tiene una serie de características para evitar muchas de las cosas comunes que causan jank.

Por supuesto, (como en cualquier lenguaje) todavía es posible escribir una aplicación janky en Flutter; Dart ayuda siendo más predecible y dando al desarrollador más control sobre la fluidez de su aplicación, haciendo que sea más fácil proporcionar la mejor experiencia de usuario posible, sin excepción.

¿Los resultados?

Con una velocidad de ejecución de 60 fps, las interfaces de usuario creadas con Flutter funcionan mucho mejor que las creadas con otros frameworks de desarrollo multiplataforma.

Y no solo mejor que las aplicaciones multiplataforma, sino tan buenas como las mejores aplicaciones nativas:

La interfaz de usuario es fluida como la mantequilla… Nunca he visto una aplicación Android tan fluida.

Compilación de AOT y el “puente”

Ya hemos discutido una característica que ayuda a mantener las cosas sin problemas, y es la capacidad de Dart de ser compilado AOT a código máquina nativo. El código AOT pre-compilado es más predecible que JIT porque no hay pausas durante el tiempo de ejecución para realizar análisis o compilación JIT.

Sin embargo, hay una ventaja aún mayor en el código compilado por AOT y es que se evita el “puente JavaScript”. Cuando los lenguajes dinámicos (como JavaScript) necesitan interoperar con código nativo en la plataforma, tienen que comunicarse a través de un puente, lo que provoca que los conmutadores de contexto tengan que ahorrar una cantidad particularmente grande de estado (potencialmente a almacenamiento secundario). Estos interruptores de contexto son un doble golpe porque no sólo ralentizan las cosas, sino que también pueden causar serios problemas.

“The Bridge”

Nota: incluso el código compilado puede necesitar una interface para hablar con el código de la plataforma, y esto también puede ser llamado un puente, pero esto es normalmente órdenes de un alcance más rápidas que el puente requerido por un lenguaje dinámico. Además, como Dart permite que cosas como los widgets se muevan a la aplicación, se reduce la necesidad de pasar por encima de un puente.

Programación preemptive, división del tiempo y recursos compartidos

La mayoría de los lenguajes de programación que soportan múltiples subprocesos de ejecución concurrente (incluyendo Java, Kotlin, Objective-C y Swift) utilizan la opción de preemption (La interrupción de un proceso informático sin su cooperación para realizar otra tarea) para cambiar entre subprocesos. A cada subproceso se le asigna una “porción” de tiempo para ejecutarse, y si excede su tiempo asignado, el subproceso se reemplaza usando un interruptor de contexto. Sin embargo, si la anticipación ocurre cuando un recurso, que es compartido entre subprocesos (como la memoria), está siendo actualizado, entonces esto causa una condición de competición.

Las condiciones de la competición son un doble golpe porque pueden causar serios errores, incluyendo la caída de tu aplicación y la pérdida de datos, y son particularmente difíciles de encontrar y arreglar porque dependen de la sincronización relativa de los subprocesos independientes. Es muy común que las condiciones de la competición dejen de manifestarse cuando se ejecuta la aplicación en un depurador.

La forma típica de arreglar una condición de competición es proteger el recurso compartido mediante un bloqueo que impide la ejecución de otros subprocesos, pero los bloqueos en sí mismos pueden causar problemas de jank, o incluso problemas más serios (incluyendo deadlock y starvation [es un problema que se encuentra en la computación concurrente, donde a un proceso se le niegan constantemente los recursos necesarios para procesar su trabajo]).

Dart tomó un enfoque diferente a este problema. Los subprocesos de Dart, llamados isolates, no comparten memoria, lo que evita la necesidad de realizar una gran cantidad de bloqueos. Los isolates se comunican pasando mensajes a través de canales, lo que es similar a los actores en Erlang o a los trabajadores de la web en JavaScript.

Dart, al igual que JavaScript, es de un único subproceso, lo que significa que no permite la prioridad en absoluto. En su lugar, los subprocesos ceden explícitamente (usando async/await, Futures, o Streams). Esto le da al desarrollador más control sobre la ejecución. Un único subproceso ayuda al desarrollador a garantizar que las funciones críticas (incluidas las animaciones y las transiciones) se ejecuten hasta su finalización, sin necesidad de un preaviso. Esto es a menudo una gran ventaja no sólo para las interfaces de usuario, sino también para otros códigos cliente-servidor.

Por supuesto, si el desarrollador olvida ceder el control, esto puede retrasar la ejecución de otro código. Sin embargo, hemos descubierto que es mucho más fácil encontrar y arreglar el olvido del rendimiento que el olvido del bloqueo (porque las condiciones de la competición son difíciles de encontrar).

Allocation y garbage collection

Otra causa importante de jank es el garbage collection. De hecho, se trata de un caso especial de acceso a un recurso compartido (memoria), que en muchos lenguajes requiere el uso de bloqueos. Pero los bloqueos pueden impedir que toda la aplicación se ejecute mientras se recolecta la memoria libre. Sin embargo, Dart puede realizar el garbage collection casi todo el tiempo sin bloqueos.

Dart utiliza un esquema avanzado de garbage collection generacional, que es particularmente rápido para asignar muchos objetos de vida corta (perfecto para interfaces de usuario reactivas como Flutter que reconstruyen el árbol de vista inmutable para cada frame). Dart puede asignar un objeto con un simple apuntador bump (no requiere bloqueo). Una vez más, esto resulta en un desplazamiento y animación fluidos, sin jank.

Diseño unificado

Otra ventaja de Dart es que Flutter no divide el diseño entre su programa y una plantilla adicional o lenguaje de diseño como JSX o XML, ni requiere herramientas de diseño visual separadas. Aquí hay una simple vista de Flutter, escrita en Dart:

Una vista en Dart y lo que produce

Observa lo fácil que es visualizar la salida que produce este código (incluso si no tienes experiencia con Dart).

Fíjate que ahora que Flutter usa Dart 2, el diseño se ha vuelto aún más simple y claro porque la palabra clave new es opcional, por lo que los diseños estáticos pueden parecerse aún más a los que están escritos en un lenguaje de diseño declarativo, como éste:

Sin embargo, sé lo que probablemente estás pensando, ¿cómo puede considerarse una ventaja la falta de lenguajes de diseño especializados? Pero en realidad es un cambio en el juego. Esto es lo que un desarrollador escribió en un artículo titulado “Por qué los desarrolladores de aplicaciones nativas deberían echar un vistazo a Flutter”.

En Flutter, los diseños se definen usando sólo código de Dart. No hay lenguaje XML/plantilla. Tampoco hay una herramienta visual de designer/storyboarding.

Tengo la corazonada de que, al oír esto, algunos de ustedes se estremecerán un poco. Prima facie, esa fue mi reacción también. ¿No es más fácil hacer diseños usando una herramienta visual? ¿No sería demasiado complicado escribir todo tipo de lógica de restricción en código?

La respuesta para mí resultó ser no. ¡Y vaya! Qué revelador ha sido.

La primera parte de la respuesta es el hot reload mencionado anteriormente.

No puedo dejar de recalcar que esto está a años luz de la Carrera Instantánea de Android, o cualquier otra solución similar. Simplemente funciona, incluso en grandes aplicaciones no triviales. Y es muy rápido. Ese es el poder de Dart para ti.

En la práctica, esto hace que una interface de editor visual sea redundante. No me perdí el bonito diseño de XCode para nada.

Dart crea un diseño conciso y fácil de entender, mientras que el “rápido” hot reload te permite ver los resultados al instante. Y eso incluye las partes no estáticas de tu diseño.

Y como resultado, he sido mucho más productivo escribiendo diseños en Flutter (Dart) que en Android/XCode. Una vez que le coges el pulso (para mí eso significó un par de semanas), hay una reducción sustancial de la sobrecarga debido al muy poco cambio de contexto que está ocurriendo. Uno no tiene que cambiar a un modo de diseño, y elegir un mouse y empezar a hacer clic alrededor. Y luego preguntarse si hay que hacer algo programáticamente, cómo lograrlo, etc. Todo es programático. Y las APIs están muy bien diseñadas. Se vuelve intuitivo en poco tiempo y es mucho más potente que las construcciones ofrecidas por los auto layout/layout XMLs.

Por ejemplo, aquí hay un diseño de lista simple que agrega un divisor (línea horizontal) entre cada otro elemento, definido por programación:

En Flutter, todo el diseño existe en un solo lugar, independientemente de si se trata de un diseño estático o de un diseño programático. Y las nuevas herramientas de Dart, incluyendo el Flutter Inspector y la vista de contorno (que aprovecha el hecho de que todo el diseño está en un solo lugar) hacen que los diseños complejos y hermosos sean aún más fáciles.

¿Es Dart un lenguaje propietario?

No, Dart (como Flutter) es completamente de código abierto con una licencia limpia, y también es un estándar ECMA. Dart es popular dentro y fuera de Google. Dentro de Google es uno de los lenguajes de más rápido crecimiento y es utilizado por Adwords, Flutter, Fuchsia y otros; en el exterior, el repositorio de Dart cuenta con más de 100 committers externos.

Un indicador aún mejor de la apertura de Dart es el crecimiento de la comunidad fuera de Google. Por ejemplo, estamos viendo un flujo constante de artículos y videos sobre Dart (incluyendo Flutter y AngularDart) de terceros, algunos de los cuales he citado en este artículo.

Además de los committers externos a Dart, hay más de 3000 paquetes en el repositorio público de paquetes de Dart, incluyendo bibliotecas para Firebase, Redux, RxDart, internacionalización, encripción, bases de datos, enrutamiento, colecciones, y más.

¿Será fácil encontrar programadores Dart?

Si no muchos programadores conocen Dart, ¿será más difícil encontrar programadores calificados? Irónicamente, Dart hace más fácil encontrar programadores porque es un lenguaje increíblemente rápido de aprender. Los programadores que ya conocen lenguajes como Java, JavaScript, Kotlin, C# o Swift pueden empezar a programar en Dart casi inmediatamente. Además, el hot reload anima a los usuarios a experimentar con Dart y probar cosas nuevas, lo que hace que el aprendizaje de Dart sea aún más rápido y placentero.

Así es como lo puso un programador en un artículo titulado “Por qué despegará Flutter en 2018”:

Dart, el lenguaje utilizado para desarrollar aplicaciones Flutter, es estúpido, fácil de aprender. Google tiene experiencia en la creación de lenguajes simples y bien documentados como Go, por ejemplo. Hasta ahora, para mí, Dart me recuerda a Ruby y es un placer aprender. No es sólo para móviles, sino también para la web.

De otro artículo sobre Flutter y Dart, titulado “¿Por qué Flutter y no framework X? o mejor aún, ¿por qué Voy con Flutter?”

Flutter utiliza el lenguaje de Dart que fue creado por google también, para ser honesto no soy un fan de los lenguajes fuertemente tipados como C# o JAVA, pero no sé por qué la forma en que Dart escribe el código parece diferente. Y me siento muy cómodo escribiéndolo. Tal vez porque es muy sencillo de aprender, y muy sencillo.

Dart fue diseñado específicamente para ser familiar y fácil de aprender, a través de una extensa investigación y pruebas de UX. Por ejemplo, en la primera mitad de 2017 el equipo de Flutter realizó un estudio de UX con ocho desarrolladores. Les dimos una breve introducción a Flutter, luego los soltamos por una hora más o menos creando una vista simple. Todos los participantes pudieron empezar a programar de inmediato, aunque nunca antes habían usado Dart. Estaban enfocados en escribir puntos de vista reactivos, no en el lenguaje. Dart simplemente funcionó.

Al final, un participante (que había avanzado mucho en la tarea) no había mencionado nada sobre el lenguaje, así que les preguntamos si se daban cuenta del lenguaje que estaban usando. Ellos no lo sabían. El lenguaje no importaba; ellos estaban programando en Dart en minutos.

La parte difícil de aprender un nuevo sistema es típicamente no aprender el lenguaje, es aprender todas las bibliotecas, frameworks, herramientas, patrones y mejores prácticas para escribir un buen código. Y las bibliotecas y herramientas de Dart son excepcionalmente buenas y están bien documentadas. Un artículo proclama, “Como extra, ellos también mantienen un cuidado tremendo de su base de código y tienen la mejor documentación que he visto nunca”. El poco esfuerzo que se gasta en aprender Dart se compensa fácilmente con el ahorro de tiempo que supone aprender el resto.

Como prueba directa, un gran proyecto dentro de Google quería portar su aplicación móvil a iOS. Estaban a punto de contratar a algunos programadores de iOS, pero en su lugar decidieron probar Flutter. Ellos monitorearon el tiempo que les tomó a los desarrolladores ponerse al día con Flutter. Sus resultados mostraron que un programador podía aprender Dart y Flutter y ser productivo en tres semanas. Esto se compara con las cinco semanas que habían observado anteriormente para que los programadores se pusieran al día sólo con Android (sin mencionar que tendrían que haber contratado y formado a desarrolladores para iOS).

Finalmente, el artículo “Por qué elegimos Flutter y cómo ha cambiado nuestra empresa para mejor” es de una empresa que trasladó su gran aplicación empresarial a Dart en las tres plataformas (iOS, Android y web). Sus conclusiones:

Mucho más fácil de contratar. Ahora buscamos al mejor candidato sin importar si es de Web, iOS o Android.

Tenemos el triple de ancho de banda ahora que todos nuestros equipos están consolidados en una sola base de código.

El intercambio de conocimientos está en su punto álgido.

Pudieron triplicar su productividad usando Dart y Flutter. Esto no debería ser una sorpresa dado lo que estaban haciendo antes. Ellos, como muchas compañías, estaban construyendo aplicaciones separadas para cada plataforma (web, iOS y Android) utilizando lenguajes, herramientas y programadores separados. El cambio a Dart significó que ya no tenían que contratar a tres tipos diferentes de programadores. Y fue fácil para ellos mover sus programadores existentes a Dart.

Ellos y otros han descubierto que una vez que los programadores empiezan a usar Flutter, a menudo se enamoran de Dart. Les gusta la brevedad del lenguaje y la falta de ceremonia. Les encantan las características del lenguaje, como las cascadas, los parámetros nombrados, la async/await y los streams. Y por encima de todo, les encantan las características de Flutter (como hot reload) que son posibles gracias a Dart, y las hermosas y eficientes aplicaciones que Dart les ayuda a construir.

Dart 2

A medida que este artículo se va publicando, Dart 2 está siendo liberado. Dart 2 se enfoca en mejorar la experiencia de construir aplicaciones cliente, incluyendo la velocidad del desarrollador, la mejora de las herramientas del desarrollador y la seguridad del type. Por ejemplo, Dart 2 cuenta con un robusto sistema type y la inferencia de type.

Dart 2 también hace que la palabra clave newsea opcional. Esto significa que es posible describir muchas vistas de Flutter sin usar ninguna palabra clave en absoluto, haciéndolas menos desordenadas y más fáciles de leer. Por ejemplo:

Dart 2 también utiliza la inferencia de type (tipo) para hacer que muchos usos de la palabra clave const sean opcionales al no requerir que la constsea especificada redundantemente dentro de un contexto const. Por ejemplo, la sentencia:

Ahora puede ser reemplazada por esta:

Debido a que breakfast es const, todo lo demás se infiere como consttambién.

El secreto es el enfoque

Las mejoras en Dart 2 se centran en la optimización del desarrollo por parte del cliente. Pero Dart seguirá siendo un gran lenguaje para construir sistemas de servidor, de escritorio, sistemas embebidos u otros programas.

El enfoque es algo bueno. Prácticamente todos los lenguajes populares perdurables se beneficiaron de estar muy enfocados. Por ejemplo:

  • C era un lenguaje de programación de sistemas para escribir sistemas operativos y compiladores. Se convirtió en mucho más.
  • Java era un lenguaje diseñado para sistemas embebidos.
  • JavaScript era un lenguaje de programación para navegadores web (!).
  • Incluso el muy malvado PHP tuvo éxito porque estaba enfocado en escribir Personal Home Pages (de donde obtuvo su nombre).

Por otro lado, muchos lenguajes han intentado (y fallado) explícitamente en ser completamente de propósito general, como PL/1 y Ada, entre otros. El problema más común es que sin enfoque, estos idiomas se convirtieron en fregaderos proverbiales de cocina.

Muchas de las características que hacen de Dart un gran lenguaje del lado del cliente también lo convierten en un mejor lenguaje para el uso del lado del servidor. Por ejemplo, el hecho de que Dart evite la multitarea preferente le da las mismas ventajas que un Nodo en el servidor, pero con una escritura mucho mejor y más segura.

Lo mismo ocurre con la escritura de software para sistemas embebidos. La habilidad de Dart para manejar múltiples entradas concurrentes de manera confiable es la clave aquí.

Finalmente, el éxito de Dart en el cliente inevitablemente generará más interés en usarlo en el servidor, tal como sucedió con JavaScript y Node. ¿Por qué obligar a la gente a usar dos idiomas diferentes para construir software cliente-servidor?

Conclusión

Este es un momento emocionante para Dart. A la gente que usa Dart le encanta, y las nuevas características de Dart 2 lo convierten en una adición aún más valiosa a tu arsenal de herramientas. Si no has usado Dart, espero que este artículo te haya proporcionado información valiosa acerca de lo que es nuevo o diferente acerca de Dart, y que le des, y a Flutter, una oportunidad.

Gracias a Tao Dong, Eric Seidel, Kathy Walrath, Matt Sullivan, Randal L. Schwartz, y Filip Hracek.

Telegram: https://t.me/flutter_dart_spanish

Slack: http://bit.ly/FlutterDevsEnEspa

Comunidad Flutter

Artículos e Historias de la Comunidad de Flutter

Cesar Vega

Written by

Systems Engineer, postgrade in Software Development, postgrade in Information Security

Comunidad Flutter

Artículos e Historias de la Comunidad de Flutter

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade