Le langage de programmation C3
(c3-lang.org)- 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
Resultet 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
deferprend en charge l’automatisation du nettoyage des ressources slicesetforeachpermettent une itération sûre- Les contracts basés sur des commentaires permettent d’exprimer les contraintes du code
- Le contexte
@poolprend 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
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...
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.
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...)
Avis sur Hacker News
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
La raison pour laquelle je n’arrive pas à abandonner complètement le C, c’est
cstringet les pointeurs non libérésCe 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 correctSi 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
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
Une grande équipe peut les imposer, tandis que des outils comme Visual Studio peuvent simplement émettre des avertissements et permettre un apprentissage progressif
Autrement dit, on peut les activer pendant le développement puis les désactiver en production pour éviter tout impact sur les performances
Les conditions devant absolument être vérifiées devraient être gérées directement dans le corps de la fonction
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ûrPersonnellement, la surcharge de fonctions, les paramètres par défaut et le retour de tuples me manquent
ResultouExpecteddans C3 me paraît confusCela devrait signifier « T ou E », et non « T ou vide », donc le nom semble mal choisi
Lien vers la documentation concernée
Option<T>niResult<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 intuitiveC’est une conception qui conserve le sens du C tout en réduisant la lourdeur des out params
Resulta déjà un sens courant de valeur de retour, ce qui peut prêter à confusionPlaylist YouTube
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
À la place, des fonctionnalités comme les macros et la réflexion ont été ajoutées
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
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
La barrière à l’entrée est assez basse pour qu’on puisse faire un prototype en une journée
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
Grâce à LLVM, il a pu créer lui-même un nouveau compilateur
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
Et le fait d’appeler les exceptions « Excuses » est assez mignon et bien trouvé
Le lien Discord dans la navigation renforce particulièrement cette impression