A computação científica havia se acomodado em um fluxo de trabalho de duas linguagens: os pesquisadores faziam protótipos e análises em uma linguagem dinâmica como Python, MATLAB ou R, e depois reescreviam as partes lentas em C ou Fortran. Uma reportagem da Ars Technica de 2020 e sua discussão no Hacker News expuseram o custo dessa costura: a camada de script não consegue expressar alto desempenho, enquanto a camada rápida é penosa de escrever e difícil de manter.
A aposta do Julia era eliminar a costura por completo. Seu compilador usa inferência de tipos e um JIT construído sobre o LLVM para compilar cada função para os tipos concretos de argumentos com que ela é realmente chamada, de modo que uma linguagem dinâmica e de aparência matemática pode rodar perto de um C bem escrito. O despacho múltiplo — escolher um método por todos os tipos de argumentos, e não por um único receptor — permite que pacotes estendam as funções genéricas uns dos outros, e é assim que bibliotecas independentes se compõem em vez de cada uma embrulhar seu próprio núcleo em C.
Em 2020, o projeto já mostrava resultados de produção, não apenas benchmarks. A RelationalAI disse que seu banco de dados de grafo de conhecimento em nuvem era escrito 100% em Julia; a plataforma de modelagem Pumas estava sendo entregue a empresas farmacêuticas e usada em submissões à FDA; e comentaristas apontavam ecossistemas inteiros, de equações diferenciais a otimização matemática, em que as bibliotecas Julia haviam se tornado referência de excelência. A versão 1.5 era a atual, e os desenvolvedores do núcleo argumentavam que não houve mudanças realmente incompatíveis desde a 1.0.
Os críticos também tiveram sua vez: primeiros gráficos lentos e latência de inicialização, ferramentas imaturas e menos bibliotecas testadas em batalha do que Python. Os defensores responderam que o desenvolvimento iterativo com Revise.jl, somado à capacidade de corrigir um único ponto crítico com um único novo método, significava que o mesmo código servia tanto para exploração quanto para produção — o que era exatamente o objetivo do design.
Fazer a própria linguagem dinâmica compilar com velocidade nativa
Inferência de tipos mais especialização por JIT torna código genérico e expressivo rápido sem que o programador troque de dialeto para os caminhos críticos.
O despacho múltiplo permite que pacotes adicionem métodos às funções de outros pacotes, de modo que ecossistemas como solucionadores de EDO e otimização se compõem em vez de duplicar os núcleos em C uns dos outros.
Os cientistas mantêm o modelo mental do seu problema em vez de remodelá-lo primeiro para se ajustar a um paradigma de desempenho, cortando toda uma classe de bugs de reescrita.
Uma única base de código serve à exploração e à produção, de modo que o protótipo não pode se afastar do sistema que realmente roda.
Para eliminar uma etapa de reescrita, não construa uma ponte melhor entre duas linguagens; construa uma única linguagem cuja camada expressiva também seja sua camada de produção.
A reportagem da Ars Technica foi publicada em outubro de 2020 e sua thread no Hacker News atraiu 284 pontos com 212 comentários, com os próprios desenvolvedores do Julia participando do debate. A justificativa de design já havia sido registrada por seus autores no artigo de 2018 "Julia: Dynamism and Performance Reconciled by Design", e a thread de 2020 mostrou implantações na RelationalAI e na modelagem farmacêutica, e não apenas protótipos de pesquisa. Os tradeoffs apontados na thread — latência de inicialização, maturidade das ferramentas e cobertura de bibliotecas — permaneceram na agenda permanente do ecossistema.
CONFIRA AS EVIDÊNCIAS
As fontes
- The unreasonable effectiveness of the Julia programming language Ars Technica · arstechnica.com
- The unreasonable effectiveness of the Julia programming language (Hacker News discussion) Hacker News · news.ycombinator.com ·