1 pièce(s) jointe(s)
Une université canadienne propose C-for-All
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.
Code:
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:
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:
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:
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:
1 2 3 4 5 6 7 8 9
| choose ( ... ) {
case 3:
if ( ... ) {
... fallthru; // goto case 4
} else {
...
}
// implicit break
case 4: |
Code:
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:
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
:fleche: Que pensez-vous de C-for-All ?
:fleche: Quelles sont d’après vous les extensions qui sont les bienvenues ?
:fleche: Quelles sont celles qui n’ont aucun impact sur la productivité ? Pourquoi ?
Voir aussi
:fleche: Quel avenir pour le langage C ? Un développeur expérimenté fait ses adieux au langage et livre ses inquiétudes quant à son avenir