Utilité

Tags: Base

Le C (et le B et le BCPL avant lui) est initialement concu comme un langage pouvant aisément - c’est à dire avec un programme relativement simple et rapide à écrire - être traduit en langage assembleur, lui meme converti en code machine - la machine dont il est question étant ici le CPU (ou le procsseur) d’un ordinateur relativement puissant (ordinateur commercial de bureau). Ce processeur dispose d’une pile de valeurs (agencées en série et accessibles par un numéro qui est leur position dans cette pile) et de plusieurs registres - dont un qui sert à compter la taille actuellement occupée par la pile de valeurs du programme. Cette pile en outre de contenir le programme en cours d’exécution et ses valeurs de travail est generalement mappée à diférents composants de l’ordinateur ce qui permet au programme C par le biais du processeur de piloter les différents composants de la machine via des lectures et des écritures dans cette mémoire.

Un programme C manipule donc et directement le processeur en lui demandant d’effectuer des calculs arithmétiques et de manipuler les différents composants de l’ordinateur via des opérations de lecture et d’écriture dans une bande sérielle, elles mêmes pilotées par le processeur (et le programme qui s’y exécute).

Le programme qu’exécute le processeur se trouve dans la même bande sérielle que les autres composants de l’ordinateur et sa pile de travail. Cette architecture consistant à placer dans une même bande les instruction qu’exécutent le CPU et les données que le CPU peut adresser est traditionellement attribuée à Von Neumann.

Une machine avec laquelle le C travaille dispose donc de quelques registres (une dizaine généralement), dont un registre sert a compter la taille de la pile de variables, un autre registre sert à designer l’instruction suivante à exécuter dans cette pile, et la modification de ce registre d’adresse d’instruction suivante permet de sauter dans telle ou telle portion de code soit via un mécanisme d’appel de fonctions, soit d’instruction de saut, ou encore de structures de controle.

Outre les registres de pile et de controle, trois ou quatre registres servent à contenir les opérandes des divers calculs arithmétiques que le processeur doit effectuer.

Generalement un programme C est converti en code machine placé dans une bande sérielle et couplé à un processeur. Ce processeur dispose d’un registre d’adresse qui indique à quel endroit de la bande se trouve la prochaine instruction qu’il va exécuter. Chaque élément de la série constitue une instruction que le processeur execute. L’ensemble de ces instructions correspond à un programme. Les instructions consistent généralement à lire dans la memoire serielle à un endroit considéré comme sa propre pile interne de valeurs, à placer les valeurs qui s’y trouvent dans ses registres de calcul, à effectuer un calcul, puis placer le resultat si besoin où il le souhaite dans sa bande sérielle.

Différence avec un GPU

Un GPU contrairement à un CPU peut avoir plusieurs centaines de registres et aucune bande serielle, et aucun registre de pile ou de controle. Un registre de pile est inutile vu qu’il n’existe pas de pile.

Ne pas avoir de bande serielle signifie qu’il n’est pas possible de creer de tableaux ni de creer de pointeurs sur aucune variable, et par extension d’adresser une variable via un pointeur et un offset.

Un GPU travaille typiquement en parallèle, alors qu’un CPU travaille typiquement sur des lots de valeurs et a accès au lot entier, et accède à n’importe quelle valeur du lot via un mécanisme d’arithmétique de pointeurs.

Ne pas avoir de registre de controle signifie qu’un programme GPU ne peut executer d’autre instruction que la suivante, les fonctions recursives dans un programme GPU n’existent pas et une fonction dans un programme GPU sera toujours applatie (inlinée) et ne sert qu’à améliorer la lisibilité du code.

Ces spécificités soulignent à quel point le C est un langage taillé pour faire travailler un CPU couplé à une bande sérielle, et disposant de mécanismes de saut.

Cette bande en pratique doit être suffisament grande pour contenir plusieurs programmes - dont un qui sert d’ordonnanceur et appellé système d’exploitation et dont la tâche est de modifier le registre de saut pour le faire pointer sur d’autres programmes utiles situés en mémoire.

Ces sauts permettent à un seul processeur d’alterner entre plusieurs programmes placés en mémoire par un programme ordonnanceur, mais également de sauter au sein d’un même programme quand celui-ci ordonne des appels de fonction ou de structures de contrôle.

En somme le C sert de prime à écrire des sytèmes d’exploitation multi-tâches simili parallèles sur des ordinateurs sufisamment puissants pour être capables de donner l’impression que les tâches s’exécutent réelement en parallèle.