La versión corta
Piensa en Foglio como dos piezas. La que ves (ventanas, menús, la cuadrícula de celdas) está hecha con las propias herramientas de Apple, así que se ve y se comporta como cualquier otra app de Mac. La que hace las cuentas (leer archivos, entender fórmulas, recalcular) es un motor aparte escrito en Rust, un lenguaje que produce programas muy rápidos y compactos.
Las dos piezas se comunican a través de una interfaz pequeña y sencilla. No hay nada en medio: ni navegador oculto, ni máquina virtual, ni runtime que descargar. Por eso toda la app es una descarga de 7,5 MB, se abre en 0,24 s y necesita unos 58 MB de memoria con una hoja vacía.
La app de Mac: Swift y AppKit
La interfaz está escrita en Swift sobre AppKit, el framework con el que están hechos el Finder y la mayoría de las apps del propio Mac. Los documentos son documentos reales de macOS, así que Abrir recientes, Guardar como, Volver a una versión, Duplicar, las pestañas de ventana, la pantalla completa, el modo oscuro, la impresión y la exportación a PDF funcionan como esperas.
La hoja en sí es una cuadrícula NSView propia, no un control de tabla. Solo pide al motor las celdas visibles, en lotes listos para dibujar, lo que mantiene fluido el desplazamiento en hojas con cientos de miles de filas. Los gráficos, las imágenes y la barra de fórmulas también los dibuja la app.
Foglio incluye además su propio reproductor de metarchivos EMF y WMF, el formato de imagen vectorial de los documentos de Office antiguos (imágenes prediseñadas, ecuaciones de MathType, diagramas de Visio pegados). Las imágenes que otras apps de Mac muestran como recuadros vacíos se dibujan bien y se guardan sin cambios.
El motor: Rust y un IronCalc con parches
Las fórmulas las analiza y evalúa IronCalc, un motor de hojas de cálculo de código abierto escrito en Rust. Foglio usa un fork de IronCalc 0.9.1 con parches, con cada cambio marcado y documentado en el repositorio.
El fork añade el recálculo incremental: cuando editas una celda, solo se recalculan las fórmulas que dependen de ella, no todo el libro. En un libro de 100.000 filas y 300.000 fórmulas, una edición tarda 16 ms; un recálculo completo, 64 ms.
También añade búsquedas indexadas. La primera BUSCARV, COINCIDIR o BUSCARX sobre un rango lo lee una vez y crea un índice hash; las búsquedas siguientes son una sola consulta. 1.000 BUSCARV exactas sobre 10.000 filas pasaron de 1.703 ms en el IronCalc original a 1,3 ms en el fork de Foglio. El fork corrige además una docena de funciones, de modo que 191 de las 195 funciones de la auditoría de compatibilidad de Foglio coinciden con Excel en todos los casos de prueba.
- Los
.xlsantiguos, los.xlsbbinarios y los.odsde LibreOffice se leen con calamine, un lector rápido en Rust. - Los archivos CSV y TSV pasan por un importador en Rust que detecta la codificación del texto, el delimitador y el separador decimal.
- Las fórmulas escritas en español, italiano, alemán o francés se traducen a la forma estándar de Excel en inglés antes de guardarse.
El puente: una interfaz C sencilla
El motor en Rust se compila como biblioteca estática y expone una pequeña interfaz C (foglio_core.h): abrir y guardar un archivo, editar una celda, devolver un lote de celdas visibles. Swift la llama directamente mediante un bridging header. No hay bindings generados, ni frameworks, ni mensajes entre procesos, así que una llamada al motor cuesta más o menos lo mismo que una llamada a una función normal.
Sin proyecto de Xcode
Foglio se compila con dos comandos: cargo compila la biblioteca en Rust y swiftc compila la app y la enlaza. Un script de shell genera una app universal para Apple silicon e Intel y la empaqueta en una imagen de disco con hdiutil, la herramienta de la propia Apple. Necesitas las Command Line Tools de Xcode y Rust; no hace falta Xcode completo.
Menos capas significa menos cosas que puedan fallar, compilaciones más rápidas y un proyecto que cualquiera puede leer de arriba abajo.
Probado con eventos reales de teclado y ratón
Foglio tiene 69 pruebas de interfaz que manejan la app real con eventos reales de teclado y ratón: escribir fórmulas, rellenar rangos, ordenar, deshacer, guardar y volver a abrir archivos. Los importadores de archivos y el motor de fórmulas tienen sus propias baterías de pruebas en Rust, y un modo especial vuelve a comprobar cada recálculo incremental frente a uno completo.
Por qué esto hace a Foglio pequeño y rápido
Una app Electron lleva una copia completa del navegador Chromium, normalmente bastante más de 100 MB antes de hacer nada. Una suite en Java o multiplataforma lleva su runtime y su propio sistema de interfaz. Foglio solo lleva su propio código y usa los frameworks que ya tiene cualquier Mac.
El núcleo en Rust se compila con optimización completa en tiempo de enlazado y sin símbolos de depuración. El resultado es una app universal de unos 19 MB en disco, 7,5 MB como descarga comprimida, que en reposo usa un 0 % de CPU.