¿Os habéis preguntando el porqué alguien decide tener la genial idea de crear un nuevo lenguaje de programación? ¿Y el cómo se diseña?

En esta entrevista de SE Radio con Bob Nystrom, ingeniero software en Google y miembro del equipo de desarrollo de Dart, nos explican los orígenes y decisiones de diseño que han dado lugar al lenguaje Dart.

Dart es un “client-optimized language for fast apps on any platform” que enseguida veremos que significa ya este foco orienta el diseño del lenguaje. Pero da igual si os interesa Dart o no. Lo interesante es ver el proceso de diseño que es útil para cualquier lenguaje.

Os hago un resumen de los puntos más importantes:

  • Un lenguaje orientado al cliente implica que va a ejecutarse mayoritariamente en un hardware que no controlas. Los lenguajes de backend implementan servicios que vas a ofrecer desde tu servidor con lo que si hay problemas de eficiencia siempre puedes contratar más máquinas.  Si es un lenguaje para front-end y el compilador genera un código lento, la experiencia de usuario será mala. Para lenguajes orientados al cliente, el rendimiento es muy importante.
  • Al mismo tiempo, los lenguajes de front-end acostumbran a ser lenguajes de alto nivel ya que muchas veces una parte importante es el diseño de las interfaces de usuario. Un lenguaje de alto nivel es más difícil de optimizar con lo que hay que buscar el equilibrio entre las dos necesidades.
  • Cuando Dart nació no teníamos ninguna “killer application” (el discurso al inicio era convertir Dart en el lenguaje de la web para el que los navegadores tendrían soporte nativo) con lo que la adopción era muy baja. Hasta que apareció Flutter. Flutter es como el Ruby en Rails de Dart. A veces hay que ir pivotando el diseño del lenguaje hasta que das con la aplicación que lo lanzará al estrellato.
  • Cuesta mucho convencer a alguien de que aprenda un nuevo lenguaje. Les va a llevar tiempo ser productivos. Para hacerlo más fácil puedes hacer que tu lenguaje se asemeje a otros lenguajes ya existentes. Pero, cuidado, si es demasiado parecido, la gente se preguntará entonces ¿por qué cambiar?

Tu lenguaje tiene que ser parecido a otros para no asustar mientras presenta diferencias en aspectos suficientemente atractivos para que la gente decida pasarse a tu lenguaje.

  • Tu lenguaje puede ser, en principo, capaz de escribir cualquier tipo de aplicaciones. Pero eso no es suficiente. La gente espera también un ecosistema de librerías, paquetes, frameworks,… disponibles. Si no tienes ese ecosistema para todas las posibles aplicaciones de tu lenguaje céntrate en algunas y promueve la creación del ecosistema necesario en esas.
  • Cuidado si quieres añadir hilos y concurrencia a tu lenguaje. Nadie ha descubierto todavía la manera de implementar concurrencia ofreciendo al mismo tiempo unas primitivas de programación usables para usuarios no expertos.
  • El sistema de tipos de Dart es flexible. Los lenguajes con static typing son conservadores y evitan que se compilen programas que se ejecutarían correctamente. Lo mejor es flexibilizar el sistema de tipos para que sea un poco más permisivo o combinar static typing con dynamic typing. El cómo hacerlo (gradual typing, optional typing,…)  es ya una discusión que daría para muchos otros posts.
  • Una gran parte del éxito de un lenguaje es el “language engineering“, es decir las herramientas que vienen con el lenguaje: compilador, VMs, IDEs, debuggers…

Sin olvidar que, como en todo proyecto, al principio vas a equivocarte mucho. Una buena estrategia es aprender de como la gente usa el lenguaje para ir añadiendo palabras clave que faciliten lo que la gente quiere hacer y no le resulta fácil y eliminar aquellas que nadie utiliza para simplificar el lenguaje.

Y si te infunde respeto empezar a crear un lenguaje de programación de cero, siempre puedes empezar con un “DSL interno” es decir, con un lenguaje que se incrusta en un lenguaje ya existente, que actúa de host. Es una manera más rápida de testear algunos de los conceptos del lenguaje sin tener que crear toda la infraestructura para un lenguaje separado.