Uploaded avatar of ErikSchierboom

¡Es septiembre esbelto!

@ErikSchierboom
hace Alrededor de 3 años
Vídeo

Introducción

¡Hola a todos! Espero que estéis todos bien.

Hemos tenido un agosto intenso en Exercism. Hemos fusionado Premium e Insiders, hemos añadido comentarios automáticos directamente en el editor, hemos lanzado los trofeos de track y también hemos hecho un montón de pequeñas mejoras en el sitio. Si aún no has revisado tus tracks para ver qué trofeos consigues, hazlo sin falta. Hemos enviado un correo a todo el mundo que tiene uno o más trofeos, así que estate atento a eso también. Durante agosto también nos divertimos un montón en #12in23, explorando lenguajes que la gente suele usar para crear apps.

Este mes es Slimline September, en el que exploramos lenguajes que tienden a ser muy concisos y escuetos en su sintaxis. En concreto, vamos a ver 8th (un descendiente de Forth), AWK, Bash, jq, Perl y Raku (que antes se conocía como Perl 6).

Las insignias

Para conseguir la insignia de Slimline September tienes que completar cinco ejercicios cualesquiera en uno de esos lenguajes durante septiembre.

También está la insignia 12in23, que dura todo el año. Para conseguirla tienes que resolver cinco de nuestros ejercicios destacados en el lenguaje.

  • Gigasegundo: trabajar con fechas
  • Cifrado Atbash: trabajar con strings
  • Dardos: trabajar con números y condicionales
  • Luhn: trabajar con strings, condicionales y números
  • Series: trabajar con strings y secuencias

Estos ejercicios y los de meses anteriores los puedes encontrar en la página de #12in23.

Resúmenes

Vamos a sumergirnos y explorar los lenguajes con un resumen de cada uno.

8th

  • Fue desarrollado por Ron Aaron.
  • Su nombre es un juego de palabras con el lenguaje Forth, que es su principal inspiración. Aun así, tiene muchas diferencias con Forth:
    • Tipado fuerte
    • Multiplataforma
    • Seguridad mejorada (sin acceso directo a la memoria ni ensamblador integrado)
  • Ofrece una versión gratuita y otra comercial, y esta última incluye más funcionalidades.
  • De código cerrado, pero el código fuente puede consultarse una vez que se compra una licencia empresarial.

AWK

  • AWK fue creado en Bell Labs en la década de 1970 por Alfred Aho, Peter Weinberger y Brian Kernighan. El nombre es un acrónimo de los apellidos de sus autores.
  • Es un lenguaje específico del dominio, diseñado para procesar texto, pero también puede usarse con otros fines.
  • AWK es un filtro de Unix, como sed y grep, pensado para usarse en una tubería.
  • Tanto la Single UNIX Specification como la Linux Standard Base exigen que se incluya en cualquier implementación, y por eso está disponible en la mayoría de las máquinas *nix.
  • Diferentes implementaciones del lenguaje AWK:
    • awk (u oawk, por el AWK original): la implementación original
    • GNU AWK (gawk), publicada en 1988, que revisó y amplió el lenguaje de forma significativa
    • BWK AWK (también conocido como nawk), publicada a finales de los 90
    • mawk: implementación rápida que interpreta bytecode
  • En muchos sistemas *nix, el comando awk es un enlace simbólico a gawk o a nawk.

Bash

  • Bash es un shell de Unix desarrollado por Brian Fox y publicado en 1989.
  • Se diseñó como un reemplazo libre del shell Bourne y se ha convertido en el shell de inicio de sesión predeterminado de la mayoría de las distribuciones de Linux. Es un superconjunto de la sintaxis de comandos del shell Bourne, lo que facilita la transición.
  • Amplía el shell Bourne de numerosas formas: expansión de llaves, autocompletado en la línea de comandos, manejo de señales y mucho más.

jq

  • Desarrollado por Stephen Dolan y publicado en 2012.
  • Diseñado para consultar, transformar y manipular documentos JSON con facilidad («el sed del JSON»).
  • La herramienta jq (que implementa el lenguaje) se implementó originalmente en Haskell, pero después se portó a C. También hay versiones portadas a Go y Rust.

Perl

  • Perl fue desarrollado por Larry Wall a finales de la década de 1980 y se publicó por primera vez en 1987.
  • Se diseñó como un lenguaje de scripting de propósito general para facilitar el procesamiento de informes.
  • Muy influyente, sobre todo por su soporte de expresiones regulares (volveremos a esto más adelante).

Raku

  • Diseñado por Larry Wall (el creador de Perl) y publicado en 2015.
  • Originalmente se conocía como Perl 6 y pretendía limpiar el lenguaje y eliminar algunas funcionalidades que se consideraban de poca utilidad o confusas (una cita divertida: «En Perl 6, decidimos que era mejor arreglar el lenguaje que arreglar al usuario», Larry Wall). Perl 6 acabó no siendo compatible a nivel de código fuente con Perl 5, así que se renombró a Raku.
  • Su filosofía de diseño se centra en hacer que programar sea ameno y productivo, a la vez que ofrece una amplia variedad de herramientas para afrontar retos de programación muy diversos (de propósito general).
  • Como Raku es una especificación, puede haber (y hay) varias implementaciones. La única que se desarrolla activamente ahora mismo es Rakudo, pero existen implementaciones más antiguas como Pugs (escrita en Haskell), v6-KindaPerl6 y Niecza (orientada a la CLR).

¿Dónde se usan estos lenguajes?

8th

  • Por desgracia, no hemos encontrado dónde se usa.

AWK

  • Se usa para extraer y presentar datos, y para scripting en general.

Bash

  • Se usa sobre todo para administración de sistemas, pero también para crear utilidades de CLI o envoltorios para otras herramientas. Lo hemos usado muchísimo para trabajar en masa con repositorios de Exercism.

jq

  • Se usa para consultar, transformar y manipular documentos JSON, a menudo en forma de scripts de shell.

Perl

  • Se usa para manipular datos, analizar ficheros, programación web y tareas de administración de sistemas. Ganó popularidad en los primeros días de la web gracias a sus capacidades de manipulación de strings y a su extenso ecosistema de módulos.

Raku

  • Se usa para procesar texto, administración de sistemas y mucho más.

¿Qué hace interesantes a estos lenguajes desde el punto de vista de la programación?

La mayoría de estos lenguajes son de tipado dinámico e interpretados, lo que encaja bien con su naturaleza de scripting. Dicho esto, hay algunas excepciones, sobre todo en los paradigmas que admiten.

8th

  • Tipado fuerte
  • Multiparadigma: procedimental, pero, más interesante aún, basado en la pila (modelo de ejecución basado en la pila), reflexivo (capacidad de examinar y modificar su propia estructura y comportamiento) y concatenativo (todas las expresiones son funciones y la yuxtaposición de funciones denota composición de funciones).
  • Se compila a código nativo, pero también puede interpretarse en un REPL.

AWK

  • De tipado dinámico y, a menudo, interpretado (depende de la implementación que se use).
  • Su paradigma principal es el orientado a datos, en el que describes un programa como instrucciones que indican los datos que hay que buscar y el procesamiento necesario, en lugar de definir explícitamente una secuencia de pasos. AWK sí admite la programación procedimental.

Bash

  • Lenguaje dinámico e interpretado.
  • Admite programación imperativa y procedimental.

jq

  • Lenguaje dinámico e interpretado.
  • Lenguaje puramente funcional (todos los valores son inmutables), con especial énfasis en las «tuberías». Tiene un aire muy Unix.

Perl

  • De tipado dinámico e interpretado.
  • Multiparadigma: admite programación funcional, orientada a objetos e imperativa.

Raku

  • De tipado dinámico, pero admite el tipado gradual, que permite añadir tipado estático donde haga falta (Perl es dinámico).
  • Lenguaje multiparadigma: imperativo, procedimental, orientado a objetos y funcional.

¿Qué los convierte en grandes lenguajes?

8th

  • Tiene muy poca sintaxis, lo que hace que el lenguaje sea más fácil de aprender y entender. Usa JSON para describir datos (como objetos y arrays). También admite otros contenedores como pilas, colas y montículos.
  • No hay palabras clave reservadas. Las subrutinas se llaman «palabras» y se pueden definir nuevas palabras con facilidad. Todas las palabras pueden redefinirse en tiempo de ejecución, tanto las integradas como las definidas por el usuario.
  • Multiplataforma. Genera fácilmente un ejecutable para cualquier plataforma compatible.
  • Seguro. Incluye funcionalidades de seguridad integradas que evitan una amplia gama de errores (sin acceso directo a la memoria; el entorno de ejecución no se enlaza con bibliotecas dinámicas).

AWK

  • Su sintaxis sencilla y la estructura tan coherente del código AWK hacen que sea fácil aprender y leer código AWK. Sus estructuras de datos también son simples y flexibles.
  • Muy expresivo: puedes hacer muchísimo con muy poco código. Perfecto para one-liners.
  • Está instalado en la mayoría de las máquinas *nix, lo que significa que puedes usar tus conocimientos de AWK en muchos sitios (junto con /bin/sh, es el único lenguaje de scripting del Unix estándar).
  • Funciona muy bien en tuberías y scripts de shell, donde AWK procesa la salida de otras herramientas o viceversa.

Bash

  • Se puede usar en la mayoría de las plataformas. Está instalado en casi todas las máquinas *nix, incluido macOS. Gracias al Windows Subsystem for Linux (WSL), bash también está disponible para sistemas Windows.
  • Se puede usar como un RE(P)L, donde ejecutas comandos individuales, o leer y ejecutar código desde ficheros (conocidos como scripts de shell). Si has usado un terminal de Linux, probablemente ya hayas escrito código bash, porque el terminal suele ser un RE(P)L de bash.
  • Bash y los scripts de shell se usan mucho para administración de sistemas, devops y gestión de ordenadores.
  • Extremadamente versátil y flexible.
  • Potentes capacidades de manipulación de strings, incluida una interpolación de strings muy sencilla.

jq

  • Sintaxis simple y breve para trabajar con JSON, lo que lo hace fácil de aprender.
  • Permite definir funciones personalizadas para operaciones más complejas.
  • Admite la optimización de la recursión de cola, ideal para procesar datos de forma recursiva.
  • La herramienta jq se distribuye como un único binario de tan solo unos 30 KB.
  • La herramienta yq envuelve a jq para poder usar la misma sintaxis al manipular ficheros XML, TOML y YAML (por debajo convierte esos tipos de datos a JSON).
  • Tanto la implementación en C como la de Go se pueden integrar en otras aplicaciones.

Perl

  • Funciona en la mayoría de las plataformas. Ideal para escribir scripts multiplataforma.
  • La flexibilidad es una piedra angular de la filosofía de diseño de Perl. Su famoso lema es: «Hay más de una forma de hacerlo» (TMTOWTDI). Se pueden usar distintos enfoques según la tarea que tengas entre manos.
  • Una comunidad sólida y un legado de proyectos influyentes. Con Perl se han desarrollado muchísimos scripts, herramientas y aplicaciones. En su día se dijo de él que era «la cinta americana que mantiene unido internet».
  • Un rico ecosistema de módulos y bibliotecas, disponibles a través de la Comprehensive Perl Archive Network (CPAN).

Raku

  • Grande, complejo y potente, pero también diseñado para que no tengas que aprenderlo todo de golpe. Es fácil empezar con él, y se pueden descubrir sus funcionalidades más potentes más adelante.
  • Un sistema de tipos potente y extensible que incluye el tipado gradual. Esto significa que puedes especificar el nivel de comprobación de tipos que quieras, lo que permite un equilibrio entre el tipado dinámico y el estático.
  • Admite el despacho múltiple, que te permite usar polimorfismo sin herencia.
  • Unicode es un ciudadano de primera clase en Raku. Ofrece soporte nativo para manejar distintas codificaciones de caracteres.
  • Incluye funcionalidades avanzadas de concurrencia y paralelismo. Tiene soporte integrado para programación asíncrona, programación reactiva y ejecución en paralelo.

¿Cuáles son sus características más destacadas?

8th

  • Requiere una forma distinta de pensar. Su combinación única de paradigmas es muy diferente a la de otros lenguajes y te reta a idear distintas maneras de abordar las cosas.
  • Su sintaxis basada en la pila y en la notación polaca inversa (RPN) da lugar a un modelo mental muy sencillo de la ejecución de un programa. Los valores se colocan en la pila y la mayoría de las palabras se definen en función de su efecto sobre ella.

AWK

  • Su paradigma orientado a datos es muy potente. Requiere otra forma de pensar, ya que los programas se definen como un conjunto de pares condición/acción, el texto se divide en registros (normalmente una línea por registro) y cada registro se divide en campos (p. ej., campos de un CSV o una palabra por campo). Cuando te hayas acostumbrado, apreciarás la elegancia y la expresividad de este enfoque y empezarás a verle utilidad por todas partes.
  • Es perfecto para trabajar con texto. Ya sea analizar texto, transformarlo o generar informes, AWK te lo pone fácil. Para tareas como mostrar el shell de cada usuario del sistema o sumar una columna de un CSV, te sorprenderá lo poco código que necesitas.

Bash

  • Perfecto para la automatización. Los scripts de shell son excelentes para automatizar tareas repetitivas.
  • Los scripts de Bash usan tuberías y te permiten combinar otros programas con facilidad. Es trivial crear un script que canalice la salida de un comando hacia otro, o hacer que un script falle en cuanto falle alguno de los comandos que ejecuta.
  • Potente. La facilidad con la que se pueden usar otras herramientas convierte a bash en una herramienta increíblemente potente.

jq

  • Es ideal para extraer y manipular datos JSON de forma fácil y limpia (y hoy en día tenemos a montones). Se ha convertido en la herramienta de facto para transformar datos JSON. Incluso puedes crear datos JSON con jq.
  • Admite el procesamiento de datos en streaming, lo que significa que puedes trabajar con datos «infinitos» sin problemas de memoria.
  • Su énfasis en las tuberías lo hace fácil de aprender para quien esté familiarizado con los flujos, por ejemplo con las herramientas de Unix. Además, hace que el código jq sea bastante fácil de razonar.

Perl

  • Es famoso por su concisión y su expresividad. Necesitas muy poco código para hacer mucho.
  • Está especialmente indicado para trabajar con texto, en gran parte gracias a su potente soporte de expresiones regulares. Perl 5 en particular introdujo muchas funcionalidades nuevas (como las retroreferencias, los grupos de captura con nombre y los cuantificadores perezosos). Philip Hazel creó PCRE (Perl Compatible Regular Expressions), una biblioteca en C que implementa un motor de expresiones regulares compatible con Perl 5. Incluso los lenguajes que no se basan en PCRE suelen diseñar su soporte de expresiones regulares para que sea compatible con PCRE (y, por tanto, usen la sintaxis de Perl 5).

Raku

  • Admite las junctions con auto-threading, que ayudan a que el paralelismo sea mucho más fácil de manejar.
  • Admite la evaluación perezosa, lo que te permite trabajar con listas y secuencias infinitas sin toparte con problemas de memoria. Resulta especialmente útil cuando se manejan grandes conjuntos de datos o algoritmos que implican flujos infinitos de datos.
  • Es estupendo para procesar texto, ya que ofrece una sintaxis de expresiones regulares más simple, más legible y más potente.
  • Incluye soporte integrado para definir lenguajes específicos del dominio (DSL) personalizados mediante gramáticas. Esto te permite crear analizadores sintácticos para formatos de datos o lenguajes concretos, lo que facilita el trabajo con datos textuales complejos.

¿Cuál probar?

  1. Si usas principalmente un sistema Unix o te dedicas al devops, Bash es un lenguaje que merece mucho la pena aprender. Aprender AWK, Perl o Raku también puede resultar muy beneficioso, y los dos primeros además vienen preinstalados en muchos sistemas.
  2. Si trabajas con JSON (o XML/YAML/TOML), jq es una elección obvia.
  3. Si quieres procesar texto, AWK, Perl y Raku son las opciones obvias.
  4. Si te apetece probar algo un poco diferente, 8th es una gran opción.
01 de septiembre de 2023 · ¿Te ha resultado útil?