Introducción
Hola a todos. Bienvenidos a diciembre. Espero que estén muy bien.
Tuvimos un octubre súper ajetreado. Acabamos de lanzar una gran mejora a las soluciones de la comunidad. Ahora eliminamos los duplicados, de modo que las soluciones similares solo aparecen una vez, agregamos nuevas opciones de ordenamiento, la posibilidad de buscar por código y, si revisas C#, verás que también agregamos la posibilidad de filtrar por distintos conceptos de programación. Así puedes buscar soluciones que usen desplazamiento de bits, recursión o cualquier otra cosa que se te antoje. Vamos a implementar todo eso en otros tracks durante la semana de la comunidad.
Pero por ahora, concentrémonos en #12in23. Noviembre fue un mes interesante, explorando lenguajes ensambladores, pero este mes vamos por un conjunto muy diverso de lenguajes: ColdFusion, Groovy, Lua, VimScript y Wren. Como siempre, Erik nos va a contar qué hace que estos lenguajes sean interesantes y únicos.
Las insignias
Como siempre, puedes ganar la insignia Diversiones de diciembre completando 5 ejercicios cualesquiera en estos lenguajes. También tenemos la insignia de todo el año, y sé que muchos de ustedes están trabajando para conseguirla. Para eso tenemos 5 ejercicios destacados para que completes. Son estos:
- All Your Base: convierte un número, representado como una secuencia de dígitos, a otra base.
- Flatten Array: toma una colección anidada y devuelve una única colección sin anidar.
- Queen Attack: determina si dos reinas en un tablero de ajedrez pueden atacarse entre sí.
- D&D Character: genera personajes de Dungeons & Dragons de forma aleatoria.
- Run-Length Encoding: implementa la codificación y decodificación por longitud de racha.
Descripciones generales
ColdFusion
- Creado en 1995 por Allaire Corporation, que fue comprada por Macromedia en 2001 y luego, a su vez, por Adobe en 2005.
- Diseñado como una plataforma de desarrollo web rápido
- Se ejecuta en la máquina virtual de Java (JVM)
- Hay dos sintaxis separadas, que se ven diferentes pero son semánticamente idénticas:
- La sintaxis más antigua, basada en etiquetas, que extiende HTML para mostrar contenido dinámico.
- La sintaxis más nueva, similar a ECMAScript, se puede usar donde se usa la sintaxis basada en etiquetas, pero también en archivos de script separados. El objetivo era mover la lógica de negocio del marcado a un archivo de script aparte
- CFScript es un lenguaje de propósito general que se ejecuta en la JVM, y así es como Exercism lo usa. En la práctica, nunca se alejó realmente de sus raíces de servidor web.
- ColdFusion es un producto pago, pero la Fundación Lucee (una organización sin fines de lucro con sede en Suiza) sigue desarrollando activamente su servidor ColdFusion de código abierto, y usamos su Lucee Server para el track de Exercism.
- Sigue en desarrollo activo
- Se usa principalmente en software empresarial; entre sus clientes están Apple, Adobe, General Motors y más
Groovy
- Desarrollado por James Strachan a partir de 2003. El proyecto fue adoptado por Apache en 2015.
- El objetivo era desarrollar un lenguaje de tipado dinámico sobre la JVM (en contraste con Java, que es de tipado estático) que además redujera el código repetitivo
- Aunque la mayor parte del código Java también es código Groovy válido, hay muchas diferencias (por ejemplo, Groovy permite tipado dinámico y metaprogramación avanzada). El lenguaje también recibió una gran influencia de Python y Ruby.
- Se usa para scripting, herramientas de compilación (Gradle), integración continua (Jenkins), aplicaciones web (Grails) y pruebas (Spock). Un popular complemento de terceros para las herramientas de Atlassian permite hacer scripting en Groovy.
Lua
- Lua fue creado en 1993 por Roberto Lerusalimschy, Luiz Henrique de Figueiredo y Waldemar Celes en la Pontificia Universidad Católica de Río de Janeiro, en Brasil.
- El nombre se pronuncia LOO-ah, que significa «luna» en portugués, y es una referencia al lenguaje Sol, en el que se inspiró en parte, que significa «sol» en portugués
- Diseñado principalmente para incrustarse, con un enfoque en la velocidad, la portabilidad, la extensibilidad y la facilidad de uso en el desarrollo.
- Influenciado por Modula, CLU, C++, SNOBOL y AWK. De forma similar a como LISP y Scheme tenían un único mecanismo de estructura de datos omnipresente (la lista), Lua lo tiene con su tabla.
- Se interpreta mediante bytecode, por lo general mientras se ejecuta, aunque también se puede hacer de antemano.
- Se usa principalmente para scripting, por ejemplo en juegos como World of Warcraft, Dota 2 y Crysis, o en aplicaciones como Adobe Lightroom y parte del software de sistema de FreeBSD. También se usa mucho para agregar extensibilidad, por ejemplo en Redis, Neovim y Nginx.
VimScript
- VimScript (también llamado Vim Script, con un espacio, o VimL, por Vim Language) es el lenguaje de scripting que se usa en el editor de texto Vim.
- Deriva de ex, el editor visual orientado a líneas que precedió a Vi
- No es un lenguaje de propósito general, sino uno especializado que ofrece un entorno de scripting eficaz y optimizado para extender y personalizar la funcionalidad de Vim mediante plugins, configuraciones, macros y funciones.
- Aunque Vim está escrito principalmente en C, Vimscript permite a los usuarios personalizar y extender Vim mediante un lenguaje de scripting de alto nivel.
- Se usa en... bueno, en Vim, pero también en NeoVim, un fork de Vim
Wren
- Creado en 2016 por Bob Nystrom, el autor del libro Crafting Interpreters
- Objetivos: pequeño, simple, rápido.
- Diseñado para incrustarse en otras aplicaciones. El autor consideró que las opciones existentes (como Lua y TCL) eran insuficientes, y quería un lenguaje simple e incrustable que resultara natural para quienes vienen de un trasfondo de orientación a objetos
- Se usa en:
- TIC-80: una computadora de fantasía para crear, jugar y compartir juegos diminutos (similar a PICO8)
- DOME: un framework multiplataforma para crear juegos.
- luxe: un motor de juegos multiplataforma y de desarrollo rápido para crear juegos.
- Wren Console: un REPL y una CLI de Wren escritos en gran medida en el propio Wren por Josh Goebel, colaborador de Exercism desde hace mucho tiempo, y que usamos para el track de Wren
Y desde la perspectiva de la programación, ¿en qué se diferencian?
ColdFusion
- De tipado dinámico
- Multiparadigma, principalmente POO, pero cada vez más funcional.
Groovy
- Por lo general es de tipado dinámico, pero también puede ser de tipado estático (y de tipado gradual)
- Puede ser tanto interpretado como compilado (desde la versión 2). Por eso se usa a menudo en scripts
- Multiparadigma: principalmente orientado a objetos, pero también imperativo, funcional y declarativo
Lua
- De tipado dinámico y por lo general interpretado, pero se puede precompilar
- Multiparadigma: procedimental, orientado a objetos (aunque un poco distinto), funcional y basado en datos
VimScript
- De tipado dinámico e interpretado
- Multiparadigma: imperativo, funcional y una forma simple de programación orientada a objetos
Wren
- De tipado dinámico, pero definido de forma estática; permite que el compilador sea muy rápido.
- Principalmente un lenguaje orientado a objetos, pero también imperativo y con algo de programación funcional
¿Qué hace que estos lenguajes sean geniales?
ColdFusion
- Excelente separación entre la gestión del servidor y la creación de la aplicación. La consola de administración configura las conexiones a bases de datos y el monitoreo del servidor (y cualquier otra cosa); quienes crean la aplicación solo necesitan el nombre de una fuente de datos (un objeto CF con los métodos necesarios, ya conectado a las partes adecuadas del sistema gestor de bases de datos), además de acceso de escritura a un directorio para los archivos de la aplicación.
- Aprovecha el poder de la JVM y del ecosistema de Java, lo que incluye poder importar cualquier biblioteca de Java y usarla dentro de CF
Groovy
- De propósito general: se puede usar para casi cualquier tipo de carga de trabajo, incluidas aplicaciones y sitios web.
- Al ejecutarse en la JVM, se aplican todos sus beneficios: una máquina virtual madura y muy eficiente, y una enorme cantidad de bibliotecas disponibles. Interopera bien con Java
- Alivia muchos de los problemas que la gente puede tener con Java, como las excepciones comprobadas,
- la seguridad frente a null, la verbosidad y la falta de metaprogramación avanzada
- Lenguaje moderno: inferencia de tipos avanzada, closures, sintaxis integrada para expresiones regulares, generación automática de getters y setters
- Gran soporte de programación funcional: closures (como los bloques de Ruby), currificación (aplicación parcial), evaluación perezosa, inmutabilidad y más
Lua
- De propósito general: se usa en sistemas embebidos, para prototipado, scripting y desarrollo de juegos, web y backend.
- Simple: relativamente poca sintaxis, lo que hace que el lenguaje sea fácil de aprender. Solo un par de tipos de datos atómicos y un único tipo de datos compuesto integrado: la tabla. La memoria se gestiona mediante recolección de basura
- Portátil: el intérprete está escrito en ANSI C, para el cual existe un compilador en casi cualquier plataforma
VimScript
- Simple: una sintaxis ligera y fácil de aprender y usar.
- Interoperabilidad: accede fácilmente a archivos, shells y otros programas. Todo el poder de las herramientas externas sin salir de Vim.
- Expresivo: haz mucho con poco. Escribe scripts compactos y muy legibles.
- Potente motor de expresiones regulares: la implementación de expresiones regulares de Vimscript se inspira en la de Emacs Lisp, y ofrece una herramienta poderosa para manipular texto.
Wren
- Pequeño: la máquina virtual está implementada en menos de 4000 líneas de código
- Ejemplar: la implementación de la máquina virtual está comentada con cariño, escrita en C y no es tan difícil de leer. Una gran forma de aprender cómo construir un lenguaje. La mayor parte de la biblioteca estándar está implementada en Wren, así que también puedes ver cómo está hecha.
- Familiar: su sintaxis hace que sea más rápido ponerse al día. Si estás familiarizado con Java o C++, te sentirás como en casa. Permite la sobrecarga de métodos por aridad
- Documentación realmente buena: la documentación del lenguaje y de la biblioteca estándar es fácil de leer, extensa y con muchos ejemplos.
- Una biblioteca estándar pequeña pero sorprendentemente completa.
Características destacadas
ColdFusion
- Todo incluido: muchísimas cosas vienen integradas: trabajar con PDF, ZIP, Excel, XML, JSON, creación de API, correo electrónico, integración con S3, muchas bases de datos distintas… sin instalar paquetes adicionales. Excelente para reducir las incompatibilidades entre versiones
- Escalable y seguro, ideal para software empresarial
- Una programación simple e intuitiva que hace que los novatos puedan poner en marcha páginas web complejas basadas en datos muy rápido. La integración con DreamWeaver es excelente.
Groovy
- Sintaxis flexible: se pueden omitir los puntos y los paréntesis, lo que permite crear lenguajes específicos de dominio muy elegantes
- Metaprogramación: admite metaprogramación tanto en tiempo de ejecución como en tiempo de compilación. Por ejemplo, una anotación @ToString genera una implementación de ToString en tiempo de compilación, y cambiar la metaclase de un objeto en tiempo de ejecución permite hacer monkey-patching.
- Builders: maneja y construye JSON, XML y HTML rápidamente mediante un código que se ve muy bien. Construye con Swing para un desarrollo rápido de interfaces gráficas (GUI).
- Traits: los traits de Groovy te permiten componer comportamientos y propiedades en bloques reutilizables. Similares a los mixins de Ruby.
Lua
- Incrustable: diseñado para ser fácil de incrustar. Tiene una API de C relativamente simple que facilita la integración. El tamaño no es un problema: ¡el intérprete de referencia completo ocupa solo 247 kB!
- Extensible: el lenguaje base se mantiene deliberadamente relativamente pequeño, pero lo que sí permite es extender el lenguaje con facilidad. Eso hace que sea más simple de aprender, más ligero de incrustar y muy flexible
- Rápido: Lua suele ser uno de los lenguajes dinámicos más rápidos, sobre todo al usar el intérprete LuaJit
VimScript
- Extensibilidad: Vimscript te permite extender tu editor con nueva funcionalidad
- Personalizable: personaliza tu editor para que funcione justo como a ti te gusta (los propios plugins de Vimscript están escritos principalmente en Vimscript)
- Basado en eventos: ejecución automática de código según ciertos eventos o condiciones, como abrir un archivo o guardar un búfer.
- Aprovecha el poder de Vim: acceso integrado a las funcionalidades y APIs de Vim, lo que permite que los scripts manipulen texto, búferes, ventanas y más.
Wren
- Rápido: un gran rendimiento para un lenguaje dinámico
- Incrustable: fácil de incrustar en otro software. El creador del lenguaje fue desarrollador de juegos: quería poder agregar capacidades de scripting a los juegos. La API de C es bastante limpia y simple.
- Concurrente: concurrencia y corrutinas sencillas con fibers, que son una construcción muy ligera (como las goroutines o los procesos de Erlang) y pueden comunicarse entre sí fácilmente
Cuál elegir
- Si quieres crear aplicaciones web, ColdFusion y Groovy son buenas opciones
- Si te interesa un lenguaje que se pueda incrustar, Lua y Wren son las opciones principales, pero Groovy también podría valer la pena
- Esos mismos tres lenguajes, Lua, Wren y Groovy, también tienen sentido si quieres escribir scripts de propósito general
- Si trabajas con la JVM, ColdFusion y Groovy son elecciones naturales
- Si valoras el rendimiento, Lua y Wren son probablemente tus mejores opciones
- Si tu editor principal es Vim o NeoVim, VimScript es obviamente una excelente elección
- Si te interesa aprender sobre compiladores y máquinas virtuales, o construir uno, Wren es perfecto para ti
- Si vienes de un trasfondo de orientación a objetos, Wren es probablemente el lenguaje más fácil de aprender
- Si te gustó el diseño de LISP con una única estructura de datos omnipresente, prueba Lua
- Si quieres probar la programación basada en eventos, échale un vistazo a VimScript