Une université canadienne propose C-for-All
Un projet open source d'extension du C ISO avec des fonctionnalités « modernes »

Le , par Patrick Ruiz, Chroniqueur Actualités
Qui pour assurer la succession du langage C ? La question revient constamment au sein des communautés de développeurs. Par le passé, des noms de candidats ont fait l’objet de fuites ; depuis 2009 on évoque Go, un langage de programmation développé par Google et inspiré de C et Pascal. Mozilla Research aussi œuvre dans le cadre de cette mouvance et, depuis 2006, propose Rust, un langage qui permet de faire la programmation sous plusieurs paradigmes. Cette liste s’allonge avec C-for-All, une initiative conjointe du géant chinois Huawei et de l’université de Waterloo au Canada.

Le langage C a encore de beaux jours devant lui. Référence faite à un sondage paru sur cette plateforme en janvier de cette année, quatre raisons permettent de soutenir cette affirmation. Primo, n’en déplaise à ses détracteurs, C est encore largement utilisé. Secundo, il sera toujours nécessaire d’être à même de faire « joujou » de façon aisée avec le hardware et pour des tâches de ce type, le langage C continue de faire partie des premiers choix. Tertio, le langage est reconnu pour l’efficacité de son code source. Enfin, le langage se prête bien aux tâches de développement d’applications multiplateformes, ce à quoi les férus font souvent référence en parlant de portabilité.

Le langage C dispose d’un atout supplémentaire dans sa manche : il continue d’évoluer. C++ est né en 1983 pour répondre à ce besoin et connait des mises à jour régulières : C++11, C++14 puis C++17, des révisions qui ont respectivement vu le jour en 2011, 2014 et 2017. Il faudra désormais compter avec C-for-All dont l’université de Waterloo a publié la liste des extensions qui en font un C ISO qui continuera de traverser les âges.


C-for-All propose la gestion des exceptions comme extension à l’ISO C. La fonctionnalité dérive d’une thèse de génie informatique de 2017.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
exception_t E {};                              // exception type
void f(...) {
	... throw E{}; ...                          // termination
	... throwResume E{}; ...             // resumption
}
try {
	f(...);
} catch( E e ; boolean-predicate ) {                    // termination handler
	// recover and continue
} catchResume( E e ; boolean-predicate ) {      // resumption handler
	// repair and return
} finally {
	// always executed
}
La surcharge de routines, d’opérateurs, de variables et de symboles est également à prendre en compte dans les extensions proposées par C-for-All. La fonctionnalité dérive des travaux d’une thèse de génie informatique de 1989.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// selection based on type and number of parameters
void f( void );                                // (1)
void f( char );                               // (2)
void f( int, double );                      // (3)
f();                                                // select (1)
f( 'a' );                                          // select (2)
f( 3, 5.2 );                                    // select (3)

// selection based on  type and number of returns
char f( int );                                  // (1)
double f( int );                              // (2)
[ int, double ] f( int );                    // (3)
char c = f( 3 );                              // select (1)
double d = f( 4 );                          // select (2)
[ int, double ] t = f( 5 );                 // select (3)
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
int ++?( int op );                            // unary prefix increment
int ?++( int op );                            // unary postfix increment
int ?+?( int op1, int op2 );             // binary plus
int ?<=?( int op1, int op2 );           // binary less than
int ?=?( int * op1, int op2 );           // binary assignment
int ?+=?( int * op1, int op2 );         // binary plus-assignment

struct S { int i, j; };
S ?+?( S op1, S op2 ) {                 // add two structures
	return (S){ op1.i + op2.i, op1.j + op2.j };
}
S s1 = { 1, 2 }, s2 = { 2, 3 }, s3;
s3 = s1 + s2;                                  // compute sum: s3 == { 2, 5 }
Code : Sélectionner tout
1
2
short int MAX = ...;   int MAX = ...;  double MAX = ...;
short int s = MAX;    int i = MAX;    double d = MAX;   // select MAX based on left-hand type
Cette liste d’extensions n’est pas exhaustive et intègre d’autres éléments dont on perçoit mal l’impact réel sur des problèmes auxquels les utilisateurs du langage C font face. Illustration avec les instructions fallthru et fallthrough qui, au regard du code, sont des équivalents de goto.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
choose ( ... ) {
  case 3:
	if ( ... ) {
		... fallthru;  // goto case 4
	} else {
		...
	}
	// implicit break
  case 4:
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
choose ( ... ) {
  case 3:
	... fallthrough common;
  case 4:
	... fallthrough common;
  common: // below fallthrough at case level
	...	 // common code for cases 3 and 4
	// implicit break
  case 4:
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
choose ( ... ) {
  case 3:
	choose ( ... ) {
	  case 4:
		for ( ... ) {
			... fallthru common; // multi-level transfer
		}
		...
	}
	...
  common: // below fallthrough at case-clause level
Quoi qu’il en soit, C-for-All fait bien partie du paysage des nombreux remplaçants ou extensions du langage C. En génie logiciel, chaque projet impose de porter son choix sur un langage particulier en raison de l’existence de fonctionnalités que d’autres n’offriront pas. À chacun donc de juger et d’intégrer ce dernier à son flux de travail en fonction de la pertinence.

Source

uWaterloo

Votre opinion

Que pensez-vous de C-for-All ?

Quelles sont d’après vous les extensions qui sont les bienvenues ?

Quelles sont celles qui n’ont aucun impact sur la productivité ? Pourquoi ?

Voir aussi

Quel avenir pour le langage C ? Un développeur expérimenté fait ses adieux au langage et livre ses inquiétudes quant à son avenir


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse Signaler un problème

Avatar de codec_abc codec_abc - Membre averti https://www.developpez.com
le 25/03/2018 à 12:37
Ajouter des exceptions au langage C sans RAII, quelle bonne idée! Bonjour les crashs ou memory/ressources leak a tout va. Et le C est un des rares langages qu'il faut faire évoluer doucement. Pour moi le C est destiné aujourd'hui a des secteurs bien spécifiques ou sa simplicité apparente a plus de valeurs que sa productivité assez faible (en comparaison avec des langages de plus haut niveau). Bref non merci, laissez le C tel qu'il est.
Avatar de Gugelhupf Gugelhupf - Modérateur https://www.developpez.com
le 25/03/2018 à 20:37
Je suis déçu des features proposés par C-for-All, je trouve les features d'import et de paradigme objet léger de C2 bien plus intéressants.
Avatar de koala01 koala01 - Expert éminent sénior https://www.developpez.com
le 26/03/2018 à 7:21
Salut,

Je crois que C doit, comme tout langage, évoluer ou risquer d'être de plus en plus "mis au rencart"...

Mais je crois aussi que nous aurions tout à perdre à essayer de le faire évoluer trop vite, car c'est aussi un langage qui n'a aucun précédent. Et pour cause: il est plus ou moins reconnu comme... le père (ou l'aïeul) de tous les autres.

De plus c'est aussi le langage (de troisième génération s'entend) qui propose à la base le niveau d'abstraction le plus bas: avec moins d'abstraction que C, on écrit en assembleur.

Et le fait est que l'on aura toujours besoin d'un langage à très faible niveau d'abstraction, ne serait-ce que parce que l'informatique est (très) loin de se limiter aux PC de plus en plus puissants, équipés de windows ou de linux!!! L'informatique, c'est aussi tout un tas de "micro puces" que l'on peut programmer dans "une certaine mesure", mais qui n'ont pas la joie d'être soutenue par un système d'exploitation digne de ce nom, ou qui n'ont pas l'occasion d'attendre qu'une machine virtuelle ait pris le relais.

Or, pour cette partie (certains parleront sans doute de niche) de l'informatique, sans le C (même si C++ peut -- dans une certaine mesure -- prendre le relais), on n'a plus rien, si ce n'est l'assembleur...

Alors, nous pourrions envisager que "quelqu'un" développe un langage avec des caractéristiques fort semblable au C, en évitant (si possible) certains de ses affres, et que ce "quelqu'un" en fasse dont à l'ANSI ou à l'ISO. Peut-on rêver, ce langage *** pourrait *** être considéré --y compris par les développeurs C les plus intransigeants -- comme le digne successeur de C.

A ceci près qu'il y a toute la base de code écrite en C qui est purement phénoménale, qu'il faudra sans doute encore maintenir pendant des années. Ce qui fait que, quel que soit la qualité de ce nouveau langage hypothétique, il risque malgré tout d'avoir du mal à se faire sa "place au soleil"
Avatar de Neckara Neckara - Expert éminent sénior https://www.developpez.com
le 26/03/2018 à 9:32
Attention aux &nbsp;

Sinon, je détestes cette manie de vouloir réinventer la roue en permanence. Avoir 36 000 langages de programmation ne sert à rien.
Pourquoi ne pas utiliser/partir de ce qui existe déjà ? Pourquoi ne pas utiliser directement C++ ?

C'est comme pour générer de la documentation en JavaScript, on a 50 alternatives pour le faire, alors que Doxygen est utilisé pour les autres langages et marche très bien (et mieux que ces alternatives), au pire créer un plugin pour mieux gérer cela.

C'est comme les entreprises qui veulent héberger elles-même leurs propres services pour des raisons de sécurité... qui refont leur propre trucs ou choisissent des services obsolètes qui ne seront au final pas utilisées...

On déjà suffisamment de langages :
  • Python
  • C++
  • LaTeX
  • CSS
  • JSON
  • XML


Rien qu'avec cela on pourrait couvrir 99,99% des usages.

Regardez-moi ça, je parie que vous n'en connaissez même pas la grande majorité, et que la grande majorité est juste inutile.
Avatar de archqt archqt - Membre actif https://www.developpez.com
le 26/03/2018 à 9:32
Bonjour,
autant faire du C++ qui donne du code aussi rapide et léger que du C. Il suffit pour s'en convaincre de regarder des vidéos de conférences comparant les 2.
Bonne fin de journée
Avatar de Uther Uther - Expert éminent https://www.developpez.com
le 26/03/2018 à 14:01
Citation Envoyé par Patrick Ruiz Voir le message
quatre raisons permettent de soutenir cette affirmation. Primo, n’en déplaise à ses détracteurs, C est encore largement utilisé. Secundo, il sera toujours nécessaire d’être à même de faire « joujou » de façon aisée avec le hardware et pour des tâches de ce type, le langage C continue de faire partie des premiers choix. Tertio, le langage est reconnu pour l’efficacité de son code source. Enfin, le langage se prête bien aux tâches de développement d’applications multiplateformes, ce à quoi les férus font souvent référence en parlant de portabilité.
- Primo, En effet C est largement utilisé un peu partout dans l'industrie pour tout ce qui est du bas niveau, et c'est une référence dans le domaine universitaire a cause d'UNIX. C'est sa principale qualité comme sont plus gros défaut : il est utilisé dans des domaines très conservateurs, ce qui explique qu'il peine tant a évoluer.

- Secundo et Tertio, Il est vrai que le C est très efficace et adapté au bas niveau, mais ça n'est pas le seul a pouvoir faire ça, il y en a d'autres qui sont tout autant capable comme le C++, le Nim ou le Rust par exemple.

- Enfin en ce qui concerne la portabilité, il faut reconnaitre qu'il existe un compilateur C pour quasiment toutes les architectures de processeur existantes, et que aucun langage ne peut prétendre en faire autant.
Mais si on regarde strictement du point de vue des spécificités du langage, le C est loin d'être ce qui ce fait de mieux. Sa norme est volontairement imprécise. Pour faire un programme C vraiment portable, il faut faire très attention a ce que l'on fait car beaucoup de chose vont réagir différemment en fonction de la plateforme. Si le C a pu être portable c'est surtout grâce a la norme POSIX et beaucoup d'huile de coude.

Citation Envoyé par Patrick Ruiz Voir le message
Cette liste d’extensions n’est pas exhaustive et intègre d’autres éléments dont on perçoit mal l’impact réel sur des problèmes auxquels les utilisateurs du langage C font face. Illustration avec les instructions fallthru et fallthrough qui, au regard du code, sont des équivalents de goto.
Je suppose que le but de "fallthru", comme pour les blocs avec label, c'est justement de pouvoir traiter le goto, qui est connu comme pouvant être abusé en C, comme une fonctionnalité déprécié. Du coup il faut remplacer les cas ou son usage se justifie encore par des syntaxes spécifiques.

Citation Envoyé par codec_abc Voir le message
Ajouter des exceptions au langage C sans RAII, quelle bonne idée!
L'article ne le précise pas, mais il y a aussi des constructeurs/destructeur, dont potentiellement moyen de faire de la RAII, avec ce langage.

Citation Envoyé par Gugelhupf Voir le message
Je suis déçu des features proposés par C-for-All, je trouve les features d'import et de paradigme objet léger de C2 bien plus intéressants.
Pour moi C2 était bâtard, il est certes plus propre au niveau de ce qu'il propose, mais ça se faisait au dépend de la compatibilité avec le C. Et quitte a avoir une syntaxe incompatible autant aller voir du coté de Rust ou Nim qui proposent bien plus qu'une petite amélioration du C.

Pour le coup C-for-All réussi a garder une meilleure compatibilité avec la syntaxe C actuelle que ce que proposait C2. Même si certains choix ne ne convainquent pas vraiment, surtout au niveau de la syntaxe (on sent la contrainte de l'héritage du C), il y a des fonctionnalité intéressantes.

Citation Envoyé par koala01 Voir le message
Or, pour cette partie (certains parleront sans doute de niche) de l'informatique, sans le C (même si C++ peut -- dans une certaine mesure -- prendre le relais), on n'a plus rien, si ce n'est l'assembleur...
Non, il y a d'autre langages qui sont tout a fait capable d'en faire autant comme le C++, Nim ou Rust par exemple.

Citation Envoyé par koala01 Voir le message
A ceci près qu'il y a toute la base de code écrite en C qui est purement phénoménale, qu'il faudra sans doute encore maintenir pendant des années. Ce qui fait que, quel que soit la qualité de ce nouveau langage hypothétique, il risque malgré tout d'avoir du mal à se faire sa "place au soleil"
C'est fou cette vision Highlander ("il ne peut en rester qu'un" des langages informatiques. A peu près tous les langages savent s'interfacer avec le C, particulièrement les langages bas niveau comme le C++/Nim/Rust. Il y a moyen d'introduire de nouveaux langages bas niveau sans avoir a tout réécrire.
Avatar de watchinofoye watchinofoye - Membre habitué https://www.developpez.com
le 26/03/2018 à 14:07
Après les hypothétiques remplaçants du C, l'hypothétique dénature du C (peut-être dans l'espoir d'éclipser le C pour mettre en avant un hypothétique remplaçant ?)...

"Leave C language alone "
Avatar de koala01 koala01 - Expert éminent sénior https://www.developpez.com
le 26/03/2018 à 14:13
Citation Envoyé par Neckara Voir le message

Regardez-moi ça, je parie que vous n'en connaissez même pas la grande majorité, et que la grande majorité est juste inutile.
Peut être, justement, parce que nous n'en connaissons pas la grande majorité...

Il se peut donc, effectivement, que certains (bon, peut-être seulement un ou deux, ce qui serait déjà énorme ) puissent prendre le relais du C...

Mais, à part C++ (qui peut s'approcher énormément des cas d'utilisation de C, mais qui a quand même aussi un bon nombre d’incompatibilités avec lui), aucun de ceux que tu as cités ne peut prendre la "niche" du C.

Et, quand bien même, on dirait "merde" à la compatibilité -- ce qui pourrait à la fois faire le plus grand bien et le plus grand mal -- si on n'arrive pas avec un dossier béton qui démontre que l'on a pu faire avec un langage tout ce que C permet de faire, sans sacrifier les performances (car avec de meilleures, ca risque d'être dur ) mais avec moins de risques d'erreurs, moins de chausses trappes à gauche et à droite et (sans doute surtout) sans *** trop *** bousculer les habitudes des développeurs, j'ai bien peur que la sauce ne prenne jamais
Avatar de Aiekick Aiekick - Membre chevronné https://www.developpez.com
le 26/03/2018 à 14:16
Citation Envoyé par Neckara Voir le message
Attention aux &nbsp;

Sinon, je détestes cette manie de vouloir réinventer la roue en permanence. Avoir 36 000 langages de programmation ne sert à rien.
Pourquoi ne pas utiliser/partir de ce qui existe déjà ? Pourquoi ne pas utiliser directement C++ ?

C'est comme pour générer de la documentation en JavaScript, on a 50 alternatives pour le faire, alors que Doxygen est utilisé pour les autres langages et marche très bien (et mieux que ces alternatives), au pire créer un plugin pour mieux gérer cela.

C'est comme les entreprises qui veulent héberger elles-même leurs propres services pour des raisons de sécurité... qui refont leur propre trucs ou choisissent des services obsolètes qui ne seront au final pas utilisées...

On déjà suffisamment de langages :
  • Python
  • C++
  • LaTeX
  • CSS
  • JSON
  • XML


Rien qu'avec cela on pourrait couvrir 99,99% des usages.

Regardez-moi ça, je parie que vous n'en connaissez même pas la grande majorité, et que la grande majorité est juste inutile.
Python, c++ ok
Latex, je sais pas
mais css ? un simple langage descriptif rien a voir avec de la programmation
Json, une simple structure de donnée
Xml langage descriptif, comme le html, plus une structure de donné qu'un langage de programmation.

rien a voir avec le c donc... mais je suppose que c'est voulu ?
Avatar de Pyramidev Pyramidev - Membre expert https://www.developpez.com
le 26/03/2018 à 14:20
Citation Envoyé par Neckara Voir le message
Sinon, je détestes cette manie de vouloir réinventer la roue en permanence. Avoir 36 000 langages de programmation ne sert à rien.
Pourquoi ne pas utiliser/partir de ce qui existe déjà ? Pourquoi ne pas utiliser directement C++ ?

[...]

On déjà suffisamment de langages :
  • Python
  • C++
  • LaTeX
  • CSS
  • JSON
  • XML


Rien qu'avec cela on pourrait couvrir 99,99% des usages.
Je suis d'accord pour dire qu'il y a trop de langages, mais ta liste est trop restreinte :
  • Python est accessible aux débutants et permet d'écrire du code concis, mais n'est pas performant. Cela conduit des chercheurs à coder deux fois la même chose : un prototype en Python puis un programme dans un langage plus performant, comme C++. On a donc besoin d'un langage avec les principaux avantages du Python, mais plus performant. Peut-être Julia.
  • C++ est riche et performant. Mais, même avec une telle richesse, il est plus compliqué qu'il ne devrait et contient plus de pièges qu'il ne devrait. En outre, il est lent à compiler, surtout s'il y a trop de code dans les fichiers d'entête, ce qui restreint l'utilisation des templates dans un gros projet. On a donc besoin d'un meilleur C++, beaucoup plus rapide à compiler, plus simple à apprendre et, tant qu'à faire, encore plus riche. Peut-être le langage D. D'ailleurs, je me demande si ce dernier peut aussi remplacer Julia.
  • Dans ta liste, je ne vois pas de langage qui supporte vraiment le paradigme fonctionnel comme Haskell. L'inconvénient de ce paradigme est qu'il est plus difficile à apprendre que la programmation orientée objet. Mais l'avantage est qu'il permet d'écrire du code beaucoup plus modulaire.


De manière générale, les langages au sommet du classement TIOBE ne sont pas assez bons. On a besoin de mieux.

Cela dit, les concepteurs de nouveaux langages ne devraient pas se contenter d'essayer de faire mieux que les langages au sommet du classement TIOBE. Ils devraient aussi, s'ils y arrivent, essayer de faire mieux que les langages moins connus qui ont du mal à s'imposer. Sinon, on augmente la liste des langages inutiles. Or, je pense que le C-for-All s'ajoute à cette liste.
Contacter le responsable de la rubrique Accueil