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 paragawkou paranawk
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
yqenvolve ojqpara 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?
- 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
- Se trabalhas com JSON (ou XML/YAML/TOML), o jq é uma escolha óbvia
- Se queres processar texto, o AWK, o Perl e o Raku são as escolhas óbvias.
- Se te apetece experimentar algo um pouco diferente, o 8th é uma ótima opção