Introdução
Olá a todos. Bem-vindos a dezembro. Espero que estejas bem.
Tivemos um outubro muito atarefado. Acabámos de lançar uma grande melhoria nas soluções da comunidade. Agora eliminamos as duplicadas, por isso as soluções semelhantes só aparecem uma vez, adicionámos novas opções de ordenação, a possibilidade de pesquisar por código e, se espreitares o C#, vais ver que também adicionámos a possibilidade de filtrar por diferentes conceitos de programação. Assim, podes procurar soluções que usem deslocamento de bits, recursividade ou qualquer outra coisa que te apeteça. Vamos alargar isso a outros percursos durante a semana da comunidade.
Mas, por agora, vamos concentrar-nos no #12in23. Novembro foi um mês interessante, a explorar linguagens assembly, mas este mês apostamos num conjunto muito diversificado de linguagens: ColdFusion, Groovy, Lua, VimScript e Wren. Como sempre, o Erik vai-nos explicar o que torna estas linguagens interessantes e únicas.
Os distintivos
Como sempre, podes ganhar o distintivo Diversões de dezembro completando 5 exercícios quaisquer nestas linguagens. Temos também o distintivo de Ano Inteiro, para o qual sei que muitos de vocês estão a trabalhar. Para esse, temos 5 exercícios em destaque para completares. São estes:
- Todas as tuas bases: converte um número, representado como uma sequência de algarismos, para outra base.
- Achatar array: pega numa coleção aninhada e devolve uma única coleção, sem aninhamento.
- Ataque da rainha: determina se duas rainhas num tabuleiro de xadrez podem atacar-se uma à outra.
- Personagem de D&D: gera aleatoriamente personagens de Dungeons & Dragons.
- Codificação run-length: implementa a codificação e a descodificação run-length.
Visão geral
ColdFusion
- Criada em 1995 pela Allaire Corporation, que foi comprada pela Macromedia em 2001 e que, por sua vez, foi comprada pela Adobe em 2005.
- Concebida como uma plataforma de desenvolvimento web rápido.
- Corre na Máquina Virtual Java (JVM).
- Existem duas sintaxes separadas, que parecem diferentes mas são semanticamente idênticas:
- A sintaxe de marcação mais antiga, baseada em etiquetas, que estende o HTML para mostrar conteúdo dinâmico.
- A sintaxe mais recente, semelhante a ECMAScript, pode ser usada onde a sintaxe baseada em etiquetas é usada, mas também em ficheiros de script separados. O objetivo era passar a lógica de negócio da marcação para um ficheiro de script separado.
- O CFScript é uma linguagem de uso geral que corre na JVM, e é assim que o Exercism a usa. Na prática, nunca se afastou muito das suas raízes de servidor web.
- O ColdFusion é um produto pago, mas a Lucee Foundation (uma organização sem fins lucrativos com sede na Suíça) continua a desenvolver ativamente o seu servidor ColdFusion de código aberto, cujo Lucee Server usamos no percurso do Exercism.
- Continua a ser desenvolvida ativamente.
- Usada sobretudo em software empresarial; entre os clientes estão a Apple, a Adobe e a General Motors, entre 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 é de tipagem estática) que também permitisse reduzir o código repetitivo.
- 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 criação de scripts, ferramentas de build (Gradle), CI (Jenkins), aplicações web (Grails), testes (Spock). Um popular complemento de terceiros para as ferramentas da Atlassian permite escrever scripts em Groovy.
Lua
- A Lua foi criada 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 pronuncia-se LOO-ah, que significa «lua» em português, e é uma referência à linguagem Sol, que a inspirou em parte e cujo nome significa «sol» em português.
- Concebida sobretudo para ser incorporada noutras aplicações, com foco na velocidade, na portabilidade, na extensibilidade e na facilidade de utilização durante o desenvolvimento.
- Influenciada por Modula, CLU, C++, SNOBOL e AWK. Tal como o LISP e o Scheme tinham um mecanismo único e omnipresente de estrutura de dados (a lista), a Lua tem isso com a sua tabela.
- Interpretada através de bytecode, habitualmente durante a execução, mas também pode ser compilada antecipadamente.
- Usada sobretudo para criação de scripts, por exemplo em jogos como World of Warcraft, Dota 2 e Crysis, ou em aplicações como o Adobe Lightroom e algum software de sistema do FreeBSD. Também é muito usada para acrescentar extensibilidade, por exemplo no Redis, no Neovim e no Nginx.
VimScript
- O VimScript (também chamado Vim Script (com um 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 uso geral, mas uma linguagem especializada que proporciona um ambiente de scripting eficaz e otimizado para estender e personalizar a funcionalidade do Vim através de plugins, configurações, macros e funções.
- Embora o Vim esteja escrito sobretudo em C, o Vimscript permite aos utilizadores personalizar e estender o Vim através de uma linguagem de scripting de alto nível.
- Usada no próprio Vim, claro, mas também no NeoVim, um fork do Vim.
Wren
- Escrita em 2016 por Bob Nystrom, o autor do livro Crafting Interpreters.
- Objetivos: pequena, simples, rápida.
- Concebida para ser incorporada noutras aplicações. O autor achou que as opções existentes (como a Lua e o TCL) eram insuficientes e queria uma linguagem simples e incorporável que fosse natural para quem tem experiência em programação orientada a objetos.
- Usada em:
- TIC-80, um computador de fantasia para criar, jogar e partilhar jogos minúsculos (semelhante ao PICO8).
- DOME, um framework multiplataforma para criar jogos.
- luxe, um motor de jogos multiplataforma de desenvolvimento rápido.
- Wren Console, um REPL e uma CLI do Wren escritos em grande parte no próprio Wren pelo Josh Goebel, contribuidor do Exercism há muito tempo, e que usamos no percurso do Wren.
E do ponto de vista da programação, em que diferem?
ColdFusion
- De tipagem dinâmica.
- Multiparadigma, sobretudo orientada a objetos, mas cada vez mais funcional.
Groovy
- Normalmente de tipagem dinâmica, mas também pode ser de tipagem estática (e de tipagem gradual).
- Pode ser interpretada e compilada (a partir da versão 2). É por isso que é frequentemente usada em scripts.
- Multiparadigma: sobretudo orientada a objetos, mas também imperativa, funcional e declarativa.
Lua
- De tipagem dinâmica e normalmente interpretada, mas pode ser pré-compilada.
- Multiparadigma: procedural, orientada a objetos (ainda que de forma um pouco diferente), funcional e orientada a dados.
VimScript
- De tipagem dinâmica e interpretada.
- Multiparadigma: imperativa, funcional e uma forma simples de programação orientada a objetos.
Wren
- De tipagem dinâmica, mas definida estaticamente; isso permite que o compilador seja muito rápido.
- Sobretudo uma linguagem orientada a objetos, mas também imperativa e com um pouco de programação funcional.
O que torna estas linguagens fantásticas?
ColdFusion
- Excelente separação entre a gestão do servidor e a criação de aplicações. A consola de administração configura as ligações à base de dados e a monitorização do servidor (e tudo o mais); quem cria as aplicações só precisa do nome de uma fonte de dados (um objeto CF com os métodos necessários, já ligado às partes certas do SGBD), mais acesso de escrita a uma pasta para os ficheiros da aplicação.
- Tira partido do poder da JVM e do ecossistema Java, o que inclui a possibilidade de importar qualquer biblioteca Java e usá-la dentro do ColdFusion.
Groovy
- Uso geral: pode ser usada para quase qualquer tipo de trabalho, incluindo aplicações e sites.
- Como corre na JVM, aplicam-se-lhe todos os seus benefícios: uma VM madura e de elevado desempenho e um enorme número de bibliotecas disponíveis. Interopera bem com Java.
- Alivia muitos dos problemas que as pessoas podem ter com o Java, como as exceções verificadas,
- a segurança em relação a null, a verbosidade e a falta de metaprogramação avançada.
- Linguagem moderna: inferência de tipos avançada, closures, sintaxe integrada para expressões regulares, geração automática de getters e setters.
- Excelente suporte para programação funcional: closures (como os blocos do Ruby), currying (aplicação parcial), avaliação preguiçosa, imutabilidade e muito mais.
Lua
- Uso geral: usada em sistemas embebidos, para prototipagem, criação de scripts, jogos, desenvolvimento web e de backend.
- Simples: relativamente pouca sintaxe, o que torna a linguagem fácil de aprender. Apenas alguns tipos de dados atómicos e um único tipo de dados compósito integrado: a tabela. A memória é gerida por um garbage collector.
- Portátil: o intérprete está escrito em ANSI C, para o qual existe um compilador em quase todas as plataformas.
VimScript
- Simples: sintaxe leve, fácil de aprender e de usar.
- Interoperabilidade: acede facilmente a ficheiros, shells e outros programas. Todo o poder das ferramentas externas sem sair do Vim.
- Expressiva: faz muito com pouco. Escreve scripts compactos e altamente legíveis.
- Motor de expressões regulares poderoso: a implementação de expressões regulares do Vimscript inspira-se na do Emacs Lisp, proporcionando uma ferramenta poderosa para a manipulação de texto.
Wren
- Pequena: a VM está implementada em menos de 4000 linhas de código.
- Exemplar: a implementação da VM está comentada com carinho, escrita em C e não é assim tão difícil de ler. Uma ótima forma de aprender a construir uma linguagem. A maior parte da biblioteca padrão está implementada em Wren, por isso também podes ver como isso é feito.
- Familiar: a sintaxe ajuda a apanhar o ritmo depressa. Se estás familiarizado com Java ou C++, vais sentir-te em casa. Permite sobrecarga de métodos por aridade.
- Documentação muito boa: a documentação da linguagem e da biblioteca padrão é fácil de ler, extensa e tem muitos exemplos.
- Uma biblioteca padrão pequena mas surpreendentemente completa.
Funcionalidades de destaque
ColdFusion
- Baterias incluídas: imensas coisas são integradas: trabalhar com PDF, ZIP, Excel, XML, JSON, criação de APIs, email, integração com o S3, muitas bases de dados diferentes... sem instalar pacotes extra. Ótimo para reduzir incompatibilidades de versões.
- Escalável e segura, ideal para software empresarial.
- Programação simples e intuitiva, o que significa que os novatos conseguem pôr páginas web complexas e orientadas a dados a funcionar muito depressa. A integração com o DreamWeaver é excelente.
Groovy
- Sintaxe flexível: os pontos e os parênteses podem ser omitidos, o que permite criar linguagens específicas de domínio muito agradáveis.
- Metaprogramação: suporta metaprogramação em tempo de execução e em tempo de compilação. Por exemplo, uma anotação @ToString gera uma implementação de ToString em tempo de compilação, e alterar a metaclasse de um objeto em tempo de execução permite fazer monkey-patching.
- Builders: trata e constrói JSON, XML e HTML rapidamente com código bonito. Constrói com Swing para um desenvolvimento rápido de interfaces gráficas.
- Traits: os traits do Groovy permitem compor comportamentos e propriedades em blocos reutilizáveis. Semelhantes aos mixins do Ruby.
Lua
- Incorporável: concebida 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 é deliberadamente mantida relativamente pequena, mas permite estender a linguagem com facilidade. Isso torna a linguagem mais simples de aprender, mais leve de incorporar e muito flexível.
- Rápida: a Lua é frequentemente uma das linguagens dinâmicas mais rápidas, sobretudo quando se usa o intérprete LuaJit.
VimScript
- Extensibilidade: o Vimscript permite-te estender o teu editor com novas funcionalidades.
- Personalizável: personaliza o teu editor para funcionar exatamente como gostas (os próprios plugins de Vimscript são escritos sobretudo em Vimscript).
- Orientado a eventos: execução automática de código com base em determinados eventos ou condições, como a abertura de ficheiros ou a gravação de buffers.
- Usa o poder do Vim: acesso integrado às funcionalidades e APIs do Vim, permitindo que os scripts manipulem texto, buffers, janelas e muito mais.
Wren
- Rápida: excelente desempenho para uma linguagem dinâmica.
- Incorporável: fácil de incorporar noutro software. O criador da linguagem foi programador de jogos: queria poder acrescentar capacidades de scripting aos jogos. A API em C é bastante limpa e simples.
- Concorrente: concorrência e corrotinas fáceis com fibras, que são uma construção muito leve (como as goroutines ou os processos Erlang) e podem comunicar facilmente entre si.
Qual escolher
- Se queres criar aplicações web, o ColdFusion e o Groovy são boas escolhas.
- Se te interessa uma linguagem que possa ser incorporada, a Lua e o 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 quiseres escrever scripts de uso geral.
- Se trabalhas com a JVM, o ColdFusion e o Groovy são escolhas naturais.
- Se valorizas o desempenho, a Lua e o Wren são provavelmente as tuas melhores opções.
- Se o teu editor principal é o Vim ou o NeoVim, o VimScript é obviamente uma excelente escolha.
- Se te interessa aprender sobre compiladores e máquinas virtuais, ou construir um, o Wren é perfeito para ti.
- Se tens experiência com programação orientada a objetos, o Wren é provavelmente a linguagem mais fácil de aprender.
- Se gostaste do design de estrutura de dados única e omnipresente do LISP, vai experimentar a Lua.
- Se queres experimentar programação orientada a eventos, dá uma olhadela ao VimScript.