Como o Foglio é feito, e por que isso o deixa pequeno e rápido

A maioria dos apps de desktop modernos traz uma cópia de um navegador, um runtime Java ou um grande framework multiplataforma. O Foglio não traz nenhum deles. É um app nativo de Mac em Swift e AppKit, com o motor de planilha escrito em Rust e ligado diretamente ao app.

Esta página explica a arquitetura duas vezes: primeiro em palavras simples, depois com detalhes suficientes para um desenvolvedor se orientar no código-fonte.

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 .xls antigos, .xlsb binários e .ods do 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.

Perguntas frequentes

O Foglio é um app Electron ou web?

Não. É um app AppKit nativo escrito em Swift. Não há nenhum motor de navegador dentro dele.

Ele roda nativamente no Apple silicon?

Sim. O Foglio é um app universal com código nativo tanto para Apple silicon (arm64) quanto para Intel (x86_64).

Posso compilar o Foglio eu mesmo?

Sim. Instale as Command Line Tools do Xcode e o Rust e rode scripts/build.sh. O README traz os comandos exatos.

As mudanças no IronCalc são enviadas ao projeto original?

O fork é de código aberto sob as mesmas licenças do IronCalc, e cada mudança está marcada com um comentário Foglio fork: e descrita em third_party/README.md, para que possa ser revisada e reaproveitada.

Teste com as suas próprias planilhas

São 7,5 MB de download e não custa nada. O Foglio 1.0 é uma primeira versão, então guarde cópias de segurança dos arquivos importantes enquanto testa.

Baixar para MacVer o código no GitHub

Grátis · macOS 14+ · Apple silicon e Intel · 7,5 MB