Une université canadienne propose C-for-All
Un projet open source d’extension du C ISO avec des fonctionnalités « modernes »
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.
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 - Visualiser dans une fenêtre à part
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 }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 - Visualiser dans une fenêtre à part
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 }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 - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 - Visualiser dans une fenêtre à part
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: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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Partager