Uploaded avatar of ErikSchierboom

¡Es el septiembre esbelto!

@ErikSchierboom
hace Cerca de 3 años
Video

Introducción

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

Tuvimos un agosto muy movido en Exercism. Unimos Premium e Insiders, agregamos feedback automatizado directamente en el editor, lanzamos los trofeos de track e hicimos un montón de pequeñas mejoras en el sitio también. Si todavía no revisaste tus tracks para ver qué trofeos obtienes, hazlo sin falta. Enviamos un correo a todos los que tienen uno o más trofeos, así que también estén atentos a eso. Durante agosto también nos divertimos mucho con #12in23, explorando lenguajes que la gente normalmente usa para crear apps.

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

Las insignias

Para obtener la insignia de Septiembre minimalista necesitas completar cinco ejercicios cualesquiera en uno de esos lenguajes durante septiembre.

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

  • Gigasecond: trabajar con fechas
  • Atbash Cipher: trabajar con strings
  • Darts: 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 se pueden encontrar en la página de #12in23.

Descripciones generales

Vamos a profundizar y explorar los lenguajes con una descripción general 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. Aunque 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 una comercial, y esta última incluye más funcionalidades.
  • De código cerrado, pero el código fuente se puede ver 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 de dominio específico, diseñado para procesar texto, pero también se puede usar para otros fines
  • AWK es un filtro de Unix, como sed y grep, pensado para usarse en un pipeline
  • La Single UNIX Specification y la especificación Linux Standard Base exigen que se incluya en cualquier implementación, por eso está disponible en la mayoría de las máquinas *nix
  • Distintas implementaciones del lenguaje AWK:
    • awk (u oawk, para el AWK original): la implementación original
    • GNU AWK (gawk), publicado en 1988, que revisó y amplió el lenguaje de forma significativa
    • BWK AWK (también conocido como nawk), publicado a finales de los 90
    • mawk: implementación interpretada de bytecode rápida
  • En muchos sistemas *nix, el comando awk es un enlace simbólico a gawk o 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 más

jq

  • Desarrollado por Stephen Dolan y publicado en 2012
  • Diseñado para permitir 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 luego se portó a C. También existen portes basados en Go y Rust

Perl

  • Perl fue desarrollado por Larry Wall a finales de los años 80 y se publicó por primera vez en 1987.
  • Diseñado 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 eso más adelante)

Raku

  • Diseñado por Larry Wall (creador de Perl) y publicado en 2015
  • Originalmente conocido como Perl 6, pretendía ordenar el lenguaje y eliminar algunas características 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 terminó no siendo compatible a nivel de código fuente con Perl 5, así que se renombró a Raku
  • Su filosofía de diseño gira en torno a hacer que programar sea agradable y productivo, a la vez que ofrece una amplia variedad de herramientas para abordar un conjunto diverso de desafíos de programación (de propósito general)
  • Como Raku es una especificación, puede haber (y hay) múltiples implementaciones. La única implementación con desarrollo activo en este momento es Rakudo, pero existen implementaciones más antiguas como Pugs (escrita en Haskell), v6-KindaPerl6 y Niecza (orientada al CLR)

¿Dónde se usan estos lenguajes?

8th

  • Lamentablemente, no pudimos encontrar dónde se usa

AWK

  • Se usa para extraer y reportar datos, y para scripting en general

Bash

  • Se usa principalmente para administración de sistemas, pero también para proporcionar utilidades de CLI o envoltorios alrededor de otras herramientas. La hemos usado muchísimo para trabajar en bloque con los 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 archivos, 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 su extenso ecosistema de módulos.

Raku

  • Se usa para procesar texto, administración de sistemas y 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: procedural, pero lo más interesante es que está 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 se puede interpretar en un REPL

AWK

  • De tipado dinámico y, a menudo, interpretado (depende de la implementación que se use)
  • Su paradigma principal está orientado a los datos: describes un programa como sentencias que definen los datos que se van a comparar y el procesamiento necesario, en lugar de definir explícitamente una secuencia de pasos. AWK sí admite programación procedural

Bash

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

jq

  • Lenguaje dinámico e interpretado
  • Lenguaje puramente funcional (todos los valores son inmutables), con énfasis en los «pipelines». 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 tipado gradual, que permite añadir tipado estático donde sea necesario (Perl es dinámico)
  • Lenguaje multiparadigma: imperativo, procedural, orientado a objetos y funcional

¿Qué los convierte en grandes lenguajes?

8th

  • Muy poca sintaxis, lo que hace el lenguaje 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 tiene palabras reservadas. Las subrutinas se llaman «palabras» y se pueden definir nuevas con facilidad. Todas las palabras se pueden redefinir en tiempo de ejecución, ya sean integradas o definidas por el usuario
  • Multiplataforma. Genera fácilmente un ejecutable para cualquier plataforma compatible
  • Seguro. Incorpora funciones de seguridad para prevenir una amplia gama de errores (sin acceso directo a la memoria, el runtime no se enlaza con bibliotecas dinámicas)

AWK

  • Sintaxis sencilla con una estructura muy consistente del código AWK, lo que facilita 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 habilidades con AWK en muchos lugares (junto con /bin/sh, es el único lenguaje de scripting en el Unix estándar)
  • Funciona muy bien en pipelines 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. Con el Subsistema de Windows para Linux (WSL), bash ahora también está disponible en sistemas Windows.
  • Se usa como RE(P)L, donde ejecutas comandos individuales o lees y ejecutas código desde archivos (conocidos como scripts de shell). Si has usado una terminal de Linux, probablemente ya hayas escrito código bash, porque la terminal normalmente es 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 computadoras.
  • Extremadamente versátil y flexible
  • Potentes capacidades de manipulación de strings, incluida una interpolación de strings muy directa

jq

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

Perl

  • Se ejecuta en la mayoría de las plataformas. Excelente 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
  • Una comunidad sólida y un legado de proyectos influyentes. Muchos scripts, herramientas y aplicaciones se han desarrollado con Perl. Alguna vez se le llamó «la cinta adhesiva que mantiene unida a 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 una vez. Es fácil empezar y puedes ir descubriendo las funciones más potentes más adelante
  • Un sistema de tipos potente y extensible que incluye tipado gradual. Esto significa que puedes especificar el nivel de verificación de tipos que quieres, 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
  • Ofrece funciones avanzadas de concurrencia y paralelismo. Incluye 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 desafía a buscar 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 simple 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 la pila

AWK

  • Su paradigma orientado a los datos es muy potente. Requiere una forma distinta de pensar: 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 (por ejemplo, campos CSV o una palabra por campo). Una vez que te acostumbras, apreciarás la elegancia y la expresividad de este enfoque, y empezarás a verle usos por todas partes
  • Perfecto para trabajar con texto. Ya sea analizar texto, transformarlo o generar informes, AWK te tiene cubierto. En tareas como imprimir el shell de cada usuario del sistema o sumar una columna de un CSV, te sorprenderá lo poco de 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 pipelines 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 cualquiera de los comandos ejecutados.
  • Potente. La facilidad con la que se pueden usar otras herramientas hace de bash una herramienta increíblemente potente

jq

  • Genial para extraer y manipular datos JSON de forma fácil y limpia (y hoy en día tenemos un montón). Se ha convertido en la herramienta de facto para transformar datos JSON. Incluso puedes crear datos JSON con jq
  • Admite datos en streaming, lo que significa que puedes trabajar con datos «infinitos» sin problemas de memoria
  • Su énfasis en los pipelines será fácil de asimilar para cualquiera que esté familiarizado con los streams, por ejemplo, con las herramientas de Unix. También hace que el código de jq sea bastante fácil de razonar

Perl

  • Famoso por su concisión y su expresividad. Necesitas muy poco código para hacer mucho
  • Especialmente adecuado para trabajar con texto, en gran parte gracias a su potente soporte de expresiones regulares. Perl 5 en particular introdujo muchas funciones nuevas (como referencias hacia atrás, grupos de captura con nombre y 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, usan la sintaxis de Perl 5)

Raku

  • Admite junctions con auto-threading, que ayudan a que el paralelismo sea mucho más fácil de manejar
  • Admite evaluación perezosa, lo que te permite trabajar con listas y secuencias infinitas sin topar con problemas de memoria. Esto es especialmente útil cuando manejas grandes volúmenes de datos o trabajas con algoritmos que implican flujos infinitos de datos
  • Genial para procesar texto, ya que ofrece una sintaxis de expresiones regulares más simple, más legible y más potente
  • Soporte integrado para definir lenguajes de dominio específico (DSL) personalizados usando gramáticas. Esto te permite crear analizadores sintácticos para formatos de datos o lenguajes concretos, lo que facilita trabajar con datos textuales complejos

¿Cuál probar?

  1. Si usas principalmente un sistema Unix o trabajas en devops, Bash es un lenguaje invaluable que deberías aprender. Aprender AWK, Perl o Raku también puede ser 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 quieres probar algo un poco distinto, 8th es una gran opción
viernes, 01 de septiembre de 2023 · ¿Te resultó útil?