Uploaded avatar of iHiD

É o Mindshifting May!

@iHiD
Mais de 3 anos atrás
Vídeo

Introdução

Olá, pessoal! Espero que estejam todos bem.

O ano está passando rápido e já estamos em Mindshifting May, provavelmente o mês com o qual estou mais empolgado, principalmente porque inclui Prolog!

Espero que vocês tenham gostado do Analytical April. Uma quantidade enorme de vocês participou e acho que foi um dos meses de maior sucesso até agora. Também conversei com Simon Peyton Jones durante abril, numa entrevista atrasada do Functional February. Foi muito bom, e recomendo mesmo que você assista de novo, nem que seja pela frase maravilhosa: "Quando o calcário da programação imperativa se desgastar, o granito da programação funcional será revelado por baixo".

Enfim, vamos ao Mindshifting May! Como sempre, Erik e eu vamos dar uma visão geral rápida sobre do que o mês trata e sobre as diferentes linguagens que vamos explorar.

Então temos nada menos que seis linguagens este mês: Ballerina, Pharo, Prolog, Red, Tcl (Tickle) e Unison. Cada uma dessas linguagens é bem diferente das linguagens mais "mainstream", então recomendamos que você experimente mais de uma para sentir como elas são diferentes. Recomendo mesmo Prolog, porque é uma das linguagens em que mais gostei de programar na minha vida. Erik também está muito empolgado com Unison, então é outra boa opção para experimentar.

Os badges

Para ganhar o badge do Mindshifting May, você precisa completar cinco exercícios, quaisquer, em uma dessas linguagens durante maio.

Também existe o badge 12in23, que é anual. Para consegui-lo, você precisa resolver cinco dos nossos exercícios em destaque na linguagem. Se você estiver assistindo a isto depois de maio, pode fazer essa parte em qualquer momento do ano, então não perdeu nada. Escolher esses exercícios foi difícil, já que as linguagens são todas tão diferentes, então optamos por exercícios mais genéricos, que são divertidos de resolver e interessantes para explorar abordagens diferentes.

  • Acrônimo: converte uma frase para a sua sigla
  • Isograma: verifica se uma frase contém letras repetidas
  • Números Romanos: traduz um número decimal para algarismos romanos
  • Gotas de Chuva: converte um número em sons de gotas de chuva
  • Era Espacial: calcula quantos anos alguém teria nos planetas do nosso sistema solar

Esses exercícios e os dos meses anteriores podem todos ser encontrados na página do #12in23.

Visões gerais

Vamos nos aprofundar e explorar as linguagens com uma visão geral de cada uma.

Prolog:

  • Uma forma diferente de pensar. Um programa é definido como um conjunto de relações. Você então "consulta" o banco de dados de relações para encontrar respostas usando unificação (casamento de padrões). Perfeito para sistemas baseados em regras
  • Pouca sintaxe, apenas um tipo de dado (termos) e um elemento estrutural da linguagem (cláusulas). As cláusulas são totalmente construídas a partir de termos e podem definir fatos ou regras.
  • Muito declarativa. Preocupe-se menos com como as coisas são computadas e mais com o que deve ser computado. Em muitos casos, isso significa menos código
  • Projetada para funcionar bem na consulta de grandes espaços de busca. Diferentes estratégias de busca (em profundidade, em largura), com suporte a poda automática

Unison

  • Não há conflitos de versão no código Unison! Uma função Unison conhece os hashes das suas dependências, então consegue encontrar a versão certa do código de que precisa.
  • O Unison permite navegar pelo código ao vivo na interface de desenvolvimento local e em repositórios hospedados, então você pode sempre clicar para ver o código-fonte das bibliotecas das quais depende.
  • As Abilities são uma forma de gerenciar "efeitos" (por exemplo, IO) de maneira puramente funcional

Pharo

  • Pouquíssima sintaxe, a sintaxe inteira cabe num cartão-postal (apenas 6 palavras reservadas!). A sintaxe de mensagens imita as linguagens naturais, com um sujeito, um verbo e complementos (between: 1 and: 2 +). A semântica também é simples (por exemplo, regras de precedência extremamente simples). Isso torna tudo mais fácil de aprender e ler
  • A produtividade é ótima, depois que a pessoa supera a curva de aprendizado inicial. São vários os motivos: a semântica simples e a pouca sintaxe, mas também alguns dos destaques do Pharo mencionados mais adiante
  • Roda na maioria das plataformas (Windows, macOS, Linux + suporte a ARM) numa máquina virtual rápida (OpenSmalltalk)
  • Não é só mais uma implementação de Smalltalk, continua em desenvolvimento ativo (a versão mais recente do Smalltalk é o Smalltalk 80, de 1980)
  • Comunidade amigável

Tcl (pronuncia-se "tickle")

  • Pouquíssima sintaxe, apenas 12 regras, e cabe numa folha de papel. A semântica também é relativamente direta. Isso torna os programas fáceis de ler e aprender
  • Concorrência simples por meio de corrotinas, o que permite escrever código assíncrono como se fosse síncrono
  • Loop de eventos integrado para programação de rede e E/S de arquivos assíncrona
  • Madura, mas ainda em evolução

Ballerina

  • Suporte de primeira classe para processamento declarativo e com segurança de tipos de JSON, XML e dados tabulares, com consultas integradas à linguagem
  • Tipos flexíveis, com tipagem estrutural (duck typing) predominante. Os tipos fechados são uma forma de fazer subtipagem, enquanto os tipos abertos lidam com elegância com o excesso de dados enviados. Vinculação e validação de dados integradas quando usadas em recursos HTTP
  • Suporte integrado a padrões de integração e conectores comuns, incluindo transações distribuídas, compensação e circuit breakers
  • Todo programa Ballerina é automaticamente observável por qualquer ferramenta de Open Telemetry, dando a você controle total e visibilidade sobre o comportamento e o desempenho do código.
  • Ótima concorrência por meio de strands, que são threads leves. Chamadas de E/S não bloqueantes são fáceis. O compilador pode ajudar a verificar chamadas de envio e recebimento entre workers, evitando deadlocks. A imutabilidade também é ótima para redes
  • Tratamento explícito de erros por meio de tipos de união e do açúcar sintático check para ajudar nisso

Red

  • Leve. Todo o conjunto de ferramentas é um download de cerca de 1,5 MB, um único executável.
  • Portátil. Compilação cruzada fácil. Gera binários pequenos e sem dependências. Baixo consumo de memória.
  • Red é sua própria meta-linguagem e seu próprio formato de dados (como as LISPs). Os programas podem transformar e ler código.
  • Reativa: os objetos podem ser vinculados para reduzir o tamanho e a complexidade do programa (pense em planilhas do Excel)

Onde essas linguagens são usadas?

Prolog:

  • Inteligência artificial (o Watson da IBM)
  • Processamento de linguagem (natural)
  • Banco de dados distribuído para bases de conhecimento (TerminusDB)
  • Usada até para especificar as regras de tipos da Java Virtual Machine

Unison

  • Usada para escrever sistemas distribuídos
  • Serviços web em geral
  • Tarefas de processamento em lote

Pharo

  • Usada para ferramentas interativas
  • Usada em domínios muito variados: plataforma de negociação online e ferramenta de gestão de investimentos baseada na nuvem
  • Prototipagem de interfaces de usuário e interação na indústria de defesa
  • Aplicação web para planejamento de eventos
  • Ferramenta de ambiente de desenvolvimento moldável para exploração de API, dados e sistemas

Tcl

  • Usada como código de cola ou embutida
  • Usada nas interfaces gráficas dos roteadores da CISCO
  • Diversos sistemas de manufatura
  • A NASA já a usou em muitas ocasiões
  • Outras grandes empresas incluem Pixar, Boeing, Intel, NBC e muitas outras.
  • O Tk, o kit de ferramentas de janelas, foi adotado por outras linguagens de script como Perl, Python e Ruby.
  • O Expect, uma ferramenta para automatizar aplicações interativas de CLI

Ballerina

  • Usada para aplicações nativas da nuvem
  • Usada pelo MOSIP, que é uma plataforma de identidade fundamental que ajuda governos e outras organizações a implementar sistemas de identidade digitais e fundamentais de forma econômica.

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

Prolog:

  • Linguagem de programação lógica (uma das primeiras), que é um paradigma próprio (como a orientação a objetos e a programação funcional)
  • Tipagem dinâmica

Unison

  • Linguagem puramente funcional
  • Tipagem estática

Pharo

  • Linguagem orientada a objetos, mas no sentido do Smalltalk. Diferente das linguagens orientadas a objetos "comuns": sem construtores, sem declaração de tipos, sem interfaces, sem tipos primitivos.
  • Tipagem dinâmica

Tcl

  • Multiparadigma: os estilos orientado a objetos, imperativo e funcional são suportados
  • Tipagem dinâmica

Ballerina

  • Multiparadigma: orientada a objetos, funcional e declarativa
  • Tipagem estática

Red

  • Multiparadigma: imperativa, funcional, orientada a objetos, simbólica e reativa
  • Tipagem estática

Quais são os recursos de destaque?

Prolog:

  • Flexível. Muitos predicados integrados funcionam em várias direções. Permite consultar e criar dados com a mesma sintaxe. Alguns problemas difíceis em outras linguagens são triviais
  • DCG é como um combinador de analisadores sintáticos integrado, ótimo para analisar, gerar, completar e verificar sequências
  • CLP é uma forma eficiente de definir um programa em termos de restrições

Unison

  • O código não é texto, mas dados (imutáveis). O código fica armazenado num banco de dados e é acessado e atualizado pelo Unison Codebase Manager. Arquivos de texto são apenas uma das formas de colocar código dentro do banco de dados. Dados imutáveis também significam que os resultados dos testes podem ser armazenados em cache e que a verificação de tipos só precisa ser feita uma vez
  • As definições são referenciadas por hash, não por nome. Isso se chama código "endereçado por conteúdo". A árvore sintática de uma definição determina o seu hash. Sem conflitos de versionamento, e renomear é trivial.
  • A documentação do Unison é uma entidade de primeira classe na linguagem e está sempre sincronizada com as funções que descreve. Você pode incorporar exemplos ao vivo nela e garantir que o código de exemplo compila.
  • Ideal para computação na nuvem: não há builds, as funções podem ser distribuídas na hora, e gasta-se menos tempo escrevendo codificadores e decodificadores para a comunicação entre serviços no Unison.

Pharo

  • Modelo de execução direto: tudo é um objeto e a execução acontece exclusivamente por meio de mensagens (que também são objetos). Até o fluxo de controle é feito por mensagens. Apesar de o modelo ser simples, ele é muito poderoso. Bem diferente de outras linguagens orientadas a objetos.
  • O seu código fica numa imagem Pharo, não em arquivos de texto. Uma imagem Pharo contém todo o estado da sua aplicação e pode ser executada numa máquina virtual Pharo. Quando você salva o seu trabalho, o Pharo salva todo o estado do ambiente como um arquivo de imagem. Esse arquivo contém todos os objetos, as relações entre eles e o contexto de execução. Os arquivos de imagem podem ser compartilhados com outras pessoas e carregados em máquinas ou plataformas diferentes. Isso permite que desenvolvedores colaborem facilmente num projeto ou distribuam aplicações feitas em Pharo
  • Vivo e imersivo, com feedback imediato em tempo de execução por meio de uma IDE específica do Pharo. Rode e altere o seu programa na hora, mesmo enquanto ele está rodando! Um depurador poderoso, que permite reiniciar métodos e corrigir bugs na hora

Tcl

  • Sistema de tipos direto: tudo é uma string. "Tudo é uma string" era como o Tcl costumava ser implementado. Agora, por baixo dos panos, existe um sistema de tipos robusto, no qual a entidade do Tcl (seja uma string, um número de ponto flutuante, uma lista, um dicionário) tem uma representação específica do tipo, além de uma representação como string. Isso melhora muito o desempenho do código Tcl, que não precisa mais converter de um lado para o outro a partir de strings.
  • "Tudo roda como comandos". Não existem comandos embutidos. O Tcl vem com uma "biblioteca padrão" de comandos, incluindo if e while, etc. É muito simples adicionar novos comandos de fluxo de controle, por exemplo um laço until. Também é fácil sobrescrever um comando do Tcl.
  • Por ser compacta, ter uma semântica simples e ser implementada como uma biblioteca em C, é fácil de embutir

Ballerina

  • Nativa da nuvem. Conversões integradas de JSON para tipos definidos pelo usuário. Sintaxe superleve para criar (micro)serviços. Execução concorrente de serviços integrada. Suporte a HTTP (1 e 2), GraphQL e gRPC prontos para usar
  • Gera automaticamente artefatos para publicar o seu código em diferentes nuvens. Esses artefatos podem ser Dockerfiles, imagens Docker, arquivos YAML do Kubernetes ou funções serverless.
  • Visualização integrada do código como diagramas de sequência. Ótimo para visualizar o fluxo do código. Pode até visualizar chamadas HTTP

Red

  • Ótima para construir e analisar Linguagens de Domínio Específico e seus "dialetos" (terminologia do Rebol). Vários dialetos integrados:
  • Red/System: uma linguagem de programação de sistemas de nível C, compilada para código nativo
  • Parse: um poderoso analisador PEG
  • VID: um dialeto simples para criar layouts de interface gráfica
  • Draw: um dialeto de desenho vetorial 2D
  • Rich-text: um dialeto de descrição de texto rico
  • Interfaces gráficas fáceis. Totalmente multiplataforma e nativas. Suporta vinculação bidirecional, atualização ao vivo, eventos e dá acesso aos recursos do sistema operacional

Qual(is) as pessoas deveriam experimentar em maio?

Todas são linguagens interessantes por si só, então dá para defender qualquer uma delas.

  • Se você se interessa por computação em nuvem, Ballerina e Unison são ótimas opções. O Tcl também tem ótimos recursos de concorrência
  • Se você já conhece programação orientada a objetos, mas quer ver uma abordagem diferente, experimente Pharo
  • Se você quer sentir como é programar numa linguagem que não é baseada em arquivos de texto, experimente o Pharo e sua IDE única e poderosa, ou o Unison com o Unison Codebase Manager.
  • Se você gosta de minimalismo, Tcl, Prolog, Pharo e Red têm todos pouca sintaxe e uma semântica relativamente simples
  • Se você quer ver uma mistura interessante de paradigmas, Ballerina, Tcl e Red suportam paradigmas diferentes
  • Se você quiser experimentar paradigmas mais incomuns, teste Prolog para Programação Lógica, Red para Programação Reativa e Ballerina para Programação Declarativa
  • Se você gosta de programação funcional, dê uma olhada no Unison, em especial nas suas Abilities.
  • Se você se interessa por metaprogramação, Tcl, Prolog, Pharo e Red têm ótimo suporte

Claro, se você tiver tempo, recomendo experimentar duas ou três! Todas são bem únicas. Resolva o mesmo exercício em duas ou três das linguagens em destaque e veja como a implementação é diferente.

01 de maio de 2023 · Achou útil?