Introducción
¡Hola a todos! Espero que estén todos bien.
El año va rápido y ya llegamos a Mindshifting May, probablemente el mes que más me entusiasma, sobre todo porque incluye Prolog.
Espero que hayan disfrutado Analytical April. Muchísimos de ustedes participaron y creo que fue uno de los meses más exitosos hasta ahora. También charlé con Simon Peyton Jones durante abril como una entrevista tardía de Functional February. Estuvo muy bien y definitivamente recomiendo verlo de nuevo, aunque solo sea por la hermosa frase: «Cuando la caliza de la programación imperativa se haya desgastado, el granito de la programación funcional quedará al descubierto debajo».
En fin, ¡vamos con Mindshifting May! Como siempre, Erik y yo les daremos un breve resumen de qué tratan los meses y los diferentes lenguajes que exploraremos.
Así que tenemos nada menos que seis lenguajes este mes: Ballerina, Pharo, Prolog, Red, Tcl (Tickle) y Unison. Cada uno de estos lenguajes es bastante diferente de los lenguajes más «mainstream», así que recomendamos que pruebes más de uno para hacerte una idea de en qué se diferencian. Definitivamente recomiendo Prolog porque es uno de los lenguajes en los que más he disfrutado programar en mi vida. Erik también está muy entusiasmado con Unison, así que esa es otra buena opción para probar también.
Las insignias
Para obtener la insignia de Mindshifting May necesitas completar cinco ejercicios cualesquiera en uno de esos lenguajes durante mayo.
También está la insignia 12in23 de todo el año. Para obtenerla, necesitas resolver cinco de nuestros ejercicios destacados en el lenguaje. Si estás viendo 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 diferentes, así que optamos por ejercicios más genéricos que son divertidos de resolver e interesantes para explorar diferentes enfoques.
- Acrónimo: convierte una frase en su acrónimo
- Isograma: verifica si una frase contiene letras repetidas
- Números romanos: traduce un número decimal a números romanos
- Gotas de lluvia: convierte un número en sonidos de gotas de lluvia
- Era espacial: calcula cuántos años tendría alguien en los planetas de nuestro sistema solar
Estos ejercicios y los de meses anteriores se pueden encontrar en la página de #12in23.
Resúmenes
Vamos a profundizar y explorar los lenguajes con un resumen de cada uno.
Prolog:
- Una forma diferente de pensar. Un programa se define como un conjunto de relaciones. Luego «consultas» la base de datos de relaciones para encontrar respuestas usando unificación (coincidencia de patrones). Perfecto para sistemas basados en reglas
- Poca sintaxis, solo un tipo de dato (términos) y un elemento estructural del lenguaje (cláusulas). Las cláusulas se construyen enteramente a partir de términos y pueden definir hechos o reglas.
- Muy declarativo. Preocúpate menos por cómo se computan las cosas y más por qué se debe computar. En muchos casos, esto significa menos código
- Diseñado para funcionar bien al consultar grandes espacios de búsqueda. Diferentes estrategias de búsqueda (primero en profundidad, primero en anchura), admite poda automática
Unison
- ¡No hay conflictos de versiones en el código de Unison! 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 admite la navegación de código en vivo en la interfaz de desarrollo local y en repositorios alojados, así 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 mensajes imita los lenguajes naturales, con un sujeto, un verbo y complementos (between: 1 and: 2 +). La semántica también es simple (por ejemplo, reglas de precedencia muy sencillas). Hace que sea más fácil de aprender y leer
- La productividad es excelente una vez que la gente supera la curva de aprendizaje inicial. Hay múltiples razones para esto, incluida la semántica simple y la poca sintaxis, pero también algunas de las características destacadas de Pharo que se mencionan más adelante
- Se ejecuta en la mayoría de las plataformas (Windows, macOS, Linux + soporte ARM) en una máquina virtual rápida (OpenSmalltalk)
- No es solo una implementación de Smalltalk, sigue desarrollándose activamente (la última versión de Smalltalk es Smalltalk 80, de 1980)
- Comunidad amigable
Tcl (se pronuncia «tickle»)
- Muy poca sintaxis, solo 12 reglas y cabe en una hoja de papel. La semántica también es relativamente sencilla. Hace que los programas sean fáciles de leer y aprender
- Concurrencia simple mediante corrutinas, lo que permite escribir código asíncrono como código síncrono
- Bucle de eventos integrado para programación de redes y E/S de archivos asíncrona
- Maduro, pero aún en evolución
Ballerina
- Soporte 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 tipado estructural (duck typing) predominante. Los tipos cerrados son una forma de hacer subtipado, mientras que los tipos abiertos manejan con elegancia el exceso de datos enviados. Enlace de datos y validación integrados cuando se usan en recursos HTTP
- Soporte integrado para patrones de integración y conectores comunes, incluidas 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 completos sobre el comportamiento y el rendimiento del código.
- Excelente concurrencia mediante strands, que son hilos ligeros. Las llamadas de E/S no bloqueantes son fáciles. El compilador puede ayudar a verificar las llamadas de envío y recepción entre workers, evitando bloqueos mutuos. La inmutabilidad también es excelente para redes
- Manejo explícito de errores mediante tipos unión y el azúcar sintáctico
checkpara ayudar con esto
Red
- Ligero. Toda la cadena de herramientas es una descarga de aproximadamente 1.5 MB, un solo ejecutable.
- Portable. Fácil compilación cruzada. Produce binarios pequeños sin dependencias. Bajo consumo de memoria.
- Red es su propio metalenguaje y su propio formato de datos (como los LISP). Los programas pueden transformar/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 generales
- Trabajos de computación por lotes
Pharo
- Se usa para herramientas interactivas
- Se usa en dominios muy diferentes: plataforma de trading en línea y herramienta basada 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 planificación de eventos
- Herramienta de entorno de desarrollo moldeable para exploración de 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 incluyen Pixar, Boeing, Intel, NBC y muchas más.
- Tk, el kit de herramientas de ventanas, ha sido adoptado por otros lenguajes de «scripting» como perl/python/ruby.
- Expect, una herramienta para automatizar aplicaciones interactivas de CLI
Ballerina
- Se usa para aplicaciones nativas de la nube
- La usa MOSIP, una plataforma de identidad fundacional que ayuda a gobiernos y otras organizaciones a implementar sistemas de identidad digital y fundacional de manera rentable.
¿Qué hace que estos lenguajes sean interesantes desde una perspectiva de programación?
Prolog:
- Lenguaje de programación lógica (uno de los primeros), que es un paradigma propio (como la programación orientada a objetos y la funcional)
- Tipado dinámico
Unison
- Lenguaje puramente funcional
- Tipado estático
Pharo
- Lenguaje orientado a objetos, pero en el sentido de Smalltalk. Diferente de los lenguajes orientados a objetos «regulares»: sin constructores, sin declaración de tipos, sin interfaces, 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, reactivo
- Tipado estático
¿Cuáles son sus características destacadas?
Prolog:
- Flexible. Muchos predicados integrados funcionan en varias direcciones. Permite consultar y crear datos con la misma sintaxis. Algunos problemas que son difíciles en otros lenguajes aquí son triviales
- DCG es como un combinador de analizadores integrado que es excelente para analizar, generar, completar y verificar 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 almacena en una base de datos y se accede a él y se actualiza mediante el Unison Codebase Manager. Los archivos de texto son solo una forma de meter código en la base de datos. Los datos inmutables también significan que los resultados de las pruebas se pueden almacenar en caché y que la verificación de tipos solo tiene que hacerse una vez
- Las definiciones se referencian por hash, no por nombre. A esto se le llama código «direccionado por contenido». El árbol de sintaxis de una definición determina su hash. Sin conflictos de versiones, los cambios de nombre son triviales.
- 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 en ella y asegurarte de que tu código de ejemplo compile.
- Ideal para 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 mediante mensajes. Aunque el modelo es simple, es muy potente. Bastante diferente de otros lenguajes orientados a objetos.
- Tu código reside en una imagen de Pharo, no en archivos 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 archivo de imagen. Este archivo contiene todos los objetos, sus relaciones y el contexto de ejecución. Los archivos de imagen se pueden compartir con otros y cargar en diferentes 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 mediante un IDE específico de Pharo. Ejecuta y cambia tu programa sobre la marcha, ¡incluso mientras se está ejecutando! Un depurador potente que admite reiniciar métodos y corregir bugs sobre la marcha
Tcl
- Sistema de tipos sencillo: todo es un string. «Todo es un string» era cómo solía implementarse Tcl. Ahora, bajo el capó, hay un sistema de tipos robusto, donde la entidad de Tcl (ya sea un string, un número de punto flotante, una lista o un diccionario) tiene una representación específica de su tipo, así como una representación como string. Esto mejora enormemente el rendimiento del código Tcl, ya que ya no necesita convertir de ida y vuelta desde strings.
- «Todo se ejecuta como comandos». No hay comandos integrados. Tcl viene con una «biblioteca estándar» de comandos, incluidos if y while, etc. Es muy sencillo agregar nuevos comandos de flujo de control: por ejemplo, un bucle until. También es fácil sobrescribir un comando de Tcl.
- Debido a que es compacto, tiene semántica simple y está implementado como una biblioteca en C, es fácil de incrustar
Ballerina
- Nativo de la nube. Conversiones integradas de JSON a tipos definidos por el usuario. Sintaxis súper ligera para crear servicios (micro). Ejecución concurrente de servicios integrada. Soporte para HTTP (1 y 2), graphql y gRPC de fábrica
- Genera automáticamente artefactos para desplegar tu código en diferentes nubes. Estos artefactos pueden ser Dockerfiles, imágenes de Docker, archivos YAML de Kubernetes o funciones serverless.
- Visualización integrada del código como diagramas de secuencia. Excelente para visualizar el flujo del código. Incluso puede visualizar llamadas HTTP
Red
- Excelente para construir/analizar lenguajes específicos de dominio/«dialectos» (terminología de Rebol). 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 simple para crear diseños de GUI
- Draw: un dialecto de dibujo vectorial 2D
- Rich-text: un dialecto de descripción de texto enriquecido
- GUI fáciles. Completamente multiplataforma y nativas. Admite enlace bidireccional, actualización en vivo, eventos y brinda acceso a las funciones del sistema operativo
¿Cuál o cuáles debería probar la gente durante mayo?
Todos son lenguajes interesantes por derecho propio, así que podrías argumentar a favor de cualquiera de ellos.
- Si te interesa la computación en la nube, Ballerina y Unison son excelentes opciones. Tcl también tiene excelentes características de concurrencia
- Si conoces la programación orientada a objetos pero quieres ver un enfoque diferente, prueba Pharo
- Si quieres experimentar cómo es programar en un lenguaje que no se basa en archivos de texto, prueba Pharo y su IDE único y potente, o Unison con el Unison Codebase Manager.
- Si te gusta el minimalismo, Tcl, Prolog, Pharo y Red tienen poca sintaxis y una semántica relativamente simple
- Si quieres ver una mezcla interesante de paradigmas, Ballerina, Tcl y Red admiten diferentes paradigmas
- Si te gustaría probar paradigmas más inusuales, prueba Prolog para programación lógica, Red para programación reactiva y Ballerina para 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 probar un par. ¡Todos son bastante únicos! Resuelve el mismo ejercicio en un par de los lenguajes destacados y mira qué diferente es la implementación.