Pular para o conteúdo

Incremental: computações que recalculam apenas o necessário

Pense numa planilha: você muda uma célula e só as fórmulas que dependem dela são recalculadas. Computação incremental é essa ideia aplicada a programas em geral. A pesquisa acadêmica tem décadas, e algumas implementações de produção estão documentadas. Aqui vai o que as fontes confirmam.

Adapton: a base acadêmica

O Adapton nasceu no artigo “Adapton: composable, demand-driven incremental computation”, de Matthew Hammer, Khoo Yit Phang, Michael Hicks e Jeffrey Foster (PLDI 2014). A execução do programa deixa um grafo do que foi nomeado, lido e demandado, e a próxima execução repara esse grafo em vez de refazer tudo. Nomes explícitos ajudam a reconhecer o que precisa ser recalculado, tema do artigo de 2015 “Incremental computation with names”. A implementação ativa citada no site é o Fumola, em Rust.

Incremental, da Jane Street

Em 2015, Yaron Minsky apresentou o Incremental, biblioteca em OCaml que ele compara a uma planilha sofisticada. Variáveis são os pontos de entrada, e as mudanças se propagam por um grafo acíclico. O recálculo só ocorre quando você chama stabilize. O custo por nó fica perto de 30 ns no laptop do autor. O grafo também pode mudar em tempo de execução, conforme os dados.

Salsa, no rust-analyzer

O Salsa é um framework Rust para computação incremental sob demanda. Os créditos citam como inspiração o Adapton, o Glimmer e o sistema de queries do compilador Rust. Ele trabalha com queries: entradas que você pode modificar e funções puras que memorizam o resultado e recalculam só quando preciso.

O rust-analyzer usa o Salsa. Num texto de 2023, matklad explica a “durable incrementality”: sem ela, editar um arquivo local obrigava a revalidar queries da biblioteca padrão, algo na casa de 300 ms. Com níveis de durabilidade, o Salsa evita revalidar o que não pode ter mudado. O texto completo está aqui, e ele não informa o tempo depois da otimização.

Turbopack

Em janeiro de 2026, o time do Next.js descreveu a arquitetura incremental do Turbopack. Ela rastreia automaticamente como as funções internas se chamam e de que valores dependem, usando “value cells”. Quando um arquivo muda, as funções que o leram são marcadas como sujas e recalculadas sob demanda. O post cita Salsa e Adapton entre as inspirações e diz que, até o Next.js 16.1, os caches ficavam só em memória. A partir dessa versão, o cache em sistema de arquivos para next dev é estável e ligado por padrão.

O mesmo texto admite o custo: caches exigem rastreamento e cópias de dados, e aplicados mal podem piorar o desempenho. Não é de graça.