II.1.2 Caractéristiques techniques du langage C
Cette section présente les principales caractéristiques techniques du langage C, soulignant sa polyvalence, son efficacité, et son équilibre entre haut et bas niveau.
Le langage C, avec sa polyvalence éprouvée, a trouvé sa place dans divers domaines d'application comme la programmation système, le calcul numérique, l'infographie et la programmation embarquée, pour n'en citer que quelques-uns. Ses caractéristiques techniques distinctifs incluent :
Langage structuré : Le C promeut une organisation logique et hiérarchique du code. Il encourage l'utilisation de fonctions, de structures de données et de modules, rendant ainsi le code plus lisible, plus facile à comprendre et à maintenir.
Simplicité conceptuelle : Le C, malgré ses capacités avancées, se base sur des concepts fondamentaux assez restreints et clairs, facilitant son apprentissage.
Équilibre entre haut et bas niveau : Le langage C marie harmonieusement les constructions de haut niveau, tels que les contrôles de boucles et la prise de décision, avec les fonctionnalités de bas niveau comme la manipulation directe des octets et des adresses mémoire.
Compilation et performance : Les programmes en C sont compilés en langage machine, constitué d'instructions exécutables directement par l'ordinateur. Le C est conçu de telle sorte que chaque instruction du programme soit assez simple pour être traduite en un nombre restreint d'instructions machine, permettant ainsi un code à la fois performant et rapide.
int max(int i, int j) {
push ebp
01010101
if (i > j)
mov ebp,esp
01010111
return i;
mov eax,dword ptr [ebp+0x8]
10001100
else
cmp eax,dword ptr [ebp+0xc]
10111100
return j;
jle 0x11da <max+26>
11000101
}
mov eax,dword ptr [ebp+0x8]
10011010
Types de données primaires : Le C propose des types de données entiers et flottants qui correspondent exactement aux types de données que le processeur est capable de manipuler. Cette correspondance permet au C de fonctionner avec une grande efficacité, en utilisant directement les types de données propres au processeur sans nécessiter de conversions supplémentaires, souvent coûteuses en termes de performance.
L'un des éléments distinctifs du langage C est l'utilisation des pointeurs pour accéder et manipuler directement la mémoire de l'ordinateur. Cet accès direct à la mémoire permet d'éviter les surcoûts de traitement associés à des mécanismes de gestion de mémoire plus abstraits et optimise la performance des programmes.
Exemple de programme en C avec pointeur :
L'exemple ci-dessus en langage C utilise un pointeur pour passer l'adresse mémoire de number
à la fonction increment
. Ainsi, la fonction peut directement modifier la valeur de number
en mémoire sans nécessiter de copie supplémentaire. Cela permet d'économiser des ressources et d'améliorer les performances.
Exemple équivalent en Python :
En revanche, dans l'exemple ci-dessus, quant à lui en Python et sans pointeur, une copie de number
est effectuée lors du passage à la fonction increment
. La fonction travaille sur cette copie et renvoie le résultat incrémenté, puis la valeur est assignée à number
. Cette opération de copie peut être coûteuse en termes de performances et de consommation de mémoire, en particulier lorsque nous manipulons des structures de données plus complexes.
Le C est souvent le langage de choix pour les situations nécessitant une gestion optimale des ressources matérielles. Comparé au langage d'assemblage, le C offre une syntaxe plus expressive et la portabilité du code source, ce qui en fait une bonne alternative.
Néanmoins, en contrepartie, il est important de noter que le développement en C peut être plus complexe comparé à des langages de plus haut niveau, en particulier lors de l'utilisation de structures de données plus complexes. Le C exige une gestion manuelle de certaines tâches, comme la libération de la mémoire et la vérification de la validité des indices de tableau.
En outre, le C ne fournit pas d'opérations natives pour la manipulation d'objets composites tels que les listes ou les tableaux, ou pour des tâches courantes comme l'affichage à l'écran ou l'écriture dans un fichier. Ces fonctionnalités sont généralement apportées par des bibliothèques tierces, étendant ainsi les capacités du langage. Malgré cela, cette modularité donne aux développeurs la liberté de sélectionner les bibliothèques les plus adaptées à leurs besoins spécifiques.
Last updated
Was this helpful?