Uploaded avatar of ErikSchierboom

É o Slimline September!

@ErikSchierboom
há Aproximadamente 3 anos
Vídeo

Introdução

Olá a todos! Espero que estejam todos bem.

Tivemos um agosto intenso no Exercism. Juntámos o Premium e o Insiders, adicionámos comentários automáticos diretamente no editor, lançámos os Track Trophies e fizemos imensas pequenas melhorias no site! Se ainda não verificaste os teus percursos para ver que troféus recebes, faz isso sem falta. Enviámos um email a todos os que têm um ou mais troféus, por isso fica atento à tua caixa de entrada. Durante agosto também nos divertimos imenso no #12in23, a explorar linguagens que as pessoas costumam usar para criar aplicações.

Este mês é o Slimline September, em que exploramos linguagens que tendem a ser muito concisas e sucintas na sua sintaxe. Concretamente, vamos olhar para 8th (um descendente do Forth), AWK, Bash, jq, Perl e Raku (que antes era conhecido como Perl 6).

Os distintivos

Para obteres o distintivo Slimline September, tens de completar cinco exercícios numa dessas linguagens durante o mês de setembro.

Há também o distintivo 12in23, que dura o ano todo. Para o obteres, tens de resolver cinco dos nossos exercícios em destaque na linguagem.

  • Gigasegundo: trabalha com datas
  • Cifra Atbash: trabalha com strings
  • Dardos: trabalha com números e condicionais
  • Luhn: trabalha com strings, condicionais e números
  • Séries: trabalha com strings e sequências

Estes exercícios e os dos meses anteriores estão todos na página #12in23.

Visão geral

Vamos mergulhar nestas linguagens, com uma visão geral de cada uma.

8th

  • Foi desenvolvido por Ron Aaron.
  • O nome é um trocadilho com a linguagem Forth, que é a sua principal inspiração. No entanto, há muitas diferenças em relação ao Forth:
    • Tipagem forte
    • Multiplataforma
    • Segurança melhorada (sem acesso direto à memória nem assembler incorporado)
  • Tem uma versão gratuita e uma versão comercial, sendo que esta última oferece mais funcionalidades.
  • Código fechado, mas o código-fonte pode ser consultado depois de se comprar uma licença empresarial

AWK

  • O AWK foi criado nos Bell Labs, na década de 1970, por Alfred Aho, Peter Weinberger e Brian Kernighan. O nome é um acrónimo dos apelidos dos seus autores.
  • É uma linguagem de domínio específico, concebida para processar texto, mas também pode ser usada para outros fins
  • O AWK é um filtro Unix, como o sed e o grep, pensado para ser usado numa pipeline
  • Tanto a Single UNIX Specification como a especificação Linux Standard Base exigem a sua inclusão em qualquer implementação, e é por isso que está disponível na maioria das máquinas *nix
  • Diferentes implementações da linguagem AWK:
    • awk (ou oawk, do AWK original): a implementação original
    • GNU AWK (gawk), lançado em 1988, que reviu e expandiu significativamente a linguagem
    • BWK AWK (também conhecido como nawk), lançado no final dos anos 90
    • mawk: implementação interpretada de bytecode rápida
  • Em muitos sistemas *nix, o comando awk é um link simbólico para gawk ou para nawk

Bash

  • O Bash é um shell Unix desenvolvido por Brian Fox e lançado em 1989.
  • Foi concebido como substituto livre do Bourne shell e tornou-se o shell de início de sessão predefinido na maioria das distribuições Linux. É um superconjunto da sintaxe de comandos do Bourne shell, o que facilita a transição
  • Expande o Bourne shell de várias formas: expansão de chavetas, conclusão na linha de comandos, tratamento de sinais e muito mais

jq

  • Desenvolvido por Stephen Dolan e lançado em 2012
  • Concebido para permitir consultar, transformar e manipular documentos JSON com facilidade (o "sed para JSON")
  • A ferramenta jq (que implementa a linguagem) foi originalmente implementada em Haskell, mas depois portada para C. Existem também implementações em Go e Rust

Perl

  • O Perl foi desenvolvido por Larry Wall no final da década de 1980 e lançado pela primeira vez em 1987.
  • Foi concebido como linguagem de scripting de uso geral para facilitar o processamento de relatórios
  • Muito influente, sobretudo no suporte a expressões regulares (voltaremos a isto mais adiante)

Raku

  • Concebido por Larry Wall (o criador do Perl) e lançado em 2015
  • Originalmente conhecido como Perl 6, destinava-se a arrumar a linguagem e a remover algumas funcionalidades consideradas pouco úteis ou confusas (citação divertida: "No Perl 6, decidimos que era melhor corrigir a linguagem do que corrigir o utilizador.", Larry Wall). O Perl 6 acabou por não ser compatível ao nível do código-fonte com o Perl 5, por isso foi renomeado para Raku
  • A sua filosofia de design centra-se em tornar a programação agradável e produtiva, ao mesmo tempo que oferece uma vasta gama de ferramentas para enfrentar um conjunto diversificado de desafios de programação (uso geral)
  • Como o Raku é uma especificação, pode haver (e há) várias implementações. A única implementação em desenvolvimento ativo neste momento é o Rakudo, mas existem implementações mais antigas como o Pugs (escrito em Haskell), o v6-KindaPerl6 e o Niecza (dirigido ao CLR)

Onde é que estas linguagens são usadas?

8th

  • Infelizmente, não conseguimos encontrar onde é usado

AWK

  • Usado para extração de dados e elaboração de relatórios, e para scripting em geral

Bash

  • Usado sobretudo para administração de sistemas, mas também para criar utilitários CLI ou servir de camada por cima de outras ferramentas. Usámo-lo imenso para trabalhar em massa com repositórios do Exercism

jq

  • Usado para consultar, transformar e manipular documentos JSON, muitas vezes na forma de scripts de shell.

Perl

  • Usado para manipulação de dados, análise de ficheiros, programação web e tarefas de administração de sistemas. Ganhou popularidade nos primeiros tempos da web graças às suas capacidades de manipulação de strings e ao seu vasto ecossistema de módulos.

Raku

  • Usado para processamento de texto, administração de sistemas e muito mais

O que torna estas linguagens interessantes do ponto de vista da programação?

A maioria destas linguagens tem tipagem dinâmica e é interpretada, o que se adequa bem à sua natureza de scripting. Dito isto, há algumas exceções, sobretudo nos paradigmas que suportam.

8th

  • Tipagem forte
  • Multiparadigma: procedural, mas, mais interessante ainda, baseado em pilha (modelo de execução baseado em pilha), reflexivo (capacidade de examinar e modificar a sua própria estrutura e comportamento) e concatenativo (todas as expressões são funções e a justaposição de funções representa composição de funções)
  • Compilado para código nativo, mas também pode ser interpretado num REPL

AWK

  • Tipagem dinâmica e frequentemente interpretado (depende da implementação utilizada)
  • O paradigma principal é orientado pelos dados, em que descreves um programa como instruções que indicam os dados a corresponder e o processamento necessário, em vez de definires explicitamente uma sequência de passos a dar. O AWK também suporta programação procedural

Bash

  • Linguagem dinâmica e interpretada
  • Suporta programação imperativa e procedural

jq

  • Linguagem dinâmica e interpretada
  • Linguagem puramente funcional (todos os valores são imutáveis), com ênfase em "pipelines". Tem um sabor muito Unix

Perl

  • Tipagem dinâmica e interpretado
  • Multiparadigma, com suporte para programação funcional, orientada a objetos e imperativa

Raku

  • Tipagem dinâmica, mas suporta tipagem gradual, em que se pode acrescentar tipagem estática onde for preciso (o Perl é dinâmico)
  • Linguagem multiparadigma: imperativa, procedural, orientada a objetos e funcional

O que as torna excelentes linguagens?

8th

  • Uma sintaxe muito reduzida torna a linguagem mais fácil de aprender e de compreender. Usa JSON para descrever dados (como objetos e arrays). Também suporta outros contentores como pilhas, filas e heaps
  • Não tem palavras reservadas. As sub-rotinas chamam-se "palavras" e podem definir-se novas palavras com facilidade. Todas as palavras podem ser redefinidas em tempo de execução, sejam incorporadas ou definidas pelo utilizador
  • Multiplataforma. Gera facilmente um executável para qualquer plataforma suportada
  • Seguro. Funcionalidades de segurança incorporadas para evitar uma vasta gama de erros (sem acesso direto à memória, o runtime não se liga a bibliotecas dinâmicas)

AWK

  • Sintaxe simples e uma estrutura de código AWK muito consistente, o que torna fácil aprender e ler código AWK. As suas estruturas de dados também são simples e flexíveis
  • Muito expressivo, permitindo fazer imenso com muito pouco código. Perfeito para one-liners
  • Instalado na maioria das máquinas *nix, o que significa que podes usar as tuas competências em AWK em muitos sítios (a par do /bin/sh, é a única linguagem de scripting no Unix padrão)
  • Funciona muito bem em pipelines e scripts de shell, em que o AWK processa a saída de outras ferramentas, ou vice-versa

Bash

  • Pode ser usado na maioria das plataformas. Está instalado em quase todas as máquinas *nix, incluindo o macOS. Com o Subsistema Windows para Linux (WSL), o bash está agora também disponível em sistemas Windows.
  • Pode ser usado como RE(P)L, onde executas comandos individuais, ou lês e executas código a partir de ficheiros (os chamados scripts de shell). Se já usaste um terminal Linux, provavelmente já escreveste código bash, porque o terminal é normalmente um RE(P)L de bash
  • O bash e os scripts de shell são amplamente utilizados para administração de sistemas, devops e gestão de computadores.
  • Extremamente versátil e flexível
  • Capacidades poderosas de manipulação de strings, incluindo interpolação de strings muito direta

jq

  • Sintaxe simples e curta para trabalhar com JSON, o que o torna fácil de aprender
  • Permite definir funções personalizadas para operações mais complexas.
  • Suporta otimização de recursão de cauda, o que é ótimo para processar dados de forma recursiva
  • A ferramenta jq é distribuída como um único binário com apenas cerca de 30 KB
  • A ferramenta yq envolve o jq para permitir usar a mesma sintaxe na manipulação de ficheiros XML, TOML e YAML (converte esses tipos de dados para JSON nos bastidores)
  • Tanto a implementação em C como a em Go suportam ser incorporadas noutras aplicações

Perl

  • Corre na maioria das plataformas. Ótimo para escrever scripts multiplataforma
  • A flexibilidade é um pilar da filosofia de design do Perl. O seu famoso lema é: "Há mais do que uma forma de o fazer" (TMTOWTDI). Podem usar-se abordagens diferentes conforme a tarefa em causa
  • Uma comunidade forte e um legado de projetos influentes. Muitos scripts, ferramentas e aplicações foram desenvolvidos com Perl. Já foi descrito como "a fita-cola que mantém a internet unida"
  • Um rico ecossistema de módulos e bibliotecas, disponível através da Comprehensive Perl Archive Network (CPAN)

Raku

  • Grande, complexo e poderoso, mas também concebido para ser uma linguagem que não tens de aprender toda de uma vez. É fácil começar e podes explorar as funcionalidades mais poderosas mais tarde
  • Um sistema de tipos poderoso e extensível que inclui tipagem gradual. Isto significa que podes especificar o nível de verificação de tipos que queres, permitindo um equilíbrio entre tipagem dinâmica e estática
  • Suporta despacho múltiplo, o que te permite usar polimorfismo sem herança
  • O Unicode é um cidadão de primeira classe no Raku. Oferece suporte nativo para lidar com diferentes codificações de carateres
  • Oferece funcionalidades avançadas de concorrência e paralelismo. Inclui suporte incorporado para programação assíncrona, programação reativa e execução paralela

Quais são as suas funcionalidades de destaque?

8th

  • Exige uma forma de pensar diferente. A sua combinação única de paradigmas é muito diferente da de outras linguagens e desafia-te a encontrar formas diferentes de abordar as coisas
  • A sintaxe baseada em pilha e em Notação Polaca Inversa (RPN) proporciona um modelo mental de execução de programas muito simples. Os valores são colocados na pilha e a maioria das palavras define-se em função do efeito que tem na pilha

AWK

  • O paradigma orientado pelos dados é muito poderoso. Exige uma forma de pensar diferente, já que os programas se definem como um conjunto de pares condição/ação e o texto é dividido em registos (normalmente uma linha por registo), e cada registo é dividido em campos (por exemplo, campos de CSV ou uma palavra por campo). Quando te habituares a isto, vais apreciar a elegância e a expressividade desta abordagem e começarás a ver utilizações para ela em todo o lado
  • Perfeito para trabalhar com texto. Quer seja analisar texto, transformar texto ou gerar relatórios, o AWK dá conta do recado. Tarefas como imprimir o shell de cada utilizador do sistema ou somar uma coluna de um CSV vão surpreender-te pela quantidade de código que precisas

Bash

  • Perfeito para automatizar. Os scripts de shell são excelentes para automatizar tarefas repetitivas.
  • Os scripts de bash usam pipelines e permitem-te juntar outros programas com facilidade. É trivial criar um script que encaminha a saída de um comando para outro comando, ou fazer com que um script falhe assim que um dos comandos executados falhe.
  • Poderoso. A facilidade com que se usam outras ferramentas faz do bash uma ferramenta incrivelmente poderosa

jq

  • Ótimo para extrair e manipular dados JSON de forma fácil e limpa (e hoje em dia temos imensos). Tornou-se a ferramenta de facto para transformar dados JSON. Podes até criar dados JSON com o jq
  • Suporta streaming de dados, o que significa que podes trabalhar com dados "infinitos" sem problemas de memória
  • A ênfase em pipelines será fácil de assimilar para quem está familiarizado com streams, por exemplo com as ferramentas Unix. Também torna o código jq bastante fácil de raciocinar sobre

Perl

  • Famoso pela sua concisão e expressividade. Precisas de muito pouco código para fazer muito
  • Especialmente adequado para trabalhar com texto, em grande parte devido ao seu poderoso suporte a expressões regulares. O Perl 5, em particular, introduziu muitas funcionalidades novas (como retroreferências, grupos de captura com nome e quantificadores preguiçosos). Philip Hazel criou a PCRE (Perl Compatible Regular Expressions), uma biblioteca em C que implementa um motor de expressões regulares compatível com o Perl 5. Mesmo as linguagens que não se baseiam na PCRE desenham frequentemente o seu suporte a expressões regulares para ser compatível com a PCRE (e, por isso, usam a sintaxe do Perl 5)

Raku

  • Suporta junctions com auto-threading, que tornam o paralelismo muito mais fácil de usar
  • Suporta avaliação preguiçosa, permitindo trabalhar com listas e sequências infinitas sem problemas de memória. Isto é particularmente útil quando se lida com grandes conjuntos de dados ou com algoritmos que envolvem fluxos infinitos de dados
  • Ótimo para processamento de texto, proporcionando uma sintaxe de regex mais simples, mais legível e mais poderosa
  • Suporte incorporado para definir linguagens de domínio específico (DSLs) personalizadas recorrendo a gramáticas. Isto permite criar analisadores para formatos de dados ou linguagens específicas, facilitando o trabalho com dados textuais complexos

Qual experimentar?

  1. Se usas sobretudo um sistema Unix ou trabalhas em devops, o Bash é uma linguagem inestimável para aprenderes. Aprender AWK, Perl ou Raku também pode ser muito benéfico, e os dois primeiros já vêm pré-instalados em muitos sistemas
  2. Se trabalhas com JSON (ou XML/YAML/TOML), o jq é uma escolha óbvia
  3. Se queres processar texto, o AWK, o Perl e o Raku são as escolhas óbvias.
  4. Se te apetece experimentar algo um pouco diferente, o 8th é uma ótima opção
01 de setembro de 2023 · Foi útil?