CCSVFFIPHPRustZigPerformance

Pourquoi j’ai créé FastCSV-C : simplifier le CSV entre langages

14 juillet 2025

Pendant des années, le CSV en Python et PHP m’a causé des cauchemars — sur de nombreux projets réels. Voici pourquoi j’ai créé FastCSV-C : une bibliothèque CSV rapide et memory-safe en C, intégrable dans n’importe quel langage. Leçons sur FFI, mémoire et performance.

Pendant des années, le CSV en Python et PHP m’a causé des cauchemars — sur de nombreux projets réels. Certes, il existe des packages. Mais souvent lents, fuites mémoire, blocage sur les cas limites, ou corruption silencieuse à cause des quirks d’encodage.

Je ne voulais plus réécrire la même logique CSV encore et encore.
Je voulais quelque chose de plus rapide, plus sûr et plus simple — une bibliothèque de confiance, branchable dans n’importe quel runtime sans la surcharge du haut niveau.

C’est exactement pour ça que j’ai créé FastCSV-C :
Une bibliothèque CSV rapide et memory-safe en C, conçue pour être embarquée dans PHP, Python, Go, ou tout langage qui parle à C.


Le problème : le CSV est simple — jusqu’à ce qu’il ne le soit plus

Le CSV devrait être facile. En pratique, c’est le bordel :

  • Retours à la ligne dans les champs quotés
  • Fichiers UTF-8 cassé ou délimiteurs mixtes
  • Gros fichiers qui mangent la mémoire ou crashent en cours de route
  • Quirks spécifiques aux langages qui cassent la portabilité cross-platform

Pire encore, la surcharge des langages haut niveau (PHP ou Python) peut être rédhibitoire. Vous gérez la logique dans la couche app, ce qui ralentit tout — surtout en lisant ou écrivant beaucoup de petites lignes.


La vision : un moteur central qui marche partout

Mon objectif était clair :

✅ Rapide : Streamer des fichiers massifs avec peu de mémoire
✅ Sûr : Pas de fuites, pas de sortie corrompue, pas de devinettes
✅ Embarquable : Utilisable depuis n’importe quel langage — PHP, Python, Go, etc.
✅ Conscient des standards : Gérer le bizarre du CSV réel, tout en restant proche de RFC 4180

Je ne voulais pas construire « encore un parser CSV » — je voulais rapprocher la logique du runtime, pour que le code applicatif reste propre et rapide.


Pourquoi pas Rust ou Zig ?

Bonne question. J’ai commencé là. J’ai écrit tout un article (Why I Tried Writing a PHP Extension in Rust or Zig), mais en version courte :

⚠️ La surcharge FFI tue les perfs pour les petites opérations fréquentes
⚠️ Les build systems peuvent être difficiles à intégrer avec des écosystèmes comme PHP, qui ont leurs workflows matures (parfois rigides) de construction d’extensions.
⚠️ La memory safety n’est pas gratuite quand on traverse la frontière de langage
⚠️ Ironiquement, C était plus rapide et plus simple bien utilisé

Ce n’est pas un article sur pourquoi je n’ai pas utilisé Zig ou Rust — cette histoire est ailleurs.
Cet article explique pourquoi je suis revenu à C et ce que j’ai appris en construisant quelque chose d’utilisable, rapide et propre à travers les frontières de langages.


Présentation de FastCSV-C

FastCSV-C est une bibliothèque CSV minimale et efficace en C, avec des API propres et une gestion mémoire custom via arenas (memory pools). Elle est conçue pour :

🧠 Prévenir les fuites mémoire avec des arenas à portée
⚡ Streamer efficacement sans gaspiller la mémoire
🔌 Se connecter facilement à tout langage via C FFI
📚 Rester documentée et lisible (la doc s’améliore, promis !)

Exemple d’utilisation

#include "csv_writer.h"
#include "arena.h"
#include "csv_config.h"

int main() {
    Arena arena;
    arena_create(&arena, 1024 * 1024); // 1MB arena

    CSVConfig *config = csv_config_new(&arena);
    csv_config_set_path(config, "output.csv");
    csv_config_set_delimiter(config, ',');

    char *headers[] = {"name", "age", "city"};
    CSVWriter *writer = NULL;
    csv_writer_init(&writer, config, headers, 3, &arena);

    char *row1[] = {"Alice", "30", "New York"};
    csv_writer_write_record(writer, row1, 3);

    char *row2[] = {"Bob Smith", "25", "Los Angeles"};
    csv_writer_write_record(writer, row2, 3);

    csv_writer_free(writer);
    arena_destroy(&arena);
    return 0;
}

Pensé pour les extensions : PHP, Python et plus

Comme FastCSV-C est écrit en C moderne et plain, il peut s’intégrer dans presque n’importe quel runtime avec une surcharge minimale.

L’extension PHP sur laquelle je travaille (article séparé à venir) n’est qu’une fine couche sans perte de vitesse — et des wrappers similaires sont faciles pour d’autres langages.


Ce que j’ai appris

🧠 Le code haut niveau ne devrait pas porter le fardeau bas niveau : la logique CSV appartient au moteur, pas aux scripts
🧱 C est puissant bien utilisé : avec arenas et API propres, ce n’est pas effrayant
🔧 L’API doit sembler native : simple et ergonomique à wrapper
🚫 Éviter la sur-ingénierie : pas de macros, pas de templates, juste un cœur propre


Essayer

Si vous en avez marre de vous battre avec le CSV dans votre logique applicative — surtout multi-plateformes — FastCSV-C est pour vous. Ce n’est pas magique. C’est du C propre qui fait bien son job.

« J’ai construit la bibliothèque CSV que j’aurais voulu avoir il y a des années — peut-être que d’autres n’auront plus à souffrir pareil. »

Tous les articles
Liens

À lire aussi

mars 2025

Laravel devient-il trop complexe ? Impact sur les développeurs et les entreprises

Laravel a beaucoup évolué, avec des outils comme Livewire, Inertia.js et Filament. Ces innovations apportent de la valeur, mais soulèvent aussi des questions sur la complexité, la maintenabilité et la stabilité à long terme. Cet article explore l’impact sur les juniors, les seniors et les dirigeants.