Résolution élégante du problème de l'expression : envoi multiple et méthodes ouvertes

2025-09-07

Cet article explore le « problème de l'expression », un défi qui touche à la fois la programmation orientée objet et la programmation fonctionnelle : ajouter de nouveaux types de données et des opérations sans modifier le code existant. À l'aide d'exemples en C++ et en Haskell, l'auteur illustre le cœur du problème. La POO traditionnelle a du mal à étendre les types et les opérations simultanément, et la programmation fonctionnelle rencontre des limitations similaires. L'article analyse en profondeur le modèle visiteur et ses extensions, puis utilise les multimethods et les protocoles de Clojure pour montrer comment l'envoi multiple et les méthodes ouvertes résolvent élégamment le problème de l'expression, permettant un code flexible et extensible.

Lire plus
Développement envoi multiple

Le Problème de l'Expression : Solutions Élégantes en POO et FP

2025-09-07

Cet article explore le « problème de l'expression » en conception logicielle : comment ajouter de nouveaux types de données et des opérations sans modifier le code existant. L'auteur utilise des exemples en C++ et Haskell pour illustrer les limites de la programmation orientée objet et fonctionnelle pour résoudre ce problème. L'article explore ensuite des solutions élégantes utilisant le modèle visiteur et les multimethods et protocoles de Clojure. L'approche de Clojure tire parti intelligemment de la puissance des méthodes ouvertes, en séparant les définitions des méthodes des définitions des types, ce qui permet une extension flexible sans modifier le code existant.

Lire plus

Forth revisité : deux implémentations et réflexions sur un langage original

2025-08-28

L'auteur revient sur le langage Forth, rencontré pour la première fois il y a 20 ans. En deux mois, il a implémenté deux interpréteurs Forth : goforth (en Go) et ctil (en C). goforth, un interpréteur pur, est simple mais manque de fonctionnalités avancées. ctil, plus proche d'une implémentation Forth traditionnelle, permet d'étendre le langage en utilisant Forth lui-même, démontrant sa puissance. L'auteur soutient que les forces uniques de Forth résident dans son contexte matériel ancien. Cependant, son modèle basé sur la pile le rend moins lisible et moins pratique dans les contextes modernes, il est donc plus adapté comme projet d'apprentissage pour comprendre les principes des compilateurs et des machines virtuelles.

Lire plus

Algorithme d'unification : implémentation et applications

2025-08-18

Cet article explore l'algorithme d'unification, un processus permettant de résoudre automatiquement les équations entre termes symboliques. Il est largement utilisé dans la programmation logique et l'inférence de types. En commençant par la correspondance de motifs, l'article développe le concept d'unification et fournit une implémentation Python basée sur l'algorithme amélioré de Norvig. L'implémentation inclut les définitions des structures de données, la fonction principale `unify`, les fonctions auxiliaires `unify_variable` et `occurs_check`, ainsi que des exemples de code détaillés et les résultats de l'exécution.

Lire plus
Développement

Le Lien Élégant entre la Multiplication des Polynômes, la Convolution et le Traitement du Signal

2025-05-21

Cet article explore le lien entre la multiplication des polynômes, la convolution et le traitement du signal. Il commence par expliquer visuellement la multiplication des polynômes à l'aide de tableaux et de diagrammes, révélant sa nature fondamentale comme une opération de convolution. Puis, il introduit les signaux et les systèmes discrets, en se concentrant sur les systèmes linéaires invariants dans le temps (LIT). Il explique que tout signal peut être décomposé en une séquence de signaux d'impulsion mis à l'échelle et décalés, et que la réponse d'un système LIT peut être calculée à l'aide de la convolution. Enfin, il aborde brièvement les propriétés de la convolution et sa relation avec la transformée de Fourier, soulignant que la transformée de Fourier d'une convolution est égale au produit des transformées de Fourier de ses opérandes, permettant un calcul efficace de la convolution.

Lire plus
Développement polynômes

Filtres de Bloom : Une structure de données probabiliste pour l'appartenance efficace aux ensembles

2025-05-02

Les filtres de Bloom sont des structures de données probabilistes qui testent efficacement si un élément est membre d'un ensemble, en utilisant un espace minimal. En hachant les éléments à plusieurs emplacements dans un tableau de bits, les filtres de Bloom offrent des tests d'appartenance rapides, bien qu'avec une faible probabilité de faux positifs. Idéaux pour les scénarios où la plupart des requêtes renvoient un résultat négatif, les filtres de Bloom accélèrent considérablement les recherches. Cet article détaille les principes sous-jacents, l'implémentation (avec un exemple en Go), et la dérivation mathématique. Un exemple pratique montre le calcul des paramètres optimaux pour un ensemble d'un milliard d'éléments avec un taux de faux positifs de 1 %, soulignant leur efficacité dans le traitement de données à grande échelle.

Lire plus

Transformers efficaces : mélange d’experts à accès dispersé (MoE)

2025-04-20

Les couches d’alimentation directe dans les modèles Transformer sont généralement massives, ce qui crée un goulot d’étranglement en termes d’efficacité. Le mélange d’experts à accès dispersé (MoE) offre une solution élégante. MoE décompose la grande couche d’alimentation directe en plusieurs réseaux plus petits d’« experts » et utilise un routeur pour sélectionner le sous-ensemble optimal d’experts pour le calcul de chaque jeton, réduisant ainsi considérablement le coût de calcul et améliorant l’efficacité. Cet article détaille le fonctionnement de MoE, fournit une implémentation NumPy et examine des questions clés telles que l’équilibrage de la charge des experts.

Lire plus
Développement Efficacité du modèle

Entropie croisée : Plongez au cœur de la fonction de perte pour la classification

2025-04-13

Cet article explique clairement le rôle de l’entropie croisée en tant que fonction de perte dans les tâches de classification de l’apprentissage automatique. À partir de concepts de la théorie de l’information tels que le contenu informationnel et l’entropie, il aborde l’entropie croisée et la compare à la divergence KL. L’article conclut en démontrant la relation entre l’entropie croisée et l’estimation du maximum de vraisemblance à l’aide d’exemples numériques, ce qui clarifie son application dans l’apprentissage automatique.

Lire plus

Faire des Miracles avec Quatre 2 : Une Solution Élégante à une énigme Mathématique

2025-02-23

Une énigme mathématique apparemment simple : en utilisant seulement quatre 2 et n’importe quelle opération mathématique, générer n’importe quel nombre naturel. De l’arithmétique de l’école primaire aux mathématiques avancées de l’université, tout le monde peut participer. Initialement un défi apparemment simple, la difficulté augmente avec l’introduction d’exposants, de factorielles, etc. Finalement, le physicien Dirac, en utilisant des racines carrées imbriquées et des logarithmes, a trouvé une solution générale, résolvant élégamment ce problème séculaire, même avec seulement quatre 2.

Lire plus

Décorateurs JIT Python : trois stratégies d’implémentation

2025-02-03

Cet article explore le modèle populaire de décorateur JIT en Python, notamment son utilisation dans les bibliothèques JAX et Triton. L’auteur implémente trois décorateurs JIT à partir de zéro à l’aide d’un exemple simplifié : basé sur l’AST, basé sur le bytecode et basé sur le traçage. L’approche basée sur l’AST manipule directement l’arbre de syntaxe abstraite ; l’approche basée sur le bytecode utilise l’interpréteur de bytecode Python ; et l’approche basée sur le traçage construit un IR d’expression en traçant l’exécution de la fonction au moment de l’exécution. L’article détaille les avantages et les inconvénients de chaque approche et utilise JAX et Numba comme exemples pour illustrer leurs stratégies dans les applications du monde réel.

Lire plus
Développement

Implémentation de Raft : Plongez au cœur du consensus distribué

2024-12-21

Ceci est le premier article d'une série décrivant l'algorithme de consensus distribué Raft et son implémentation en Go. Raft résout le problème de la réplication d'une machine à états déterministes sur plusieurs serveurs, garantissant la disponibilité du service même en cas de panne de serveurs. L'article présente les composants principaux de Raft : la machine à états, le journal, le module de consensus, les rôles de leader/suiveur et l'interaction avec le client. Il aborde la tolérance aux pannes de Raft, le théorème CAP et le choix de Go comme langage d'implémentation. Les articles suivants approfondiront les détails de l'implémentation de l'algorithme.

Lire plus
Développement Consensus Distribué