- O núcleo da produtividade em programação está em um ecossistema rico de bibliotecas, mais do que na própria linguagem
- Frameworks como Ruby on Rails, que aproveitam recursos avançados da linguagem, oferecem alta produtividade até para não especialistas
- Porém, por causa das limitações estruturais da linguagem, é difícil implementar em Java ou C um framework no nível do Rails
- O projeto da linguagem determina diretamente a forma e a complexidade das bibliotecas que podem ser escritas, e esse é o propósito essencial da evolução das linguagens
- A linguagem Stanza, sob essa perspectiva, mostra a importância do projeto de linguagem para possibilitar a criação de bibliotecas poderosas e fáceis de usar
Relação entre linguagens de programação e bibliotecas
- A maioria das linguagens de programação tem elementos básicos semelhantes, como variáveis, arrays, loops e funções
- Algumas linguagens oferecem recursos avançados como funções de primeira classe ou corrotinas, mas não especialistas raramente os utilizam bem
- Para muitos desenvolvedores, o fator que aumenta a produtividade são as bibliotecas, mais do que a linguagem
- Por exemplo, Ruby on Rails permite criar com facilidade aplicações web baseadas em banco de dados
- Graças ao Rails, a preferência costuma ser maior pelo framework do que pela própria linguagem Ruby
Interação entre Ruby on Rails e recursos da linguagem
- Rails usa vários recursos do Ruby, como metaprogramação, avaliação em tempo de execução, funções de primeira classe e coleta de lixo
- Ex.: ActiveRecords usa metaprogramação, e o sistema de templates usa avaliação em tempo de execução
- O tratamento de eventos é implementado passando funções de primeira classe como callbacks
- Em Java ou C, a falta desses recursos torna impossível implementar um framework no nível do Rails
- A metaprogramação em Java não é poderosa o suficiente para implementar ActiveRecords
- Portanto, o Rails só é possível graças à estrutura da linguagem Ruby, e o projeto da linguagem determina as possibilidades das bibliotecas
O projeto da linguagem determina a forma das bibliotecas
- A linguagem C oferece reutilização apenas por meio de declaração e chamada de funções, então a maioria das bibliotecas em C assume a forma de conjuntos de funções
- Ruby oferece suporte a funções de primeira classe, permitindo expressar de forma concisa “a ação a executar quando o botão for clicado”
- Em Java, por outro lado, é preciso definir uma classe de handler, o que torna o código mais complexo
- O poder de expressão da linguagem define diretamente a estrutura e a usabilidade das bibliotecas
Software interativo e o surgimento de frameworks extensíveis
- Na computação em lote dos anos 1970, bibliotecas centradas em funções eram suficientes
- No software interativo moderno, são necessárias bibliotecas extensíveis
- Em GUIs e sistemas orientados a eventos, exige-se uma estrutura do tipo “executar meu código quando o usuário clicar”
- Java e C++ oferecem extensibilidade por meio de herança e sobrescrita de métodos, e essa estrutura evoluiu para frameworks
Contexto do projeto do Stanza e limites das linguagens
- A motivação para o projeto do Stanza começou com a dificuldade de escrever em Java uma biblioteca de programação de jogos fácil de usar
- Em Java, era preciso expressar concorrência como uma máquina de estados (state machine)
- Scheme oferece suporte a continuation, permitindo uma implementação mais intuitiva
- Porém, Scheme não oferece verificação estática de tipos, o que reduz a eficiência da depuração
- Hoje, a maioria das linguagens ainda não permite estender o sistema de tipos por meio de bibliotecas
- Stanza oferece sistema de tipos opcional, coleta de lixo e sistema de objetos baseado em multimétodos
- No entanto, não é possível escrever do zero um novo sistema de objetos definido pelo usuário
O propósito das linguagens e direções de pesquisa
- O objetivo de uma linguagem de programação de propósito geral é dar suporte à criação de bibliotecas poderosas e fáceis de usar
- Quanto mais poderosa a linguagem, mais conciso se torna o uso das bibliotecas
- Quando o código usa uma biblioteca bem projetada, ele tem uma naturalidade que lembra frases dirigidas a um colega
- Racket, Shen e pesquisas sobre protocolos de metaobjetos exploram sistemas extensíveis de tipos e objetos
- Em última instância, as linguagens se distinguem por “quais bibliotecas é possível usar e quais não é”
- Por trás de bibliotecas elegantes existem décadas de pesquisa e esforço de projeto de linguagens
1 comentários
Comentários no Hacker News
O melhor exemplo é Prolog. Costuma ser chamado de linguagem representativa da programação lógica, mas na prática não passa de uma coleção de algoritmos, e poderia ser implementado como biblioteca em várias linguagens. Acho que bastaria oferecer a forma sintática do Prolog adaptada à sintaxe de cada linguagem
Há 10 anos eu era fã de Scala. O conceito de “Scalable Language”, de poder criar DSLs dentro do sistema de tipos, era atraente. Mas perdi o interesse quando a comunidade começou a usá-la como se fosse um Haskell sobre a JVM. Hoje tenho expectativa de que tecnologias como WASM ou Graal tragam mais flexibilidade na escolha de linguagens. Muitas vezes JS já basta, mas é bom ter a opção de usar uma linguagem de baixo nível como Rust quando necessário
Seria ótimo poder substituir o bash por uma linguagem de script com tipos. Fiz um script simples de parser de JSON em Elixir e ficou bem legal
#!/usr/bin/env ocaml. Só não tem um recurso para instalar automaticamente dependências externas a partir de um único arquivoLinguagem e biblioteca não são mutuamente exclusivas. Algumas bibliotecas na prática funcionam como linguagens, e por outro lado há linguagens projetadas para certas bibliotecas. Julia, por exemplo, é um bom caso de equilíbrio entre desempenho e usabilidade. Dá para escrever diretamente código de alto desempenho em Julia e obter execução otimizada por meio de compilação com especialização de tipos em nível de JIT. O modelo de chamada de função é simples, mas por dentro o funcionamento é muito sofisticado
Raku foi projetada como uma estrutura que conecta várias sublinguagens (slangs). Por exemplo, regex, PEG e quoting são tratados como minilinguagens separadas, e com Slangify você pode adicionar sua própria DSL com facilidade
Um desenvolvedor sênior disse certa vez: “se vejo Rails no currículo, jogo fora na hora”. Isso me fez perceber de novo como é tolo julgar pessoas pela linguagem
No fim, linguagens e bibliotecas são meios de comunicação com máquinas e com pessoas. As máquinas se comunicam com bits e voltagens; as pessoas, com intenções e conceitos. Portanto, se uma linguagem ou biblioteca oferece às pessoas uma forma clara e rápida de expressar algo, pouco importa se isso é linguagem ou biblioteca. Rails ou Stanza, se serve ao propósito e a equipe entende com facilidade, então essa é a escolha certa
Eu penso que “a biblioteca é a linguagem final”. Por exemplo, Ruby on Rails é uma ótima linguagem para serviços web baseada em Ruby. Ruby e Rails evoluíram um em função do outro. No fim, vejo a programação como um processo contínuo de tradução entre linguagens
É verdade que “quanto mais poderosa a linguagem, mais fácil fica usar bibliotecas”. Antigamente, em Java era difícil criar um framework como Express
Se for para falar de framework web para a linguagem C, então não seria PHP? ;)