Introdução
Oi, pessoal. Bem-vindos a dezembro. Espero que vocês estejam bem.
Tivemos um outubro super agitado. Acabamos de lançar uma grande melhoria nas soluções da comunidade. Agora removemos as duplicatas, então as soluções parecidas aparecem só uma vez; adicionamos novas opções de ordenação, a possibilidade de buscar por código e, se você olhar o C#, vai ver que também adicionamos a possibilidade de filtrar por diferentes conceitos de programação. Assim você pode procurar soluções que usam deslocamento de bits, recursão ou qualquer outra coisa que você quiser. Vamos liberar isso para outras trilhas na semana da comunidade.
Mas por enquanto, vamos focar no #12in23. Novembro foi um mês interessante, explorando linguagens de montagem, mas este mês vamos partir para um conjunto bem diverso de linguagens, especificamente ColdFusion, Groovy, Lua, VimScript e Wren. Como sempre, o Erik vai nos contar o que torna essas linguagens interessantes e únicas.
As medalhas
Como sempre, você pode ganhar a medalha Diversões de Dezembro completando 5 exercícios quaisquer nessas linguagens. Também temos a medalha de Ano Inteiro, que eu sei que muitos de vocês estão buscando. Para ela, temos 5 exercícios em destaque para você completar. São eles:
- Tudo na Sua Base: converta um número, representado como uma sequência de dígitos, para outra base.
- Achatar Array: pegue uma coleção aninhada e retorne uma única coleção, não aninhada.
- Ataque da Rainha: determine se duas rainhas em um tabuleiro de xadrez podem atacar uma à outra.
- Personagem de D&D: gere personagens de Dungeons & Dragons aleatoriamente.
- Codificação Run-Length: implemente a codificação e a decodificação run-length.
Visões gerais
ColdFusion
- Criada em 1995 pela Allaire Corporation, que foi comprada pela Macromedia em 2001 e, por sua vez, comprada pela Adobe em 2005.
- Projetada como uma plataforma de desenvolvimento web rápido
- Roda na Java Virtual Machine (JVM)
- Existem duas sintaxes separadas, que parecem diferentes mas são semanticamente idênticas:
- A sintaxe de marcação mais antiga, baseada em tags, que estende o HTML para exibir conteúdo dinâmico.
- A sintaxe mais nova, parecida com ECMAScript, pode ser usada onde a sintaxe baseada em tags é usada, mas também em arquivos de script separados. O objetivo era mover a lógica de negócios da marcação para um arquivo de script separado
- CFScript é uma linguagem de propósito geral que roda na JVM, e é assim que o Exercism a usa. Na prática, ela nunca se afastou muito de suas raízes de servidor web.
- ColdFusion é um produto pago, mas a Lucee Foundation (uma organização sem fins lucrativos sediada na Suíça) ainda desenvolve ativamente o seu servidor ColdFusion de código aberto, cujo Lucee Server usamos para a trilha do Exercism.
- Ainda em desenvolvimento ativo
- Usada principalmente em software corporativo; entre os clientes estão Apple, Adobe, General Motors e outros
Groovy
- Desenvolvida por James Strachan a partir de 2003. O projeto foi adotado pela Apache em 2015.
- O objetivo era desenvolver uma linguagem de tipagem dinâmica na JVM (em contraste com o Java, que é estaticamente tipado) que também reduzisse código boilerplate
- Embora a maior parte do código Java também seja código Groovy válido, há muitas diferenças (por exemplo, o Groovy permite tipagem dinâmica e metaprogramação avançada). A linguagem também foi muito influenciada por Python e Ruby.
- Usada para scripting, ferramentas de build (Gradle), CI (Jenkins), aplicações web (Grails) e testes (Spock). Um popular complemento de terceiros para ferramentas da Atlassian permite scripting em Groovy.
Lua
- O Lua foi criado em 1993 por Roberto Lerusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes na Pontifícia Universidade Católica do Rio de Janeiro, no Brasil.
- O nome é pronunciado LOO-ah, que significa Lua em português, e é uma referência à linguagem Sol, pela qual foi parcialmente inspirada, e que significa "Sol" em português
- Projetada principalmente para incorporação, com foco em velocidade, portabilidade, extensibilidade e facilidade de uso no desenvolvimento.
- Influenciada por Modula, CLU, C++, SNOBOL e AWK. Assim como LISP e Scheme tinham um único mecanismo de estrutura de dados onipresente (a lista), o Lua tem isso com a sua tabela.
- Interpretada via bytecode, geralmente durante a execução, mas pode ser feita antecipadamente.
- Usada principalmente para scripting, por exemplo, em jogos como World of Warcraft, Dota 2 e Crysis, ou em aplicações como o Adobe Lightroom e alguns softwares de sistema do FreeBSD. Também é muito usada para adicionar extensibilidade, por exemplo, no Redis, Neovim e Nginx.
VimScript
- VimScript (também chamada de Vim Script, com espaço, ou VimL, de Vim Language) é a linguagem de scripting usada no editor de texto Vim.
- Derivada do ex, o editor visual orientado a linhas que precedeu o Vi
- Não é uma linguagem de propósito geral, mas uma linguagem especializada que oferece um ambiente de scripting eficaz e otimizado para estender e personalizar a funcionalidade do Vim por meio de plugins, configurações, macros e funções.
- Embora o Vim seja escrito principalmente em C, o Vimscript permite que os usuários personalizem e estendam o Vim por meio de uma linguagem de scripting de alto nível.
- Usada no... bem, no Vim, mas também no NeoVim, um fork do Vim
Wren
- Criada em 2016 por Bob Nystrom, o autor do livro Crafting Interpreters
- Objetivos: pequena, simples, rápida.
- Projetada para ser incorporada em outras aplicações. O autor considerou as opções existentes (como Lua e TCL) insuficientes e queria uma linguagem simples e incorporável que parecesse natural para quem tem experiência com orientação a objetos
- Usada em:
- TIC-80: um computador fantasia para criar, jogar e compartilhar joguinhos (parecido com o PICO8)
- DOME: um framework multiplataforma para criar jogos.
- luxe: uma engine de jogos multiplataforma e de desenvolvimento rápido para criar jogos.
- Wren Console: um REPL e CLI do Wren escrito em grande parte no próprio Wren por Josh Goebel, colaborador de longa data do Exercism, e que usamos para a trilha do Wren
E do ponto de vista da programação, como elas se diferenciam?
ColdFusion
- Tipagem dinâmica
- Multiparadigma, principalmente POO, mas cada vez mais funcional.
Groovy
- Geralmente com tipagem dinâmica, mas também pode ter tipagem estática (e tipagem gradual)
- Pode ser tanto interpretada quanto compilada (a partir da versão 2). Por isso, é muito usada em scripts
- Multiparadigma: principalmente orientada a objetos, mas também imperativa, funcional e declarativa.
Lua
- Tipagem dinâmica e geralmente interpretada, mas pode ser pré-compilada
- Multiparadigma: procedural, orientada a objetos (ainda que de um jeito um pouco diferente), funcional e orientada a dados
VimScript
- Tipagem dinâmica e interpretada
- Multiparadigma: imperativa, funcional e uma forma simples de programação orientada a objetos
Wren
- Tipagem dinâmica, mas definida estaticamente; permite que o compilador seja muito rápido.
- Principalmente uma linguagem orientada a objetos, mas também imperativa e com um pouco de programação funcional
O que faz essas linguagens serem ótimas?
ColdFusion
- Excelente separação entre o gerenciamento do servidor e a criação da aplicação. O console de administração configura as conexões de banco de dados e o monitoramento do servidor (e qualquer outra coisa); quem cria a aplicação só precisa do nome de uma fonte de dados (um objeto CF com os métodos necessários, já pré-conectado às partes apropriadas do SGBD), além de acesso de escrita a um diretório para os arquivos da aplicação.
- Aproveita o poder da JVM e do ecossistema Java, o que inclui poder importar qualquer biblioteca Java e usá-la dentro do CF
Groovy
- Propósito geral: pode ser usada para quase qualquer tipo de carga de trabalho, incluindo aplicativos e sites.
- Rodando na JVM, todos os seus benefícios se aplicam: VM madura, de alto desempenho e com um número enorme de bibliotecas disponíveis. Interopera bem com Java
- Alivia muitos dos problemas que as pessoas podem ter com Java, como exceções verificadas,
- segurança contra null, verbosidade e falta de metaprogramação avançada
- Linguagem moderna: inferência de tipos avançada, closures, sintaxe nativa para expressões regulares, geração automática de getters e setters
- Ótimo suporte a programação funcional: closures (como os blocos do Ruby), currying (aplicação parcial), avaliação preguiçosa, imutabilidade e muito mais
Lua
- Propósito geral: usada em sistemas embarcados, para prototipagem, scripting, desenvolvimento de jogos, web e backend.
- Simples: relativamente pouca sintaxe, o que torna a linguagem fácil de aprender. Apenas alguns tipos de dados atômicos e apenas um tipo de dado composto nativo: a tabela. A memória é coletada automaticamente
- Portável: o intérprete é escrito em ANSI C, para o qual existe um compilador para quase qualquer plataforma
VimScript
- Simples: sintaxe leve, fácil de aprender e usar.
- Interoperabilidade: acesse facilmente arquivos, shells e outros programas. Todo o poder de ferramentas externas sem sair do Vim.
- Expressiva: faça muito com pouco. Escreva scripts compactos e altamente legíveis.
- Engine de regex poderosa: a implementação de regex do Vimscript é inspirada na do Emacs Lisp, oferecendo uma ferramenta poderosa para manipulação de texto.
Wren
- Pequena: a VM é implementada em menos de 4000 linhas de código
- Exemplar: a implementação da VM é comentada com carinho, escrita em C e não é tão difícil de ler. Uma ótima forma de aprender a construir uma linguagem. A maior parte da biblioteca padrão é implementada em Wren, então você também pode ver como ela foi implementada.
- Familiar: a sintaxe ajuda você a pegar o jeito mais rápido. Se você já conhece Java ou C++, vai se sentir em casa. Permite sobrecarga de métodos por aridade
- Documentação realmente boa: a documentação da linguagem e da biblioteca padrão é fácil de ler, extensa e cheia de exemplos.
- Biblioteca padrão pequena, mas surpreendentemente completa.
Recursos de destaque
ColdFusion
- Tudo já vem incluso: um monte de coisas é nativo: trabalhar com PDF, ZIP, Excel, XML, JSON, criação de API, e-mail, integração com S3, muitos bancos de dados diferentes… sem instalar pacotes extras. Ótimo para reduzir incompatibilidades de versão
- Escalável e segura, ótima para software corporativo
- Programação simples e intuitiva, o que significa que iniciantes conseguem colocar páginas web complexas e orientadas a dados no ar muito rápido. A integração com o DreamWeaver é excelente.
Groovy
- Sintaxe flexível: pontos e parênteses podem ser omitidos, o que permite criar linguagens de domínio específico bem elegantes
- Metaprogramação: dá suporte tanto a metaprogramação em tempo de execução quanto em tempo de compilação. Por exemplo, uma anotação @ToString vai gerar uma implementação de ToString em tempo de compilação, e mudar a metaclasse de um objeto em tempo de execução permite fazer monkey-patching.
- Builders: lide e construa rapidamente JSON, XML e HTML com um código bonito de se ver. Construa com Swing para desenvolvimento rápido de GUI.
- Traits: as Traits do Groovy permitem compor comportamentos e propriedades em blocos reutilizáveis. Parecido com os mixins do Ruby.
Lua
- Incorporável: projetada para ser fácil de incorporar. Tem uma API em C relativamente simples que facilita a incorporação. O tamanho não é problema: o intérprete de referência completo tem apenas 247 kB!
- Extensível: a linguagem base é propositalmente mantida relativamente pequena, mas o que ela permite é estender a linguagem facilmente. Isso torna a linguagem mais simples de aprender, mais leve de incorporar e muito flexível
- Rápida: o Lua costuma ser uma das linguagens dinâmicas mais rápidas, especialmente ao usar o intérprete LuaJit
VimScript
- Extensibilidade: o Vimscript permite estender seu editor com novas funcionalidades
- Personalizável: personalize seu editor para funcionar do jeito que você gosta (os próprios plugins de Vimscript são escritos principalmente em Vimscript)
- Orientada a eventos: execução automática de código com base em certos eventos ou condições, como abrir arquivos ou salvar buffers.
- Use o poder do Vim: acesso nativo aos recursos e APIs do Vim, permitindo que os scripts manipulem texto, buffers, janelas e muito mais.
Wren
- Rápida: ótimo desempenho para uma linguagem dinâmica
- Incorporável: fácil de incorporar em outros softwares. O criador da linguagem foi desenvolvedor de jogos: queria poder adicionar recursos de scripting aos jogos. A API em C é bem limpa e simples.
- Concorrente: concorrência fácil e corrotinas com fibers, que são uma construção muito leve (como goroutines ou processos do Erlang) e conseguem se comunicar facilmente entre si
Qual escolher
- Se você quer criar aplicações web, ColdFusion e Groovy são boas escolhas
- Se você tem interesse em uma linguagem que possa ser incorporada, Lua e Wren são as principais opções, mas o Groovy também pode valer a pena
- As mesmas três linguagens, Lua, Wren e Groovy, também fazem sentido se você quiser escrever scripts de propósito geral
- Se você trabalha com a JVM, ColdFusion e Groovy são escolhas naturais
- Se você valoriza desempenho, Lua e Wren provavelmente são suas melhores opções
- Se seu editor principal é o Vim ou o NeoVim, o VimScript é obviamente uma excelente escolha
- Se você tem interesse em aprender sobre compiladores e máquinas virtuais, ou em construir um, o Wren é perfeito para você
- Se você tem experiência com orientação a objetos, o Wren provavelmente é a linguagem mais fácil de aprender
- Se você gostou do design de estrutura de dados única e onipresente do LISP, vá experimentar o Lua
- Se você quer experimentar programação orientada a eventos, dê uma olhada no VimScript