Fonctionnement ordinateur, comment le binaire est-il traduit ?

Résolu/Fermé
Hardware97 Messages postés 73 Date d'inscription mardi 5 novembre 2013 Statut Membre Dernière intervention 1 février 2019 - Modifié par Hardware97 le 3/01/2015 à 19:01
Hardware97 Messages postés 73 Date d'inscription mardi 5 novembre 2013 Statut Membre Dernière intervention 1 février 2019 - 4 janv. 2015 à 11:29
Bonjour à vous, je vais me lancer dans des études d'informatiques je connais déjà les bases de certains langages mais quelque chose me bloque : comment l'ordinateur fait-il fondamentalement pour traduire le code et, à la base, traduire la binaire en action réalisable ? C'est quelque chose que j'ai du mal à comprendre et je pense que si je comprenais la base fondamental des choses, je serais plus apte à programmer, j'ai l'impression que de ne pas savoir ça me bloque ...
Avez -vous une réponse claire à me proposé ?

Merci d'avance

3 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
3 janv. 2015 à 22:28
Bonjour,

Oui c'est ça, comme dit Alien41, tout est basé sur le stockage de l'information sous forme électrique. Du moins, parce que la technologie que nous utilisons aujourd'hui est ainsi faite, au sein d'un ordinateur tout est traité électriquement, absolument tout; Donc il y a deux états possible, chargé électriquement ou neutre, ce qui correspond donc à une information binaire;
à partir de cette fameuse charge, il est possible de faire des calculs avec des transistors connectés d'une certaine manière, dit en portes logiques. En simplifiant, un transistor va permettre de comparer deux entrées et de délivrer un résultat sur sa sortie, ce qui est une première base; Ensuite en associant plusieurs transistors, on en fait des portes logiques xor, and, not et or, qui une fois associées entre elles permettent de faire toutes les opérations de base.
Puis on les associe en cascade afin de traiter des "rampes" de valeur, ce qui permet de travailler avec des grandes valeurs sur 16, 32 ou 64 bits plus récemment. Les mêmes mécanismes à transistors sont à l'oeuvre pour sélectionner des colonnes et des lignes dans des matrices (de mémoire par exemple), extraire des valeurs à l'endroit voulu et mémoriser des résultats. Le processeur sait aussi faire des comparaisons entre les valeurs de manière à déterminer un comportement, ce qui permet de faire des sauts dépendants des résultats, et de faire des boucles.
Donc, on a une unité de calcul complète (plutôt sophistiquée) qui s'agite en centre névralgique au beau milieu de vastes zones mémoires, proches et moins proches. Le processeur communique avec l'ensemble des périphériques grâce à la multitude de contrôleur qui l'épaule, et ainsi envoie et récupère des valeurs auprès de la carte graphique, du disque dur, du clavier...

On devine relativement bien ces structures répétitives et enchevêtrées sur les vieux processeurs:



Ça c'est pour la partie matérielle, côté logiciel, au plus bas niveau on a le langage machine, dont est fait tout programme exécutable.
Le processeur est idiot et doit savoir quoi faire très précisément, et il n'y a donc rien de mystérieux là-dedans : Il équivaut au langage d'assemblage traduit en code électrique, c'est à dire binaire : En fait il faut dire au processeur «multiplie x par y», «met le résultat à telle adresse», «répète 1000 fois telle action».. autrement dit, il faut tout lui expliquer de a à z! Et pour lui chaque action à un numéro fixe, donc le langage machine est une liste de numéros d'actions, associés généralement à des valeurs utiles au calcul... et voilà ce qui constitue un programme exécutable!
Donc une fois chargé depuis le disque dur, le programme est en mémoire vive ainsi que les données qui lui sont utiles, et le processeur retient un pointeur sur la position du prochain code à exécuter, et c'est donc lui qui gère la vitesse à laquelle il lit ces codes, qu'il mâche les uns après les autres, juste le temps de les digérer un à un. Et donc ce code décrit tout ce que le processeur doit faire, les déplacements mémoire, les chargements depuis le disque dur, tous les calculs..
En pratique on utilise donc des langages de haut niveau qui mettent à disposition toute une bibliothèque de fonctions et autres structures d'aide à la programmation, tout comme font les systèmes d'exploitations.
Ainsi, on peut charger un fichier depuis le disque dur sans réécrire un driver de disque dur! Ouf! Et bien plus encore...
Donc lorsqu'on fait un programme et qu'on l'exécute, celui-ci est lu par le compilateur, transformé en une longue liste de codes machines correspondant, puis placé en mémoire. Il faut bien comprendre que le compilateur peut faire tout ça parce qu'il a la main, parce que son propre code est exécuté par le processeur...
Une fois le programme en mémoire, le compilateur n'a plus qu'à faire suivre l'exécution au niveau du premier code en mémoire, et le voilà qui cède la main, et le programme s'exécute!

Est-ce suffisamment clair?
7
joli Nico !

Imaginons un microprocesseur "maison" qui ne sache que faire des additions. Un microprocesseur ( en fait son jeu d'instruction ) comporte des Registres, des Flags, des Interruptions et des Pointeurs. Imaginons que nous souhaitons ajouter 2 à 3. ( instructions et données sur un octet soit 8 bits )

° chargeons 2 dans le registre A

Imaginons toujours que le "code" de 'opération de chargement du registre A soit 8 ( dec ) alors nous aurons cette operation

0000100000000010 qui est donc le codage binaire de l'assignation du registre A à la valeur 2 ( dec )

° chargeons 3 dans le registre B

Imaginons toujours que l'opération de chargement du registre B soit 9 ( dec ) alors nous aurons cette operation

0000100100000011

° appelons l'interruption 13 dec ( c'est un exemple ) qui ne sait faire qu'une seule chose ( ajouter le registre A et le B et le mettre dans le registre C avec un flag mis à 1 si dépassement de capacité par exemple )

00001101

° le registre C contiendra le resultat de l'operation.

a chaque top horloge, une instruction est effectuée, 8 bits sont lus ( il y a des instructions qui nécessitent plusieurs top ). Le pointeur se déplace. Voici ce que notre microprocesseur imaginaire lit dans un fhichier ( executable )

*****************************************

0000100000000010000010010000001100001101

le microprocesseur lit le premier octet 00001000, il sait que c'est l'opération qui charge le registre A et que l'octet suivant représente la valeur à assigner, le pointeur est incrémenté. Il lit l'octet suivant ( la donnée ) et le pointeur est incrémenté, il lit 00000011. Idem pour le registre B, le pointeur se déplace de deux "cases" à l'issue de l'opération, le microprocesseur lit ensuite l'octet suivant ( celui situé au "niveau du pointeur" ) il execute l'interruption 13, le pointeur se déplace d'une "case" ... notre registre C contient dès lors 5 ( 2 + 3 )

etc ...

ps -> les puristes m'excuseront, pas facile de rester compréhensible : )

ps² -> Certaines calculatrices utilisant la "notation Polonaise inversée" peuvent aider à comprendre. Ce sont des calculatrices qui n'ont pas de touche "=".

pour ajouter 2 à 3

appuyer sur la touche 2, placer cette valeur en haut de la pile ( je ne sais plus l'instruction, quelle touche ), puis appuyer sur la touche 3, la placer dans la pile. Appuyer sur la touche "+" qui additionne tous les éléments de la pile, votre calculatrice affiche 5 ... sans avoir appuyé sur la touche "="

: )

Cdt
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
3 janv. 2015 à 23:09
Bonsoir,

Ça c'est pour la partie matérielle, côté logiciel, au plus bas niveau on a le langage machine, dont est fait tout programme exécutable.


Pas tous les exécutables,pour les langages interprétés (.Net ou Java par exemple) l'exécutable est compilé dans un langage intermédiaire et un interprétateur sur l'ordinateur lit ce langage et le convertit en langage machine.
0