
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.
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 } |
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 |
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 |
Source
uWaterloo
Votre opinion



Voir aussi

Vous avez lu gratuitement 9 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.