Introdução
Olá, pessoal! Espero que todos estejam bem.
Tivemos um agosto intenso no Exercism. Unimos o Premium e o Insiders, adicionamos feedback automatizado diretamente no editor, lançamos as Track Trophies e também fizemos muitas pequenas melhorias no site! Se você ainda não conferiu suas trilhas para ver quais troféus vai ganhar, faça isso sem falta. Enviamos um e-mail para todo mundo que tem um ou mais troféus, então fique de olho nisso também. Durante agosto, também nos divertimos muito no #12in23, explorando linguagens que as pessoas costumam usar para criar aplicativos.
Este mês é o Slimline September, no qual exploramos linguagens que tendem a ser bem concisas e enxutas na sintaxe. Especificamente, vamos olhar para 8th (um descendente do Forth), AWK, Bash, jq, Perl e Raku (que antes era conhecido como Perl 6).
Os badges
Para ganhar o badge do Slimline September, você precisa completar quaisquer cinco exercícios em uma dessas linguagens durante setembro.
Há também o badge anual 12in23. Para ganhá-lo, você precisa resolver cinco dos nossos exercícios em destaque na linguagem.
- Gigasecond: trabalhar com datas
- Atbash Cipher: trabalhar com strings
- Darts: trabalhar com números e condicionais
- Luhn: trabalhar com strings, condicionais e números
- Series: trabalhar com strings e sequências
Esses exercícios e os dos meses anteriores podem todos ser encontrados na página do #12in23.
Visão geral
Vamos nos aprofundar e explorar as linguagens com uma visão geral de cada uma.
8th
- Foi desenvolvido por Ron Aaron.
- O nome é um trocadilho com a linguagem Forth, que é sua principal inspiração. Mas há muitas diferenças em relação ao Forth:
- Tipagem forte
- Multiplataforma
- Segurança aprimorada (sem acesso direto à memória nem montador embutido)
- Oferece tanto uma versão gratuita quanto uma comercial, sendo que esta última oferece mais recursos.
- De código fechado, mas o código-fonte pode ser visto depois que se compra 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 sobrenomes de seus autores.
- É uma linguagem de domínio específico, projetada para processamento de texto, mas também pode ser usada para outros propósitos
- O AWK é um filtro Unix, como sed e grep, pensado para ser usado em um pipeline
- Tanto a Single UNIX Specification quanto a especificação Linux Standard Base exigem que ele seja incluído em qualquer implementação, e é por isso que ele está disponível na maioria das máquinas *nix
- Diferentes implementações da linguagem AWK:
- awk (ou oawk, do original AWK): a implementação original
- GNU AWK (gawk), lançado em 1988, que revisou e expandiu bastante a linguagem
- BWK AWK (também conhecido como nawk), lançado no fim dos anos 90
- mawk: implementação rápida interpretada em bytecode
- Em muitos sistemas *nix, o comando
awké um link simbólico paragawkounawk
Bash
- O Bash é um shell Unix desenvolvido por Brian Fox e lançado em 1989.
- Foi projetado como um substituto gratuito para o shell Bourne e se tornou o shell de login padrão da maioria das distribuições Linux. É um superconjunto da sintaxe de comandos do shell Bourne, o que facilita a transição
- Amplia o shell Bourne de várias formas: expansão de chaves, autocompletar de linha de comando, tratamento de sinais e mais
jq
- Desenvolvido por Stephen Dolan e lançado em 2012
- Projetado para permitir consultar, transformar e manipular documentos JSON com facilidade ("sed para JSON")
- A ferramenta
jq(que implementa a linguagem) foi originalmente implementada em Haskell, mas depois portada para C. Também existem portes baseados em Go e Rust
Perl
- Perl foi desenvolvido por Larry Wall no fim dos anos 1980 e lançado pela primeira vez em 1987.
- Projetado como uma linguagem de script de propósito geral para facilitar o processamento de relatórios
- Muito influente, especialmente pelo seu suporte a expressões regulares (vamos voltar a isso mais adiante)
Raku
- Projetado por Larry Wall (criador do Perl) e lançado em 2015
- Originalmente conhecido como Perl 6, ele deveria arrumar a linguagem e remover alguns recursos considerados de pouca utilidade ou confusos (citação divertida: "No Perl 6, decidimos que seria melhor consertar a linguagem do que consertar o usuário.", Larry Wall). O Perl 6 acabou não sendo compatível em código-fonte com o Perl 5, então foi renomeado para Raku
- A filosofia de design gira em torno de tornar a programação agradável e produtiva, ao mesmo tempo que oferece uma ampla variedade de ferramentas para lidar com um conjunto diversificado de desafios de programação (propósito geral)
- Como o Raku é uma especificação, pode haver (e há) várias implementações. A única implementação desenvolvida ativamente no momento é o Rakudo, mas existem implementações mais antigas, como Pugs (escrita em Haskell), v6-KindaPerl6 e Niecza (voltada para a CLR)
Onde essas linguagens são usadas?
8th
- Infelizmente, não conseguimos descobrir onde ele é usado
AWK
- Usado para extração de dados e relatórios, e para scripting em geral
Bash
- Usado principalmente para administração de sistemas, mas também para fornecer utilitários de CLI ou wrappers em torno de outras ferramentas. Usamos muito ele para trabalhar em massa com os 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 arquivos, programação web e tarefas de administração de sistemas. Ganhou popularidade nos primórdios da web graças à sua capacidade de manipulação de strings e ao seu extenso ecossistema de módulos.
Raku
- Usado para processamento de texto, administração de sistemas e mais
O que torna essas linguagens interessantes do ponto de vista da programação?
A maioria das linguagens tem tipagem dinâmica e é interpretada, o que combina bem com sua natureza de script. Dito isso, há algumas exceções, especialmente nos paradigmas suportados.
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 sua própria estrutura e comportamento) e concatenativo (todas as expressões são funções e a justaposição de funções denota composição de funções)
- Compilado para código nativo, mas também pode ser interpretado em um REPL
AWK
- Tipagem dinâmica e muitas vezes interpretado (depende da implementação usada)
- O paradigma principal é orientado a dados, em que você descreve um programa como instruções que descrevem os dados a serem correspondidos e o processamento necessário, em vez de definir explicitamente uma sequência de passos a serem seguidos. O AWK oferece suporte à programação procedural
Bash
- Linguagem dinâmica e interpretada
- Oferece suporte à 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 uma cara bem Unix
Perl
- Tipagem dinâmica e interpretada
- Multiparadigma, com suporte à programação funcional, orientada a objetos e imperativa
Raku
- Tipagem dinâmica, mas com suporte a tipagem gradual, em que a tipagem estática pode ser adicionada onde for necessário (o Perl é dinâmico)
- Linguagem multiparadigma: imperativa, procedural, orientada a objetos e funcional
O que faz delas ótimas linguagens?
8th
- Uma sintaxe mínima torna a linguagem mais fácil de aprender e entender. Usa JSON para descrever dados (como objetos e arrays). Também oferece suporte a outros contêineres, como pilhas, filas e heaps
- Sem palavras-chave reservadas. As sub-rotinas são chamadas de "words", e novas words podem ser definidas facilmente. Todas as words podem ser redefinidas durante a execução, sejam nativas ou definidas pelo usuário
- Multiplataforma. Gere facilmente um executável para qualquer plataforma suportada
- Seguro. Recursos de segurança nativos para evitar uma ampla variedade de bugs (sem acesso direto à memória, o runtime não se vincula a bibliotecas dinâmicas)
AWK
- Sintaxe simples com uma estrutura muito consistente do código AWK, o que facilita aprender e ler código AWK. Suas estruturas de dados também são simples e flexíveis
- Muito expressivo, em que você consegue fazer muito com pouquíssimo código. Perfeito para one-liners
- Instalado na maioria das máquinas *nix, o que significa que você pode usar suas habilidades de AWK em muitos lugares (junto com /bin/sh, a única linguagem de script 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 Windows Subsystem for Linux (WSL), o bash agora também está disponível para sistemas Windows.
- Use como um RE(P)L, em que você roda comandos individuais ou lê e executa código de arquivos (conhecidos como scripts de shell). Se você já usou um terminal Linux, provavelmente já escreveu código bash, já que o terminal normalmente é um RE(P)L do bash
- O bash e os scripts de shell são amplamente usados para administração de sistemas, devops e gerenciamento de computadores.
- Extremamente versátil e flexível
- Recursos poderosos de manipulação de strings, incluindo interpolação de strings bem direta
jq
- Sintaxe simples e curta para trabalhar com JSON, o que torna a linguagem fácil de aprender
- Permite definir funções personalizadas para operações mais complexas.
- Oferece suporte à otimização de recursão de cauda, ótima para processar dados de forma recursiva
- A ferramenta jq é distribuída como um único binário de apenas cerca de 30 KB
- A ferramenta
yqenvolve ojqpara permitir usar a mesma sintaxe na manipulação de arquivos XML, TOML e YAML (ela converte esses tipos de dados para JSON nos bastidores) - Tanto a implementação em C quanto a em Go podem ser embutidas em outras aplicações
Perl
- Roda na maioria das plataformas. Ótimo para escrever scripts multiplataforma
- A flexibilidade é um pilar da filosofia de design do Perl. Seu famoso lema é: "There's more than one way to do it" (TMTOWTDI). Diferentes abordagens podem ser usadas dependendo da tarefa em questão
- Comunidade forte e um legado de projetos influentes. Muitos scripts, ferramentas e aplicações foram desenvolvidos usando Perl. Já foi chamado de: "a fita adesiva que mantém a internet unida"
- Ecossistema rico de módulos e bibliotecas, disponível através da Comprehensive Perl Archive Network (CPAN)
Raku
- Grande, complexo e poderoso, mas também projetado para ser uma linguagem que você não precisa aprender de uma vez só. Fácil de começar, e dá para explorar os recursos mais poderosos depois
- Sistema de tipos poderoso e extensível que inclui tipagem gradual. Isso significa que você pode especificar o nível de verificação de tipos que quiser, permitindo um equilíbrio entre tipagem dinâmica e estática
- Oferece suporte a despacho múltiplo, que permite usar polimorfismo sem herança
- Unicode é um cidadão de primeira classe no Raku. Ele oferece suporte nativo para lidar com diferentes codificações de caracteres
- Oferece recursos avançados de concorrência e paralelismo. Inclui suporte nativo para programação assíncrona, programação reativa e execução paralela
Quais são seus recursos de destaque?
8th
- Exige uma forma diferente de pensar. Sua mistura única de paradigmas é bem diferente de outras linguagens e desafia você a encontrar maneiras diferentes de abordar as coisas
- A sintaxe baseada em pilha e a Notação Polonesa Reversa (RPN) resultam em um modelo mental muito simples de execução de programa. Os valores são colocados na pilha e a maioria das words é definida em termos de efeito na pilha
AWK
- O paradigma orientado a dados é muito poderoso. Exige uma forma diferente de pensar, já que os programas são definidos como um conjunto de pares condição/ação e o texto é dividido em registros (normalmente uma linha por registro), e cada registro é dividido em campos (por exemplo, campos de CSV ou uma palavra por campo). Depois que você se acostumar com isso, vai apreciar a elegância e a expressividade dessa abordagem, e vai começar a ver usos para ela em todo lugar
- Perfeito para trabalhar com texto. Seja analisando texto, transformando texto ou gerando relatórios, o AWK dá conta do recado. Tarefas como imprimir o shell de cada usuário no sistema ou somar uma coluna de um CSV vão te surpreender com tão pouco código
Bash
- Perfeito para automação. Scripts de shell são excelentes para automatizar tarefas repetitivas.
- Scripts em bash usam pipelines e permitem juntar outros programas com facilidade. É trivial criar um script que encadeia a saída de um comando à entrada de outro, ou fazer um script falhar assim que qualquer um dos comandos executados falhar.
- Poderoso. A facilidade com que outras ferramentas podem ser usadas faz do bash uma ferramenta incrivelmente poderosa
jq
- Ótimo para extrair e manipular dados JSON de forma fácil e limpa (dos quais temos de monte hoje em dia). Tornou-se a ferramenta de fato para transformar dados JSON. Você pode até criar dados JSON com o jq
- Oferece suporte a streaming de dados, o que significa que você pode trabalhar com dados "infinitos" sem problemas de memória
- A ênfase em pipelines será fácil de assimilar para quem já está familiarizado com streams, por exemplo, ferramentas Unix. Também torna o código jq bastante fácil de entender
Perl
- Famoso por sua concisão e expressividade. Você precisa de pouquíssimo 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 muitos recursos novos (como retroreferências, grupos de captura nomeados e quantificadores preguiçosos). Philip Hazel criou o PCRE (Perl Compatible Regular Expressions), uma biblioteca em C que implementa um motor de expressões regulares compatível com o Perl 5. Até linguagens que não se baseiam no PCRE muitas vezes projetam seu suporte a expressões regulares para ser compatível com o PCRE (e, portanto, usar a sintaxe do Perl 5)
Raku
- Oferece suporte a junctions de threading automático, que ajudam a tornar o paralelismo muito mais fácil de usar
- Oferece suporte a avaliação preguiçosa, permitindo trabalhar com listas e sequências infinitas sem esbarrar em problemas de memória. Isso é especialmente útil ao lidar com grandes conjuntos de dados ou com algoritmos que envolvem fluxos infinitos de dados
- Ótimo para processamento de texto, oferecendo uma sintaxe de regex mais simples, mais legível e mais poderosa
- Suporte nativo para definir linguagens de domínio específico (DSLs) personalizadas usando gramáticas. Isso permite criar parsers para formatos de dados ou linguagens específicos, facilitando o trabalho com dados textuais complexos
Qual experimentar?
- Se você usa principalmente um sistema Unix ou trabalha com devops, o Bash é uma linguagem valiosíssima para aprender. Aprender AWK, Perl ou Raku também pode ser muito benéfico, e os dois primeiros já vêm instalados em muitos sistemas
- Se você trabalha com JSON (ou XML/YAML/TOML), o jq é a escolha óbvia
- Se você quer processar texto, AWK, Perl e Raku são as escolhas óbvias.
- Se você quiser experimentar algo um pouco diferente, o 8th é uma ótima opção