19 points par GN⁺ 2026-01-04 | 4 commentaires | Partager sur WhatsApp
  • Un langage évolutif qui hérite de la syntaxe et de la sémantique du C tout en renforçant la sécurité et l’ergonomie, afin de conserver un environnement familier pour les développeurs C existants
  • Compatibilité complète avec l’ABI C, ce qui permet une intégration immédiate dans des projets C/C++ ; une partie du code de vkQuake a déjà été convertie en C3 et compilée avec le compilateur c3c
  • Système de modules, surcharge d’opérateurs, macros à la compilation, etc., pour améliorer la structure du code et sa capacité d’expression
  • Inclut des fonctionnalités modernes comme la programmation par contrat (Gradual Contracts), la gestion des erreurs sans surcoût, ainsi que la réflexion à l’exécution et à la compilation
  • En mode debug, fournit automatiquement des vérifications de sécurité et des traces de pile détaillées, utiles pour détecter les bugs et renforcer la stabilité

Aperçu de C3

  • C3 est un langage de programmation développé à partir de la syntaxe et de la sémantique du langage C
    • Son objectif est de faire évoluer le langage tout en conservant une forme familière pour les programmeurs C existants
  • Prend en charge une surcharge d’opérateurs précise et orientée objectif
    • Sans la complexité de la surcharge en C++, il permet d’exprimer naturellement les vecteurs, matrices et calculs en virgule fixe
  • Prend en charge la programmation par contrat, ce qui permet d’exprimer des contraintes à l’exécution comme à la compilation
    • Renforce la stabilité du code et la cohérence des spécifications
  • Combine les avantages de la gestion des erreurs basée sur Result et des exceptions
    • Fournit une structure de gestion des erreurs qui s’intègre naturellement au code C
  • Prend en charge l’introspection de types aussi bien à la compilation qu’à l’exécution
  • Assembleur inline : il est possible d’écrire de l’assembleur comme du code ordinaire, sans chaînes ni contraintes complexes
  • En mode debug, le runtime insère automatiquement des vérifications de limites (bound checks) et des vérifications de valeurs (value checks)
  • La bibliothèque standard de C3 fournit par défaut des traces de pile détaillées dans les builds de debug
    • Elle permet d’identifier l’emplacement précis d’une erreur au lieu d’un simple « segmentation fault »

Ergonomics and Safety

  • Les Optionals apportent une gestion sûre des erreurs et des valeurs nulles
  • La syntaxe defer prend en charge l’automatisation du nettoyage des ressources
  • slices et foreach permettent une itération sûre
  • Les contracts basés sur des commentaires permettent d’exprimer les contraintes du code
  • Le contexte @pool prend en charge la libération automatique de la mémoire

Performance by default

  • Il est possible d’écrire directement des vecteurs SIMD pour un contrôle au niveau matériel
  • Le choix entre différents allocateurs mémoire permet un ajustement fin des performances
  • La gestion des erreurs adopte une conception sans surcoût
  • Bénéficie de temps de compilation rapides et des optimisations du backend LLVM
  • Fournit un assembleur inline facile à utiliser

Batteries included standard library

  • Fournit des structures de données standard, y compris des conteneurs dynamiques et des chaînes
  • Garantit la portabilité entre plateformes grâce à des abstractions multiplateformes
  • Autorise l’accès natif à la plateforme lorsque nécessaire

Leverage existing C or C++ libraries

  • C3 est entièrement compatible avec l’ABI C, sans besoin de types « compatibles C » ou de déclarations de fonctions séparées
  • Le code C peut être lié depuis C3, et le code C3 peut aussi être lié depuis C

Modules are simple

  • Système de modules simple et intuitif
    • Les réglages par défaut sont raisonnables et n’entravent pas le flux de développement
  • Fournit une gestion des espaces de noms via les modules
  • Une commande explicite permet de simplifier la structure d’encapsulation
  • Les interfaces permettent de définir des comportements partagés
  • Fournit des generic modules qui permettent d’implémenter de manière simple et claire la création de types génériques
  • Prend en charge la réutilisation de structures via le sous-typage de structures

Macros without a PhD

  • Les macros à la compilation peuvent être écrites sous une forme proche de fonctions ordinaires
  • Prend en charge des macros conscientes des types qui comprennent les informations de type du code
  • Offre une génération de code plus claire et plus puissante que le préprocesseur du C

4 commentaires

 
kayws426 2026-01-06

Il en sort de toutes sortes. LONGUE VIE AU C-LANG !!!
Mais si un C4 sortait plus tard, aurait-il alors une popularité littéralement explosive...

 
bus710 2026-01-05

Comme Zig apporte des breaking changes chaque année, même si le langage me plaît, je n’ai plus vraiment envie de m’y investir désormais.
À l’inverse, en voyant la présentation de C3, j’ai l’impression que l’ensemble a un côté C + Go, donc que c’est facile à lire et à écrire, avec sans doute bien moins de stress lié aux montées de version.

 
mhcoma 2026-01-05

Je fais aussi un petit don... Je l’utilise en ce moment et c’est assez sympa.
J’aime bien l’impression qu’il cherche seulement à corriger les points pénibles de C.
La documentation officielle manque encore un peu de maturité
(il arrive souvent que, pour trouver des infos sur telle ou telle fonctionnalité, elles soient décrites dans des endroits totalement inattendus...)

 
GN⁺ 2026-01-04
Avis sur Hacker News
  • J’aime la sobriété de la philosophie de conception de C3
    Il n’impose pas de nouveau modèle mémoire et n’essaie pas non plus de devenir du C++
    Surtout, grâce à sa compatibilité ABI complète, on peut mélanger directement des fichiers C3 dans un système de build C existant sans avoir à écrire de bindings
    J’applaudis la vision de son mainteneur, qui cherche l’évolution plutôt que la révolution
    C’est une langue que je recommanderais d’apprendre le temps d’un week-end. Plus moderne que le C99, mais avec une sensation familière
    • Je me demande s’il est possible d’écrire une bibliothèque en C3 pour exporter des symboles utilisables depuis des bindings
      La raison pour laquelle je n’arrive pas à abandonner complètement le C, c’est cstring et les pointeurs non libérés
    • Je me demande si la compatibilité ABI complète est vraiment si importante
      Ce n’est pas tant le C lui-même qui est dangereux que ses implémentations et son ABI
      Avec des fat pointers, une amélioration des varargs, UBSan, MTE, etc., cela devient tout à fait correct
  • En lisant la section Contracts de la documentation officielle de C3, une question m’est venue
    Si le compilateur n’est pas obligé de vérifier les contrats, et qu’en cas de violation cela peut devenir un comportement indéfini, je ne vois pas bien comment on est censé faire confiance à cela
    C’est une fonctionnalité élégante, mais elle semble un peu risquée
    • Un contrat est un invariant qui exprime une « condition devant toujours être vraie »
      On peut l’ignorer, le vérifier à l’exécution, ou supposer qu’il est toujours vrai pour s’en servir dans les optimisations
      Par exemple, on peut vérifier la validité d’un pointeur, mais traiter une contrainte comme « l’entrée doit être impaire » comme une hypothèse
    • Les contrats servent à exprimer l’intention de manière standardisée
      Une grande équipe peut les imposer, tandis que des outils comme Visual Studio peuvent simplement émettre des avertissements et permettre un apprentissage progressif
    • Les trois phrases de la documentation veulent dire respectivement
      1. le compilateur n’est pas obligé d’utiliser les contrats
      2. en cas de violation, cela peut devenir un comportement indéfini
      3. en mode sûr, ils sont vérifiés via des assertions à l’exécution
        Autrement dit, on peut les activer pendant le développement puis les désactiver en production pour éviter tout impact sur les performances
    • En fin de compte, cela permet d’exprimer explicitement dans le code les optimisations fondées sur des hypothèses que les compilateurs font déjà
    • Je comprends les contrats comme des contraintes souples exprimant des « conditions presque jamais atteintes »
      Les conditions devant absolument être vérifiées devraient être gérées directement dans le corps de la fonction
  • Le dépôt GitHub de C3 contient plus de détails
    Parmi les différences avec le C, on trouve l’absence de fichiers d’en-tête, des espaces de noms basés sur les modules, des slices, la surcharge d’opérateurs, des modules génériques, une gestion des erreurs basée sur Result, ainsi que des vérifications à l’exécution en mode sûr
    • Les fonctionnalités sont bonnes, mais l’ensemble me semble un peu déséquilibré
      Personnellement, la surcharge de fonctions, les paramètres par défaut et le retour de tuples me manquent
  • Le fait d’appeler Optional ce qui ressemble à Result ou Expected dans C3 me paraît confus
    Cela devrait signifier « T ou E », et non « T ou vide », donc le nom semble mal choisi
    Lien vers la documentation concernée
    • L’Optional de C3 n’est ni Option<T> ni Result<T, E>
      Le type d’erreur est limité à un seul code entier, ce qui correspond bien à la philosophie « évolution, pas révolution »
      La syntaxe type? est aussi intuitive
    • Le mot « Optional » n’est pas utilisé directement dans le code
      C’est une conception qui conserve le sens du C tout en réduisant la lourdeur des out params
    • Je n’aime pas trop le fait de renommer arbitrairement les concepts, mais si l’on ne prend en charge qu’un seul des deux, Optional est le nom le plus clair
      Result a déjà un sens courant de valeur de retour, ce qui peut prêter à confusion
    • Malgré tout, « Option » ou « Maybe » ont un autre sens, donc je pense que « Result » ou « Either » seraient plus appropriés
  • Tsoding a fait plus de 30 heures de livestream en C3
    Playlist YouTube
  • J’ai déjà échangé avec les développeurs de C3, Odin et Zig
    J’ai été impressionné par le fait que ces trois langages, plutôt que de se concurrencer, sont dans une relation où ils partagent leurs compromis et apprennent les uns des autres
    • Je me demande quel langage est le plus raisonnable pour l’embarqué
    • On dit « ce n’est pas de la concurrence, c’est de l’apprentissage », mais je me demande si ce n’est pas au fond une concurrence formulée poliment
  • En parcourant la documentation, deux points ont répondu à mes questions
    1. il est basé sur LLVM, donc très portable
    2. les tagged enums ne sont pas pris en charge
      À la place, des fonctionnalités comme les macros et la réflexion ont été ajoutées
    • Je pense que les tagged unions sont inefficaces dans un langage système
      Elles occupent autant de mémoire que le plus grand type, et déplacent le flux vers une vérification dynamique du type, ce qui fait perdre les avantages d’un langage à typage statique
      À mon avis, il vaut mieux les implémenter soi-même quand on en a besoin
  • Je me demande à partir de quand créer un nouveau langage devient réellement pertinent
    J’ai moi-même implémenté des génériques, des slices et de la propagation d’erreurs en C, mais fabriquer un compilateur est bien trop complexe
    C’est pourquoi j’alterne entre une variante de C et Go
    • Grâce à LLVM, créer un langage de la famille des « better C » est plus facile qu’on ne l’imagine
      La barrière à l’entrée est assez basse pour qu’on puisse faire un prototype en une journée
    • Créer un langage en vaut toujours la peine
      C’est la seule façon de rendre un nouveau paradigme réel
      Un langage doit tout coordonner — syntaxe, bibliothèque standard, tooling, runtime — donc c’est difficile, mais c’est aussi pour cela que son influence sur l’avenir est si grande
    • C3 est un projet que Christoffer, qui contribuait à l’origine à C2, a démarré indépendamment parce qu’il frustrait de la lenteur du développement
      Grâce à LLVM, il a pu créer lui-même un nouveau compilateur
    • La valeur d’un langage réside dans la compréhension partagée qu’il permet de créer entre les gens
      Une variante de C utilisée seul peut suffire, mais dès qu’on collabore avec d’autres ou qu’on veut utiliser des bibliothèques externes, il faut un langage commun
  • Au départ, je pensais que ce serait un langage simple, mais j’ai été surpris par sa liste de fonctionnalités étonnamment riche
    Et le fait d’appeler les exceptions « Excuses » est assez mignon et bien trouvé
  • Ce genre de site web est exactement, à mes yeux, ce que devrait être un site de langage de programmation
    • À l’inverse, j’ai trouvé le design puéril et amateur
      Le lien Discord dans la navigation renforce particulièrement cette impression