Introducción
Hola a todos. Bienvenidos a diciembre. Espero que os vaya bien.
Hemos tenido un octubre súper ajetreado. Acabamos de lanzar una gran mejora en las soluciones de la comunidad. Ahora eliminamos los duplicados, de modo que las soluciones parecidas solo aparecen una vez; hemos añadido nuevas opciones de ordenación, la posibilidad de buscar por código y, si echas un vistazo a C#, verás que también hemos añadido 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 te apetezca. Vamos a extenderlo a otros tracks durante la semana de la comunidad.
Pero por ahora, vamos a centrarnos en #12in23. Noviembre fue un mes interesante, explorando lenguajes ensambladores, pero este mes vamos a por un conjunto de lenguajes muy diverso: en concreto, ColdFusion, Groovy, Lua, VimScript y Wren. Como de costumbre, 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, para la que sé que muchos de vosotros estáis trabajando. Para conseguirla, tienes 5 ejercicios destacados que completar. Son los siguientes:
- Todas tus bases: convierte un número, representado como una secuencia de dígitos, a otra base.
- Aplanar un array: toma una colección anidada y devuelve una sola colección sin anidar.
- Ataque de dama: determina si dos damas en un tablero de ajedrez pueden atacarse entre sí.
- Personaje de D&D: genera personajes de Dungeons & Dragons de forma aleatoria.
- Codificación por longitud de serie: implementa la codificación y la decodificación por longitud de serie.
Resúmenes
ColdFusion
- Creado en 1995 por Allaire Corporation, que fue comprada por Macromedia en 2001, la cual a su vez fue comprada 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 distintas, que se ven diferentes pero son semánticamente idénticas:
- La sintaxis de marcado más antigua, basada en etiquetas, que amplía HTML para mostrar contenido dinámico.
- La sintaxis más reciente, similar a ECMAScript, puede usarse allí donde se usa la sintaxis basada en etiquetas, pero también en archivos de script independientes. El objetivo era trasladar 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 lo usa Exercism. En la práctica, nunca se alejó demasiado de sus raíces como servidor web.
- ColdFusion es un producto de pago, pero la Lucee Foundation (una organización sin ánimo de lucro con sede en Suiza) sigue desarrollando activamente su servidor ColdFusion de código abierto, cuyo Lucee Server usamos para el track de Exercism.
- Sigue en desarrollo activo
- Se usa sobre todo en software empresarial; entre sus clientes están Apple, Adobe, General Motors y muchos 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 escribir scripts 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 durante el desarrollo.
- Recibió influencias de Modula, CLU, C++, SNOBOL y AWK. De forma parecida a como LISP y Scheme tenían un único mecanismo omnipresente de estructuras de datos (la lista), Lua lo tiene con su tabla.
- Se interpreta mediante bytecode, normalmente durante la ejecución, aunque también puede hacerse de antemano.
- Se usa sobre todo 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 añadir extensibilidad, por ejemplo en Redis, Neovim y Nginx.
VimScript
- VimScript (también llamado Vim Script, con espacio, o VimL, abreviatura de 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 ampliar 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 ampliar 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
- Escrito en 2016 por Bob Nystrom, autor del libro Crafting Interpreters
- Objetivos: pequeño, simple y rápido.
- Diseñado para incrustarse en otras aplicaciones. El autor consideraba 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 la programación orientada a objetos
- Se usa en:
- TIC-80: un ordenador 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 parte en el propio Wren por Josh Goebel, colaborador de Exercism desde hace mucho tiempo, y que usamos para el track de Wren
Y desde el punto de vista de la programación, ¿en qué se diferencian?
ColdFusion
- De tipado dinámico
- Multiparadigma, principalmente orientado a objetos, pero cada vez más funcional.
Groovy
- Normalmente 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 normalmente interpretado, pero puede precompilarse
- Multiparadigma: procedimental, orientado a objetos (aunque un poco a su manera), funcional y basado en datos
VimScript
- De tipado dinámico e interpretado
- Multiparadigma: imperativo, funcional y una forma sencilla de programación orientada a objetos
Wren
- De tipado dinámico, pero definido de forma estática; esto permite que el compilador sea muy rápido.
- Un lenguaje principalmente orientado a objetos, pero también imperativo y con algo de programación funcional
¿Qué hace que estos lenguajes sean tan buenos?
ColdFusion
- Excelente separación entre la gestión del servidor y la creación de aplicaciones. La consola de administración configura las conexiones a bases de datos y la monitorización del servidor (y cualquier otra cosa); quienes crean las aplicaciones solo necesitan el nombre de un origen de datos (un objeto CF con los métodos necesarios, preconectado a las partes correspondientes del gestor de bases de datos) y permiso de escritura en un directorio para los archivos de la aplicación.
- Aprovecha la potencia de la JVM y del ecosistema de Java, lo que incluye poder importar cualquier biblioteca de Java y usarla dentro de CF
Groovy
- Propósito general: puede usarse para casi cualquier tipo de carga de trabajo, incluidas aplicaciones y sitios web.
- Al ejecutarse en la JVM, se aplican todas sus ventajas: una máquina virtual madura y de alto rendimiento y una enorme cantidad de bibliotecas disponibles. Se integra bien con Java
- Alivia muchos de los problemas que la gente pueda 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 y 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 mucho más
Lua
- Propósito general: se usa en sistemas empotrados, 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 compuestos integrado: la tabla. La memoria se gestiona con un recolector de basura
- Portátil: el intérprete está escrito en ANSI C, para el que 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. Toda la potencia de las herramientas externas sin salir de Vim.
- Expresivo: permite hacer mucho con poco y escribir scripts compactos y muy legibles.
- Potente motor de expresiones regulares: la implementación de expresiones regulares de Vimscript está inspirada en la de Emacs Lisp, lo que proporciona una potente herramienta 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 mucho cariño, escrita en C y no es tan difícil de leer. Una gran forma de aprender a 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 conoces Java o C++, te sentirás como en casa. Permite la sobrecarga de métodos por aridad
- Documentación muy buena: los documentos del lenguaje y de la biblioteca estándar son fáciles de leer, exhaustivos y con muchos ejemplos.
- Una biblioteca estándar pequeña pero sorprendentemente completa.
Características destacadas
ColdFusion
- Con todo incluido: hay muchísimas cosas integradas: trabajar con PDF, ZIP, Excel, XML y JSON, la creación de API, el correo electrónico, la integración con S3, un montón de bases de datos distintas… sin instalar paquetes adicionales. Ideal para reducir las incompatibilidades entre versiones
- Escalable y seguro, ideal para software empresarial
- Una programación simple e intuitiva que permite a los principiantes poner en marcha páginas web complejas basadas en datos muy rápidamente. 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 con un código muy elegante. Construye interfaces 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: está diseñado para ser fácil de incrustar. Tiene una API de C relativamente simple que facilita la incrustación. El tamaño no es un problema: ¡el intérprete de referencia completo ocupa solo 247 kB!
- Ampliable: el lenguaje base se mantiene deliberadamente pequeño, pero lo que sí permite es ampliarlo con facilidad. Esto hace que el lenguaje sea más sencillo de aprender, más ligero de incrustar y muy flexible
- Rápido: Lua suele estar entre los lenguajes dinámicos más rápidos, sobre todo al usar el intérprete LuaJit
VimScript
- Extensibilidad: Vimscript te permite ampliar tu editor con nuevas funcionalidades
- Personalizable: personaliza tu editor para que funcione exactamente 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 determinados eventos o condiciones, como la apertura de un archivo o el guardado de un búfer.
- Aprovecha la potencia de Vim: acceso integrado a las funcionalidades y API de Vim, lo que permite a los scripts manipular texto, búferes, ventanas y mucho 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 videojuegos: quería poder añadir capacidades de scripting a los juegos. La API de C es bastante limpia y sencilla.
- Concurrente: concurrencia y corrutinas sencillas con fibras, que son una construcción muy ligera (como las goroutines o los procesos de Erlang) y que pueden comunicarse fácilmente entre sí
Cuál elegir
- Si quieres crear aplicaciones web, ColdFusion y Groovy son buenas opciones
- Si te interesa un lenguaje que pueda incrustarse, Lua y Wren son las opciones principales, pero Groovy también merece un vistazo
- 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 opciones naturales
- Si valoras el rendimiento, Lua y Wren probablemente sean tus mejores opciones
- Si tu editor principal es Vim o NeoVim, VimScript es obviamente una elección excelente
- Si te interesa aprender sobre compiladores y máquinas virtuales o construirlos, Wren es perfecto para ti
- Si vienes de la programación orientada 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