Introducción
¡Hola a todos! Espero que estéis todos bien.
El año pasa volando y ya estamos en Mindshifting May, probablemente el mes que más me entusiasma, sobre todo porque incluye Prolog.
Espero que hayáis disfrutado de Analytical April. Participasteis un montón y creo que ha sido uno de los meses más exitosos hasta ahora. Durante abril también charlé con Simon Peyton Jones, como entrevista tardía de Functional February. Estuvo genial y te recomiendo sin duda que la veas, aunque solo sea por la magnífica frase: «Cuando la caliza de la programación imperativa se haya desgastado, quedará al descubierto el granito de la programación funcional».
En fin, ¡vamos con Mindshifting May! Como siempre, Erik y yo os daréis un breve resumen de en qué consisten los meses y de los distintos lenguajes que vamos a explorar.
Este mes tenemos nada menos que seis lenguajes: Ballerina, Pharo, Prolog, Red, Tcl (Tickle) y Unison. Todos ellos son bastante distintos de los lenguajes más «convencionales», así que te recomendamos que pruebes más de uno para hacerte una idea de en qué se diferencian. Te recomiendo sin duda Prolog, porque es uno de los lenguajes con los que más he disfrutado programando en mi vida. Erik también está muy entusiasmado con Unison, así que es otra buena opción para probar.
Las insignias
Para conseguir la insignia de Mindshifting May tienes que completar cinco ejercicios cualesquiera en uno de esos lenguajes durante mayo.
También está la insignia 12in23, que se extiende a lo largo de todo el año. Para conseguirla tienes que resolver cinco de nuestros ejercicios destacados en el lenguaje. Si ves esto después de mayo, puedes hacer esta parte en cualquier momento del año, así que no te has perdido nada. Elegir estos ejercicios fue difícil, porque los lenguajes son todos muy distintos, así que nos decantamos por ejercicios más genéricos, divertidos de resolver e interesantes para explorar distintos enfoques.
- Acrónimo: convertir una frase en su acrónimo
- Isograma: comprobar si una frase contiene letras repetidas
- Números romanos: convertir un número decimal en números romanos
- Gotas de lluvia: convertir un número en sonidos de gotas de lluvia
- Era espacial: calcular qué edad tendría alguien en los planetas de nuestro sistema solar
Estos ejercicios y los de meses anteriores los puedes encontrar en la página de #12in23.
Resúmenes
Vamos a profundizar y a explorar los lenguajes con un resumen de cada uno.
Prolog:
- Una forma distinta de pensar. Un programa se define como un conjunto de relaciones. Después «consultas» la base de datos de relaciones para encontrar respuestas mediante la unificación (coincidencia de patrones). Perfecto para sistemas basados en reglas
- Poca sintaxis: solo un tipo de datos (los términos) y un elemento estructural del lenguaje (las cláusulas). Las cláusulas se construyen enteramente a partir de términos y pueden definir hechos o reglas.
- Muy declarativo. Te preocupas menos por cómo se calculan las cosas y más por qué debería calcularse. En muchos casos, esto significa menos código
- Diseñado para funcionar bien al consultar grandes espacios de búsqueda. Distintas estrategias de búsqueda (en profundidad, en anchura) y compatibilidad con la poda automática
Unison
- ¡En el código de Unison no hay conflictos de versiones! Una función de Unison conoce los hashes de sus dependencias, así que puede encontrar la versión correcta del código que necesita.
- Unison permite explorar el código en vivo en la interfaz de desarrollo local y en los repositorios alojados, de modo que siempre puedes hacer clic para ver el código fuente de las bibliotecas de las que dependes.
- Las abilities son una forma de gestionar los «efectos» (por ejemplo, IO) de manera puramente funcional
Pharo
- Muy poca sintaxis: toda la sintaxis cabe en una postal (¡solo 6 palabras reservadas!). La sintaxis de los mensajes imita a los lenguajes naturales, con un sujeto, un verbo y complementos (between: 1 and: 2 +). La semántica también es sencilla (por ejemplo, reglas de precedencia simplísimas). Eso hace que sea más fácil de aprender y de leer
- La productividad es enorme una vez que se supera la curva de aprendizaje inicial. Hay varias razones: la semántica sencilla y la poca sintaxis, pero también algunas de las características más destacadas de Pharo que mencionamos más adelante
- Se ejecuta en la mayoría de las plataformas (Windows, macOS, Linux + soporte ARM) sobre una máquina virtual rápida (OpenSmalltalk)
- No es solo una implementación de Smalltalk: sigue en desarrollo activo (la última versión de SmallTalk es SmallTalk 80, de 1980)
- Una comunidad amable
Tcl (se pronuncia «tickle»)
- Muy poca sintaxis: solo 12 reglas, y caben en una hoja de papel. La semántica también es relativamente sencilla. Hace que los programas sean fáciles de leer y de aprender
- Concurrencia sencilla mediante corrutinas, lo que permite escribir código asíncrono como si fuera síncrono
- Bucle de eventos integrado para la programación de red y la E/S de ficheros asíncrona
- Maduro, pero aún en evolución
Ballerina
- Compatibilidad de primera clase para el procesamiento declarativo y con seguridad de tipos de JSON, XML y datos tabulares, con consultas integradas en el lenguaje
- Tipos flexibles, con predominio del tipado estructural (duck typing). Los tipos cerrados permiten hacer subtipado, mientras que los tipos abiertos gestionan con elegancia el envío de demasiados datos. Incluye enlace de datos y validación cuando se usa en recursos HTTP
- Compatibilidad integrada con patrones de integración y conectores habituales, como transacciones distribuidas, compensación y cortacircuitos
- Todos los programas de Ballerina son automáticamente observables por cualquier herramienta de Open Telemetry, lo que te da control y visibilidad totales sobre el comportamiento y el rendimiento del código.
- Gran concurrencia mediante strands, que son hilos ligeros. Las llamadas de E/S no bloqueantes son fáciles. El compilador puede ayudar a comprobar las llamadas de envío y recepción entre workers, evitando interbloqueos. La inmutabilidad también es estupenda para las redes
- Gestión explícita de errores mediante tipos unión y el azúcar sintáctico de
checkpara ayudarte con ello
Red
- Ligero. Toda la cadena de herramientas ocupa alrededor de 1,5 MB de descarga, en un único ejecutable.
- Portátil. Compilación cruzada sencilla. Genera binarios pequeños y sin dependencias. Bajo consumo de memoria.
- Red es su propio metalenguaje y su propio formato de datos (como los LISP). Los programas pueden transformar y leer código.
- Reactivo: los objetos se pueden enlazar para reducir el tamaño y la complejidad del programa (piensa en hojas de Excel)
¿Dónde se usan estos lenguajes?
Prolog:
- Inteligencia artificial (Watson, de IBM)
- Procesamiento de (lenguaje) natural
- Base de datos distribuida para bases de conocimiento (TerminusDB)
- Incluso se usa para especificar las reglas de tipos de la máquina virtual de Java
Unison
- Se usa para escribir sistemas distribuidos
- Servicios web en general
- Trabajos de computación por lotes
Pharo
- Se usa para herramientas interactivas
- Se usa en ámbitos muy diversos: una plataforma de trading en línea y una herramienta en la nube para la gestión de inversiones
- Prototipado de interfaces de usuario e interacción en la industria de defensa
- Aplicación web para la planificación de eventos
- Herramienta de entorno de desarrollo moldeable para explorar API, datos y sistemas
Tcl
- Se usa como código de pegamento o embebido
- Se usa en las interfaces gráficas de los routers de CISCO
- Diversos sistemas de fabricación
- La NASA lo ha usado en muchas ocasiones
- Otras grandes empresas son Pixar, Boeing, Intel, NBC y muchas más.
- Tk, el conjunto de herramientas de ventanas, lo han adoptado otros lenguajes de «scripting» como perl, python o ruby.
- Expect, una herramienta para automatizar aplicaciones CLI interactivas
Ballerina
- Se usa para aplicaciones nativas de la nube
- Lo usa MOSIP, una plataforma de identidad fundacional que ayuda a gobiernos y otras organizaciones a implantar sistemas de identidad digital y fundacional de forma rentable.
¿Qué hace que estos lenguajes sean interesantes desde el punto de vista de la programación?
Prolog:
- Lenguaje de programación lógica (uno de los primeros), que constituye un paradigma propio (como la programación orientada a objetos y la programación funcional)
- Tipado dinámico
Unison
- Lenguaje puramente funcional
- Tipado estático
Pharo
- Lenguaje orientado a objetos, pero en el sentido de SmallTalk. Distinto de los lenguajes orientados a objetos «convencionales»: sin constructores, sin declaración de tipos, sin interfaces y sin tipos primitivos.
- Tipado dinámico
Tcl
- Multiparadigma: admite estilos orientados a objetos, imperativos y funcionales
- Tipado dinámico
Ballerina
- Multiparadigma: orientado a objetos, funcional y declarativo
- Tipado estático
Red
- Multiparadigma: imperativo, funcional, orientado a objetos, simbólico y reactivo
- Tipado estático
¿Cuáles son sus características más destacadas?
Prolog:
- Flexible. Muchos predicados integrados funcionan en varias direcciones. Permiten consultar y crear datos con la misma sintaxis. Algunos problemas que en otros lenguajes son difíciles, aquí son triviales
- DCG es como un combinador de analizadores integrado, ideal para analizar, generar, completar y comprobar secuencias
- CLP es una forma eficiente de definir un programa en términos de restricciones
Unison
- El código no es texto, sino datos (inmutables). El código se guarda en una base de datos, y se accede a él y se actualiza mediante el Unison Codebase Manager. Los ficheros de texto son solo una forma de meter código en la base de datos. Los datos inmutables también implican que los resultados de las pruebas se pueden almacenar en caché y que la comprobación de tipos solo hay que hacerla una vez
- Las definiciones se referencian por hash, no por nombre. A esto se le llama código «direccionado por contenido». El árbol sintáctico de una definición determina su hash. Sin conflictos de versiones, y cambiar el nombre es trivial.
- La documentación de Unison es una entidad de primera clase en el lenguaje y siempre está sincronizada con las funciones que describe. Puedes incrustar ejemplos en vivo y asegurarte de que el código de tus ejemplos compila.
- Ideal para la computación en la nube: no hay compilaciones, las funciones se pueden distribuir sobre la marcha y se dedica menos tiempo a escribir codificadores y decodificadores para la comunicación entre servicios de Unison.
Pharo
- Modelo de ejecución sencillo: todo es un objeto y la ejecución ocurre exclusivamente mediante mensajes (que también son objetos). Incluso el flujo de control se hace con mensajes. Aunque el modelo es simple, es muy potente. Bastante distinto de otros lenguajes orientados a objetos.
- Tu código reside en una imagen de Pharo, no en ficheros de texto. Una imagen de Pharo contiene todo el estado de tu aplicación y se puede ejecutar en una máquina virtual de Pharo. Cuando guardas tu trabajo, Pharo guarda todo el estado del entorno como un fichero de imagen. Este fichero contiene todos los objetos, sus relaciones y el contexto de ejecución. Los ficheros de imagen se pueden compartir con otras personas y cargar en distintas máquinas o plataformas. Esto permite a los desarrolladores colaborar fácilmente en un proyecto o distribuir aplicaciones creadas en Pharo
- Vivo e inmersivo, con retroalimentación inmediata durante la ejecución gracias al IDE específico de Pharo. Ejecuta y cambia tu programa sobre la marcha, ¡incluso mientras se está ejecutando! Un depurador potente que permite reiniciar métodos y corregir bugs sobre la marcha
Tcl
- Sistema de tipos sencillo: todo es un string. «Todo es un string» era como se implementaba Tcl antiguamente. Ahora, por debajo, hay un sistema de tipos robusto, en el que la entidad de Tcl (ya sea un string, un número decimal, una lista o un diccionario) tiene una representación específica de su tipo, además de una representación como string. Esto mejora mucho el rendimiento del código de Tcl, ya que ya no necesita convertir de ida y vuelta desde los strings.
- «Todo se ejecuta como comandos». No hay comandos integrados. Tcl incluye una «biblioteca estándar» de comandos, entre ellos if y while, etc. Es muy sencillo añadir nuevos comandos de flujo de control: por ejemplo, un bucle until. También es fácil sobrescribir un comando de Tcl.
- Al ser compacto, tener una semántica sencilla y estar implementado como biblioteca de C, es fácil de incrustar
Ballerina
- Nativo de la nube. Conversiones integradas de JSON a tipos definidos por el usuario. Sintaxis ligerísima para crear servicios (micro). Ejecución concurrente de servicios integrada. Compatibilidad con HTTP (1 y 2), graphql y gRPC desde el primer momento
- Genera automáticamente artefactos para desplegar tu código en distintas nubes. Estos artefactos pueden ser Dockerfiles, imágenes de Docker, ficheros YAML de Kubernetes o funciones serverless.
- Visualización integrada del código como diagramas de secuencia. Estupendo para visualizar el flujo del código. Incluso puede visualizar llamadas HTTP
Red
- Ideal para crear y analizar lenguajes específicos de dominio o «dialectos» (terminología de Rebol). Incluye varios dialectos integrados:
- Red/System: un lenguaje de programación de sistemas de nivel C compilado a código nativo
- Parse: un potente analizador PEG
- VID: un dialecto sencillo para crear interfaces gráficas
- Draw: un dialecto de dibujo vectorial 2D
- Rich-text: un dialecto de descripción de texto enriquecido
- Interfaces gráficas fáciles. Totalmente multiplataforma y nativas. Admite enlace bidireccional, actualización en vivo y eventos, y da acceso a las características del sistema operativo
¿Cuál o cuáles deberías probar durante mayo?
Todos son lenguajes interesantes por derecho propio, así que se podría defender cualquiera de ellos.
- Si te interesa la computación en la nube, Ballerina y Unison son grandes opciones. Tcl también tiene muy buenas características de concurrencia
- Si conoces la programación orientada a objetos pero quieres ver un enfoque distinto, prueba Pharo
- Si quieres experimentar cómo es programar en un lenguaje que no se basa en ficheros de texto, prueba Pharo con su IDE único y potente, o Unison con el Unison Codebase Manager.
- Si te gusta el minimalismo, Tcl, Prolog, Pharo y Red tienen todos bastante poca sintaxis y una semántica relativamente sencilla
- Si quieres ver una mezcla interesante de paradigmas, Ballerina, Tcl y Red admiten paradigmas distintos
- Si te apetece probar paradigmas más inusuales, prueba Prolog para la programación lógica, Red para la programación reactiva y Ballerina para la programación declarativa
- Si te gusta la programación funcional, échale un vistazo a Unison y, en particular, a sus Abilities.
- Si te interesa la metaprogramación, Tcl, Prolog, Pharo y Red tienen un gran soporte
Por supuesto, si tienes tiempo, te recomiendo que pruebes un par de ellos. Todos son bastante únicos. Resuelve el mismo ejercicio en un par de los lenguajes destacados y fíjate en lo distinta que es la implementación.