26 pontos por GN⁺ 2025-07-14 | 3 comentários | Compartilhar no WhatsApp
  • Distribuir ferramentas como binários estáticos autônomos permite que os usuários as utilizem imediatamente, sem instalar um ambiente de desenvolvimento ou toolchain separado
  • O processo de compilação atua como uma camada extra de segurança, reduzindo a possibilidade de distribuir código com comportamento incorreto
  • Ferramentas baseadas em linguagens interpretadas trazem uma alta carga de manutenção, como instalação de várias dependências e desperdício de espaço em disco, além de reinstalações repetidas durante upgrades
  • Quanto mais dependências houver, maior será a superfície de ataque e a exposição a vulnerabilidades de segurança, facilitando o surgimento de riscos de invasão e problemas de manutenção
  • Binários estáticos baseados em linguagens compiladas não são afetados por mudanças no ambiente externo e, por isso, garantem uso estável mesmo após a distribuição

Vantagens de distribuir binários estáticos autônomos

Uso imediato sem instalação

  • Como no caso em que a Open AI reconstruiu o Codex em Rust e abandonou TypeScript, ao distribuir um binário único escrito em linguagem compilada, o usuário pode executá-lo imediatamente sem instalar toolchains adicionais
  • A maior vantagem não é velocidade ou eficiência, mas sim o fato de que a ferramenta pode ser usada imediatamente, sem instalação

Uma camada extra de segurança do compilador

  • As verificações feitas na etapa de compilação reduzem a chance de código defeituoso ser distribuído
  • Como exemplo, o Google Cloud CLI já foi distribuído em estado inutilizável várias vezes por ser baseado em Python
  • Se até equipes grandes têm dificuldade para evitar esse tipo de problema, para equipes pequenas é ainda mais difícil distribuir com estabilidade ferramentas baseadas em linguagens interpretadas

Não há necessidade de dependência de toolchain

  • Ferramentas baseadas em linguagens compiladas exigem apenas a distribuição de um único binário, enquanto ferramentas em linguagens interpretadas como Python, Ruby e TypeScript necessariamente precisam do respectivo ambiente de desenvolvimento
  • Como no caso do mdl (markdown linter), escrito em Ruby, a reinstalação passa a ser necessária sempre que o ambiente de desenvolvimento (Ruby) é atualizado
  • Ao usar o markdownlint baseado em JavaScript, é necessário instalar o npm e mais de 44 dependências

O problema do desperdício de espaço em disco

  • O popular assistente de programação FOSS aider é escrito em Python e, quando instalado via Homebrew, instala adicionalmente 51 pacotes
  • O uso real em disco aumenta em mais de 3 GiB, o que é maior do que o tamanho da maioria das distribuições Linux
  • Em contraste, o gerenciador de pacotes uv, escrito em Rust, pode ser instalado com apenas um binário único de 35 MiB, sem necessidade do próprio Rust nem do rustup

Aumento de vulnerabilidades de segurança

  • À medida que as dependências da ferramenta aumentam, também cresce a superfície de ataque e a possibilidade de exposição a vulnerabilidades de segurança
  • O pacote Codex da OpenAI tem 24 dependências diretas e 184 indiretas
  • Mesmo que a OpenAI audite todas as dependências, como as versões não estão fixadas, atualizações futuras podem causar problemas como vulnerabilidades, pacotes maliciosos ou quebra de funcionamento

Facilidade de manutenção

  • Ferramentas baseadas em linguagens interpretadas como JavaScript, TypeScript e Python deixam de funcionar se suas dependências forem removidas
  • Como no caso do left-pad, a exclusão de um único pacote pode paralisar serviços e ferramentas em larga escala
  • Linguagens compiladas só precisam de dependências no momento do build, então a ferramenta continua funcionando normalmente mesmo que repositórios externos desapareçam depois

Experiência do autor

  • O autor já criou ferramentas em Python no passado, como adb-enhanced, mas depois abriu o código de várias ferramentas em Go, como gabo e wp2hugo
  • Ele não considera mais desenvolver ferramentas autônomas com Python, TypeScript e afins
  • A recomendação é escrevê-las obrigatoriamente em linguagens que permitam distribuir binários com linkagem estática (Rust, Go, C++ etc.)

Conclusão

  • Ferramentas autônomas devem ser desenvolvidas em linguagens compiladas, como Rust, Go e C++
  • Elas devem ser distribuídas na forma de binários estáticos com o mínimo possível de dependências externas

3 comentários

 
rikko 2025-07-15

Não tem como não concordar bastante com a questão do desperdício de espaço em disco...
Opero AKS, e toda vez que vejo app em Python com imagem de contêiner passando de 1 GB fico com dor de cabeça.
Agora eu simplesmente pego o Dockerfile, reduzo o tamanho por conta própria e publico de novo; se não consigo baixar para menos de 500 MB, aí eu simplesmente desisto kkk

 
eususu 2025-07-15

Há pacotes em que a dependência de pytorch+cuda muda só de versão... é um verdadeiro espetáculo.
Nem tem grandes funcionalidades, mas para cada pequeno daemon são instalados quase 2 GB de dependências..

 
rikko 2025-07-15

Se for um runtime de CPU usado só para inferência simples, a situação até é um pouco melhor, mas com os serviços de LLM exigidos hoje em dia, tanto o tráfego quanto o volume aumentam demais, então dá vontade de xingar quando vai calcular os custos kkk