A versão curta
Pense no Foglio como duas partes. A parte que você vê (janelas, menus, a grade de células) é feita com as ferramentas da própria Apple, então tem a aparência e o comportamento de qualquer outro app de Mac. A parte que faz as contas (ler arquivos, entender fórmulas, recalcular) é um motor separado escrito em Rust, uma linguagem que gera programas muito rápidos e compactos.
As duas partes conversam por uma interface pequena e simples. Não há nada no meio: nenhum navegador escondido, nenhuma máquina virtual, nenhum runtime para baixar. É por isso que o app inteiro baixa em 7,5 MB, abre em 0,24 s e precisa de cerca de 58 MB de memória com uma planilha vazia.
O app de Mac: Swift e AppKit
A interface é escrita em Swift sobre o AppKit, o framework por trás do Finder e da maioria dos apps do próprio Mac. Os documentos são documentos reais do macOS, então itens recentes, Salvar Como, Reverter, Duplicar, abas de janela, tela cheia, modo escuro, impressão e exportação em PDF funcionam como você espera.
A planilha em si é uma grade NSView própria, não um controle de tabela. Ela pede ao motor só as células visíveis, em lotes prontos para desenhar, o que mantém a rolagem suave mesmo com centenas de milhares de linhas. Gráficos, imagens e a barra de fórmulas também são desenhados pelo app.
O Foglio tem ainda seu próprio leitor de metarquivos EMF e WMF, o formato de imagem vetorial dos documentos antigos do Office (clip-arts, equações do MathType, diagramas do Visio colados). Imagens que outros apps de Mac mostram como caixas vazias aparecem direitinho e são salvas de volta sem alterações.
O motor: Rust e um IronCalc com correções
As fórmulas são interpretadas e calculadas pelo IronCalc, um motor de planilha de código aberto em Rust. O Foglio usa um fork do IronCalc 0.9.1 com correções, e cada mudança está marcada e documentada no repositório.
O fork adiciona recálculo incremental: quando você edita uma célula, só as fórmulas que dependem dela são recalculadas, e não a pasta de trabalho inteira. Numa pasta com 100.000 linhas e 300.000 fórmulas, uma edição leva 16 ms; um recálculo completo leva 64 ms.
Ele também adiciona buscas indexadas. A primeira busca com VLOOKUP, MATCH ou XLOOKUP num intervalo lê esse intervalo uma vez e monta um índice hash; as buscas seguintes são uma única consulta. 1.000 VLOOKUP exatos em 10.000 linhas passaram de 1.703 ms no IronCalc original para 1,3 ms no fork do Foglio. O fork também corrige uma dúzia de funções, de modo que 191 das 195 funções da auditoria de compatibilidade do Foglio batem com o Excel em todos os testes.
- Arquivos
.xlsantigos,.xlsbbinários e.odsdo LibreOffice são lidos com o calamine, um leitor rápido em Rust. - Arquivos CSV e TSV passam por um importador em Rust que detecta a codificação do texto, o delimitador e o separador decimal.
- Fórmulas digitadas em italiano, alemão, espanhol ou francês são convertidas para a forma padrão do Excel em inglês antes de serem gravadas. Em português, as funções já são digitadas em inglês.
A ponte: uma interface C simples
O motor em Rust é compilado como biblioteca estática e expõe uma pequena interface C (foglio_core.h): abrir e salvar um arquivo, editar uma célula, devolver um lote de células visíveis. O Swift chama essa interface diretamente por um bridging header. Não há bindings gerados, frameworks nem mensagens entre processos, então uma chamada ao motor custa mais ou menos o mesmo que uma chamada de função comum.
Sem projeto do Xcode
O Foglio é compilado com dois comandos: o cargo compila a biblioteca em Rust e o swiftc compila o app e faz a ligação. Um script de shell gera um app universal para Apple silicon e Intel e o empacota numa imagem de disco com o hdiutil da própria Apple. Você precisa das Command Line Tools do Xcode e do Rust; o Xcode completo não é necessário.
Menos camadas significam menos coisas para dar errado, compilações mais rápidas e um projeto que qualquer pessoa consegue ler de ponta a ponta.
Testado com eventos reais de teclado e mouse
O Foglio tem 69 testes de interface que controlam o app de verdade com eventos reais de teclado e mouse: digitar fórmulas, preencher intervalos, classificar, desfazer, salvar e reabrir arquivos. Os importadores de arquivo e o motor de fórmulas têm suas próprias suítes de testes em Rust, e um modo especial confere cada recálculo incremental contra um recálculo completo.
Por que isso deixa o Foglio pequeno e rápido
Um app em Electron carrega uma cópia completa do navegador Chromium, normalmente bem mais de 100 MB antes de fazer qualquer coisa. Uma suíte em Java ou multiplataforma carrega seu runtime e seu próprio toolkit de interface. O Foglio carrega só o próprio código e usa os frameworks que já existem em todo Mac.
O núcleo em Rust é compilado com otimização completa na ligação (LTO) e sem símbolos de depuração. O resultado é um app universal de cerca de 19 MB em disco, 7,5 MB como download compactado, que fica em 0 % de CPU em repouso.