Comment Foglio est conçu, et pourquoi il est si léger et rapide

La plupart des apps de bureau modernes embarquent une copie d'un navigateur web, un environnement Java ou un gros framework multiplateforme. Foglio n'embarque rien de tout cela. C'est une app Mac native en Swift et AppKit, avec un moteur de tableur écrit en Rust et lié directement à l'app.

Cette page explique l'architecture deux fois : d'abord simplement, puis avec assez de détails pour qu'un développeur s'y retrouve dans le code source.

La version courte

Voyez Foglio comme deux parties. Celle que vous voyez (fenêtres, menus, grille de cellules) est écrite avec les outils d'Apple, elle ressemble donc et se comporte comme toutes les autres apps Mac. Celle qui fait les calculs (lire les fichiers, comprendre les formules, recalculer) est un moteur séparé écrit en Rust, un langage qui produit des programmes très rapides et compacts.

Les deux parties communiquent par une petite interface toute simple. Rien entre les deux : pas de navigateur caché, pas de machine virtuelle, pas d'environnement d'exécution à télécharger. C'est pourquoi l'app entière pèse 7,5 Mo au téléchargement, se lance en 0,24 s et n'a besoin que d'environ 58 Mo de mémoire avec une feuille vide.

L'app Mac : Swift et AppKit

L'interface est écrite en Swift avec AppKit, le framework derrière le Finder et la plupart des apps d'Apple. Les documents sont de vrais documents macOS : éléments récents, Enregistrer sous, Revenir à, Dupliquer, onglets de fenêtre, plein écran, mode sombre, impression et export PDF fonctionnent comme vous l'attendez.

La feuille elle-même est une grille NSView sur mesure, pas un contrôle de tableau. Elle ne demande au moteur que les cellules visibles, par lots prêts à dessiner, ce qui garde un défilement fluide sur des feuilles de centaines de milliers de lignes. Les graphiques, les images et la barre de formule sont aussi dessinés par l'app.

Foglio contient aussi son propre lecteur de métafichiers EMF et WMF, le format d'images vectorielles des anciens documents Office (cliparts, équations MathType, diagrammes Visio collés). Les images que d'autres apps Mac affichent comme des cadres vides sont dessinées correctement et réenregistrées sans modification.

Le moteur : Rust et un IronCalc corrigé

Les formules sont analysées et évaluées par IronCalc, un moteur de tableur open source en Rust. Foglio utilise un fork corrigé d'IronCalc 0.9.1, où chaque modification est signalée et documentée dans le dépôt.

Le fork ajoute le recalcul incrémental : quand vous modifiez une cellule, seules les formules qui en dépendent sont recalculées, et non tout le classeur. Sur un classeur de 100 000 lignes et 300 000 formules, une modification prend 16 ms ; un recalcul complet prend 64 ms.

Il ajoute aussi les recherches indexées. La première RECHERCHEV, EQUIV ou RECHERCHEX sur une plage la lit une fois et construit un index de hachage ; les recherches suivantes ne demandent qu'une seule consultation. 1 000 RECHERCHEV exactes sur 10 000 lignes sont passées de 1 703 ms dans IronCalc d'origine à 1,3 ms dans le fork de Foglio. Le fork corrige aussi une douzaine de fonctions, si bien que 191 des 195 fonctions de l'audit de compatibilité de Foglio donnent le même résultat qu'Excel sur tous les tests.

  • Les anciens fichiers .xls, les .xlsb binaires et les .ods de LibreOffice sont lus avec calamine, un lecteur rapide en Rust.
  • Les fichiers CSV et TSV passent par un importateur en Rust qui détecte l'encodage du texte, le séparateur et le séparateur décimal.
  • Les formules saisies en français, en italien, en allemand ou en espagnol sont traduites dans la forme anglaise standard d'Excel avant d'être enregistrées.

Le pont : une simple interface C

Le moteur Rust est compilé en bibliothèque statique et expose une petite interface C (foglio_core.h) : ouvrir et enregistrer un fichier, modifier une cellule, renvoyer un lot de cellules visibles. Swift l'appelle directement via un en-tête de pont (bridging header). Pas de liaisons générées, pas de frameworks, pas de messages entre processus : un appel au moteur coûte à peu près autant qu'un appel de fonction ordinaire.

Pas de projet Xcode

Foglio se compile avec deux commandes : cargo compile la bibliothèque Rust et swiftc compile l'app et fait l'édition de liens. Un script shell produit une app universelle pour Apple silicon et Intel et l'emballe dans une image disque avec l'outil hdiutil d'Apple. Il vous faut les Command Line Tools de Xcode et Rust ; Xcode complet n'est pas nécessaire.

Moins de couches, c'est moins de choses qui peuvent casser, des compilations plus rapides et un projet que chacun peut lire de bout en bout.

Testé avec de vrais événements clavier et souris

Foglio compte 69 tests d'interface qui pilotent la vraie app avec de vrais événements clavier et souris : saisie de formules, recopie de plages, tri, annulation, enregistrement et réouverture de fichiers. Les importateurs de fichiers et le moteur de formules ont leurs propres suites de tests en Rust, et un mode spécial revérifie chaque recalcul incrémental par rapport à un recalcul complet.

Pourquoi Foglio est si léger et rapide

Une app Electron transporte une copie complète du navigateur Chromium, souvent bien plus de 100 Mo avant même de faire quoi que ce soit. Une suite Java ou multiplateforme transporte son environnement d'exécution et sa propre boîte à outils d'interface. Foglio ne transporte que son propre code et utilise les frameworks déjà présents sur chaque Mac.

Le cœur Rust est compilé avec optimisation complète à l'édition de liens et débarrassé des symboles de débogage. Résultat : une app universelle d'environ 19 Mo sur disque, 7,5 Mo en téléchargement compressé, qui reste à 0 % de CPU au repos.

Questions fréquentes

Foglio est-il une app Electron ou une app web ?

Non. C'est une app AppKit native écrite en Swift. Elle ne contient aucun moteur de navigateur.

Fonctionne-t-il nativement sur Apple silicon ?

Oui. Foglio est une app universelle avec du code natif pour Apple silicon (arm64) et Intel (x86_64).

Puis-je compiler Foglio moi-même ?

Oui. Installez les Command Line Tools de Xcode et Rust, puis lancez scripts/build.sh. Le README donne les commandes exactes.

Les modifications d'IronCalc sont-elles reversées au projet d'origine ?

Le fork est open source sous les mêmes licences qu'IronCalc, et chaque modification est marquée d'un commentaire Foglio fork: et décrite dans third_party/README.md, pour pouvoir être relue et réutilisée.

Essayez-le sur vos propres tableaux

7,5 Mo à télécharger, et c'est gratuit. Foglio 1.0 est une première version : gardez une copie de vos fichiers importants pendant que vous l'essayez.

Télécharger pour MacVoir le code source sur GitHub

Gratuit · macOS 14+ · Apple silicon et Intel · 7,5 Mo